javamail загружает вложения в память перед отправкой? - PullRequest
3 голосов
/ 04 мая 2011

Мне нужно создать письмо с вложением, которое составляется на лету.В своем первом наброске этого я построил вложение в виде строки.Но во время прохождения кода другие указали, что строка может быть очень большой.Обычно это несколько тысяч байт, но иногда это могут быть мегабайты.Поэтому они сказали, что я должен написать это построчно во временный файл, а затем прикрепить файл к электронному письму.В противном случае мне может не хватить места в куче.

Мне интересно, поможет ли это на самом деле.Если JavaMail перед отправкой читает весь файл в память, это не имеет значения.И, конечно же, создание временного файла приводит к другим неприятностям, таким как поиск подходящего каталога для его установки, проверка наличия у меня разрешений и т. Д. Но если вместо этого Javamail читает файл в некоторых кусках скромного размера, то это позволит избежатьпроблемы с памятью.

Побочная проблема: Насколько я понимаю, Javamail отправляет синхронно.Так что, если я создаю файл, отправляю его, а затем удаляю файл, не должно быть проблемы удаления файла до того, как он действительно завершит отправку, верно?

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Если вы используете реализацию 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();
}
2 голосов
/ 19 июля 2011

Сообщение, созданное в соответствии с описанием 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)));
...