Javamail - 如何处理大附件?

Posted

技术标签:

【中文标题】Javamail - 如何处理大附件?【英文标题】:Javamail - How to handle large attachments? 【发布时间】:2013-01-27 19:27:45 【问题描述】:

在 imap 上,我试图从多条消息中获取附件。 它工作正常,但如果有一个大约 20 兆字节的附件,那么它似乎卡住了,java 没有继续。

这里是问题发生的地方: 我想获取附件的内容并将其保存到字符串中:

...
MimeBodyPart attachment = (MimeBodyPart) multipart.getBodyPart(1);  
if(!Part.ATTACHMENT.equalsIgnoreCase(attachment.getDisposition())) 
    log.error("Part is not an attachment!");
 else 
    log.debug("Checking " + localFile.getName() + " with " + attachment.getFileName() + ". Attachment-Size: " + (attachment.getSize()/(1024*1024)) + " mega-bytes.");
    InputStream remoteFileIs = attachment.getInputStream();
    remoteFileContent = IOUtils.toString(remoteFileIs);  //stucked here, when attachment is large
    remoteFileIs.close();
    ...

...

有解决办法吗?

问候!

【问题讨论】:

【参考方案1】:

IOUtils.toString 有什么作用?由于您只是给它一个 InputStream,没有字符集信息,因此它不可能正确地将字节流转换为字符。无论它在做什么,它都可能对大数据效率低下。

您可以在JavaMail Session debugging and see the protocol trace 获取附件时打开它,以确定它是真的“卡住”还是慢了。

您还可以通过设置mail.imap.fetchsize property 来控制从 IMAP 服务器提取的缓冲区大小。

但也许您应该质疑您是否真的想要一个 20MB 的字符串附件。拥有该字符串后,您将如何处理它?

【讨论】:

现在可以使用了。我将获取设置为 props.put("mail.imaps.fetchsize","22020096");这是21MB。那样可以么? fetch-size 过大有什么不好的地方吗? 您将使用更多内存,并且您必须等待整个部分下载后才能处理它。但是,您对 IOUtils.toString 的使用也是如此。 @Dave 您不需要获取大小与附件一样大。它应该是一个合理的“块”,设置一个可以在短时间内下载的目标大小。我建议小于 2mb。

以上是关于Javamail - 如何处理大附件?的主要内容,如果未能解决你的问题,请参考以下文章

javamail异常

Mandrill 在测试模式下如何处理附件?

Excel 通过 Outlook 发送电子邮件时如何处理错误?

Javamail 中的线程安全

javamail 错误,加上send就出错,求助

Java 中的 IMAP 客户端:JavaMail API 还是 Apache Commons Net?