在base64中的javamail中附加大文件

时间:2016-07-12 07:02:57

标签: java io javamail

目前我在邮件中附加文件(小)如下:

byte[] byteArray = IOUtils.toByteArray(new FileInputStream(file)); 

MimeBodyPart messageBodyPart = new PreencodedMimeBodyPart("base64");
String contentType = "application/octet-stream";
String base64Content = new String(Base64.encodeBase64(byteArray));

messageBodyPart.setContent(base64Content, contentType);       
messageBodyPart.setFileName(MimeUtility.encodeText(attachment.getFileName(),
                                            CharEncoding.UTF_8, null));
messageBodyPart.setDisposition(MimeBodyPart.ATTACHMENT);
multipart.addBodyPart(messageBodyPart);

但是,一次将文件读取到byte[]对于大文件不起作用。但最后我想在电子邮件中将附件放在base64编码的字符串中。那么如何解决附件中的大文件呢?

3 个答案:

答案 0 :(得分:4)

使用MimeBodyPart.attachFile

messageBodyPart.attachFile(file, "application/octet-stream", "base64");

该文件不会被读入内存,因此会在发送邮件时“即时”编码。

答案 1 :(得分:0)

您的代码没有任何问题。所以我只想给你一些提示:

  • 将100 MB文件读入SELECT DATEDIFF(MyDateColumn, NOW()) FROM MyTable; 不应导致OOM错误。但是,将byte[]打开或任何悬空引用留给数组会导致此类错误。因此,请务必关闭所有资源,不要在全局HashMap等中缓存数组。
  • .zip不是压缩纯文本文件的最佳格式。尝试使用LZMA,BZIP2甚至7zip来获取较小的文件。
  • 正如其他人所说,更好的选择是将文件上传到Amazon S3 / Dropbox / Google Drive或其他一些云解决方案,并附加链接。你可以解释一下,从长远来看,这比你的IT部门便宜。管理公司范围内可能的许多TeraBytes附件的所有磁盘空间要求。但是如果你决定不这样做,并且只是为了实现要求而做你的工作就行了,而不是质疑它们: - )

答案 2 :(得分:0)

您可以尝试使用它发送您想要的任何文件。还有任意数量的文件。

/**
 Multi part message email
 **/

Multipart multipart = new MimeMultipart();

//Add atachments
String[] attachments = new String[2];

attachments[0] = "your_complete_path.pdf";
attachments[1] = "your_complete_path.txt";

if(attachments != null && attachments.length > 0) {
    for (String str : attachments) {
        MimeBodyPart messageBodyPart = new MimeBodyPart();
        DataSource source = new FileDataSource(str);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(source.getName());
        multipart.addBodyPart(messageBodyPart);
    }
}

message.setContent(multipart);