Javamail appendMessages 抛出 IOException 无内容

Javamail appendMessages throws IOException No Content

我正在尝试将邮件从一个 IMAP 存储复制到另一个。

执行实际复制的代码行是:

folder.appendMessages(new Message[] { m });

大多数邮件复制没有问题,但有些邮件复制失败:

javax.mail.MessagingException: IOException while appending messages;
  nested exception is:
    java.io.IOException: No content

堆栈跟踪指向 IMAPFolder.java:1767

在我的测试用例中,有的复制成功的消息有6MB那么大,有的复制失败的消息只有16KB,所以不是大小问题。

我不确定,但失败的邮件可能有附件。在失败的邮件组和成功的邮件组中都找到了内容类型 multipart/ALTERNATIVE

在 Thunderbird 等邮件客户端中打开失败的邮件可以正常工作,因此邮件没有损坏。

更新:

mail.imap.fetchsize对这个问题起到了作用。当它是默认值 16,384b 时,运行 在 1000 条消息的样本中,最小的失败消息是 16,432b -- 略微超过 fetchsize。

当我将它增加到 65,536b 时——同一个样本的最小失败消息是 65,787b——再次略微超过 fetchsize。

大小为 16,432b 的消息在使用默认提取大小时始终失败,但使用更高的提取大小成功复制,所以这绝对是一个问题。


知道导致此问题的原因吗?

遇到这个问题如何复制消息?

TIA!

p.s。我正在使用 Java 1.7u71 和 Javamail 1.5.2

根据我们的离线讨论,将 mail.imap.partialfetch 属性 设置为 false 会使其起作用。发生这种情况时,几乎总是因为服务器以某种方式损坏。

另请参阅:

Javamail Notes "A list of the known limitations, bugs, issues" 第 4 和 5 节下。

Javamail FAQ, Fetch

此错误已在 Java Mail 1.6

中修复

https://javaee.github.io/javamail/