javamail在发送之前将附件加载到内存中吗?

时间:2011-05-04 19:48:40

标签: java email javamail

我需要创建一个包含即时创建的附件的电子邮件。在我的初稿中,我将附件构建为String。但是在代码中,其他人指出字符串可能非常大。它通常是几千字节,但偶尔可能是几兆字节。所以他们说我应该逐行写入临时文件,然后将文件附加到电子邮件中。否则,我可能会用尽堆空间。

我想知道这是否真的有帮助。如果JavaMail在发送之前将整个文件读入内存,则没有任何区别。当然,创建一个临时文件会引入其他烦恼,例如找到合适的目录来放置它,确保我有权限等等。但是如果Javamail以某些适度大小的块读取文件,那么它将避免不合适记忆问题。

副作用是:据我所知,Javamail同步发送。因此,如果我创建文件,发送它,然后删除文件,那么在实际发送文件之前应该没有删除文件的问题,对吗?

2 个答案:

答案 0 :(得分:3)

如果您使用DataHandler实现,是的,您可以流式传输它。我们一直这样做

            MimeBodyPart mbp2 = new MimeBodyPart();
            //  attach the file to the message
            mbp2.setDataHandler(new DataHandler(fids[i]));
            mbp2.setFileName(fids[i].getName());

此示例中的fids [i]是我们自己的DataSource接口实现

public abstract interface javax.activation.DataSource {

  // Method descriptor #4 ()Ljava/io/InputStream;
  public abstract java.io.InputStream getInputStream() throws java.io.IOException;

  // Method descriptor #8 ()Ljava/io/OutputStream;
  public abstract java.io.OutputStream getOutputStream() throws java.io.IOException;

  // Method descriptor #10 ()Ljava/lang/String;
  public abstract java.lang.String getContentType();

  // Method descriptor #10 ()Ljava/lang/String;
  public abstract java.lang.String getName();
}

答案 1 :(得分:2)

按照MJB的描述创建的消息将作为附件发送,我怀疑这是你想要的方式。这个更简单,并从文件中发送消息作为正文:

File file = new File("huge-message.txt");
MimeMessage msg = new MimeMessage(mailSession);
msg.setFrom(...);
msg.setRecipient(...);
msg.setSubject(...);
msg.setDataHandler(new DataHandler(new FileDataSource(file)));