Javamail - 如何处理大型附件?

时间:2013-02-12 13:15:28

标签: smtp imap javamail attachment large-files

over 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 个答案:

答案 0 :(得分:2)

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

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

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

但也许你应该质疑你是否真的想要一个字符串中的20MB附件。一旦你拥有它,你打算用它做什么?