Smtp Javamail-如何处理大型附件?

Smtp Javamail-如何处理大型附件?,smtp,imap,jakarta-mail,attachment,large-files,Smtp,Imap,Jakarta Mail,Attachment,Large Files,通过imap,我试图从多封邮件中获取附件。 它工作得很好,但是如果有一个大约20兆字节的附件,那么它似乎被卡住了,java就不能继续了 以下是出现问题的地方: 我想获取附件的内容并将其保存为字符串: ... MimeBodyPart attachment = (MimeBodyPart) multipart.getBodyPart(1); if(!Part.ATTACHMENT.equalsIgnoreCase(attachment.getDisposition())) { log.

通过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();
    ...
}
...
有什么解决办法吗


问候

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

您可以在提取附件时打开它,以确定它是真的“卡住”了还是太慢了

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


但也许你应该质疑你是否真的想要一个20MB的字符串附件。一旦你有了那根绳子,你打算怎么处理它?

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