Mime4j:DefaultMessageBuilder无法解析mbox内容

时间:2014-11-29 11:14:15

标签: java apache parsing mbox mime4j

我已从mime4j下载了subversion 0.8.0快照,并使用maven构建了该快照。 我生成的相关罐子可以找到here

现在我尝试从mime4j测试中解析a toy mbox file

我使用此sample code。简言之:

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 To:null

     

消息null发送者:null To:null

     

消息null发送者:null To:null

     

消息null发送者:null To:null

     

消息null发送者:null To:null

     

找到5条消息

确实有5条消息,但为什么所有字段都为空?

3 个答案:

答案 0 :(得分:3)

根据@zvisofer的回答,我在BufferedLineReaderInputStream中找到了guilty piece of code

@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文件:)

答案 1 :(得分:2)

我发现了问题。

DefaultMessageBuilder无法解析具有Windows行分隔符\r\n的mbox文件。 使用UNIX行分隔符\n替换它们时,解析可以正常工作。

这是一个关键问题,因为从Gmail下载的mbox文件使用\r\n

答案 2 :(得分:1)

我下载了您的jar文件,您指向的示例代码,以及您指向的示例mbox文件,编译了示例(没有更改)并针对示例mbox文件运行它。

它按预期工作(字段包含预期数据,而不是空值)。 这是在Mac上使用Java 1.6_0_65,也是使用1.8.0_11

输出如下:

  

$ 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 milis