5

mime4jから 0.8.0 スナップショットをダウンロードしsubversionてビルドしましたmaven。私が生成した関連する jar は、ここにあります。

ここで、テストからおもちゃの mbox ファイルを解析しようとしますmime4j

このサンプル コードを使用します。簡単に言うと:

final File mbox = new File("c:\\mbox.rlug");
int count = 0;
for (CharBufferWrapper message : MboxIterator.fromFile(mbox).charset(ENCODER.charset()).build()) {
    System.out.println(messageSummary(message.asInputStream(ENCODER.charset())));
    count++;
}
System.out.println("Found " + count + " messages");

+

private static String messageSummary(InputStream messageBytes) throws IOException, MimeException {
    MessageBuilder builder = new DefaultMessageBuilder();
    Message message = builder.parseMessage(messageBytes);
    return String.format("\nMessage %s \n" +
            "Sent by:\t%s\n" +
            "To:\t%s\n",
            message.getSubject(),
            message.getSender(),
            message.getTo());
}

出力は次のとおりです。

メッセージ null 送信者: null 宛先: null

メッセージ null 送信者: null 宛先: null

メッセージ null 送信者: null 宛先: null

メッセージ null 送信者: null 宛先: null

メッセージ null 送信者: null 宛先: null

5 件のメッセージが見つかりました

確かに 5 つのメッセージがありますが、なぜすべてのフィールドが null なのですか?

4

3 に答える 3

3

@zvisoferの回答に基づいて、有罪のコードを見つけましたBufferedLineReaderInputStream

@Override
public int readLine(final ByteArrayBuffer dst)
        throws MaxLineLimitException, IOException {
    if (dst == null) {
        throw new IllegalArgumentException("Buffer may not be null");
    }
    if (!readAllowed()) return -1;

    int total = 0;
    boolean found = false;
    int bytesRead = 0;
    while (!found) {
        if (!hasBufferedData()) {
            bytesRead = fillBuffer();
            if (bytesRead == -1) {
                break;
            }
        }
        int i = indexOf((byte)'\n');
        int chunk;
        if (i != -1) {
            found = true;
            chunk = i + 1 - pos();
        } else {
            chunk = length();
        }
        if (chunk > 0) {
            dst.append(buf(), pos(), chunk);
            skip(chunk);
            total += chunk;
        }
        if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) {
            throw new MaxLineLimitException("Maximum line length limit exceeded");
        }
    }
    if (total == 0 && bytesRead == -1) {
        return -1;
    } else {
        return total;
    }
}

最善の方法はバグを報告することですが、ここに修正があります。少し汚れていますが、正常に動作しています

org.apache.james.mime4j.io.BufferedLineReaderInputStreamプロジェクトにクラスを作成する

public int readLine(final ByteArrayBuffer dst)メソッドを次のように置き換えます。

@Override
public int readLine(final ByteArrayBuffer dst)
        throws MaxLineLimitException, IOException {
    if (dst == null) {
        throw new IllegalArgumentException("Buffer may not be null");
    }
    if (!readAllowed()) return -1;

    int total = 0;
    boolean found = false;
    int bytesRead = 0;
    while (!found) {
        if (!hasBufferedData()) {
            bytesRead = fillBuffer();
            if (bytesRead == -1) {
                break;
            }
        }

        int chunk;
        int i = indexOf((byte)'\r');
        if (i != -1) {
            found = true;
            chunk = i + 2 - pos();
        } else {
            i = indexOf((byte)'\n');
            if (i != -1) {
                found = true;
                chunk = i + 1 - pos();
            } else {
                chunk = length();
            }
        }
        if (chunk > 0) {
            dst.append(buf(), pos(), chunk);
            skip(chunk);
            total += chunk;
        }
        if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) {
            throw new MaxLineLimitException("Maximum line length limit exceeded");
        }
    }
    if (total == 0 && bytesRead == -1) {
        return -1;
    } else {
        return total;
    }
}

unix ファイルと dos ファイルの両方をお楽しみください :)

于 2014-12-03T12:09:53.843 に答える
2

問題が見つかりました。

DefaultMessageBuilderWindows の行区切り文字を含む mbox ファイルの解析に失敗します\r\n。それらをUNIXの行区切り記号に置き換えると\n、解析が機能します。

からダウンロードされた mbox ファイルがGmail使用されているため、これは重大な問題\r\nです。

于 2014-12-02T13:40:35.137 に答える
1

jar ファイル、指摘されたサンプル コード、および指摘されたサンプル mbox ファイルをダウンロードし、サンプルを (変更なしで) コンパイルし、サンプル mbox ファイルに対して実行しました。

期待どおりに機能しました (フィールドには null ではなく、期待されるデータが含まれていました)。これは、Java 1.6_0_65 と 1.8.0_11 を搭載した Mac でした。

出力は次のとおりです。

$ java -cp .:apache-mime4j-core-0.8.0-SNAPSHOT.jar:apache-mime4j-dom-0.8.0-SNAPSHOT.jar:apache-mime4j-mbox-iterator-0.8.0-SNAPSHOT.jar IterateOverMbox mbox.rlug.txt

メッセージ Din windows ma pot, din LINUX NU ma pot conecta (la ZAPP) 送信者: rlug-bounce@lug.ro 宛先: [rlug@lug.ro]

メッセージ Re: RH 8.0 ブート フロッピー 送信者: rlug-bounce@lug.ro 宛先: [rlug@lug.ro]

メッセージ Qmail mysql virtualusers +ssl + smtp auth +pop3 送信者: rlug-bounce@lug.ro 宛先: [rlug@lug.ro]

メッセージ Re: Din windows ma pot, din LINUX NU ma pot conecta (la ZAPP) 送信者: rlug-bounce@lug.ro 宛先: [rlug@lug.ro]

メッセージ LSTP 問題 - 解決済み 送信者: rlug-bounce@lug.ro 宛先: [rlug@lug.ro]

5 件のメッセージが見つかりました: 108 ミリ秒で完了

于 2014-12-01T14:04:22.443 に答える