Как прикрепить файл к письму в формате HTML с помощью Apache Commons Email

Я использую Apache Commons Email 1.1 и не могу понять, как прикрепить файл к HtmlEmail. Если я запускаю приведенный ниже код, я получаю электронное письмо с вложением, но HTML-сообщение также выглядит как вложение.

Если я не вызову email.attach(), HTML-сообщение будет проходить так, как вы ожидаете, но мне нужно и HTML-сообщение, и вложение. Что мне не хватает?

  HtmlEmail email = new HtmlEmail();
  email.setHostName("localhost");
  email.addTo("test@mail.com", "Test");
  email.setFrom("testapp@mail.com", "Test App");
  email.setSubject("Test message");
  email.setHtmlMsg("<div style='font-size: 20px; color: green;'>This is html email</div>");

  EmailAttachment attachment = new EmailAttachment();
  attachment.setPath(pdfPath);
  attachment.setDisposition(EmailAttachment.ATTACHMENT);
  email.attach(attachment);

  email.send();

5 ответов

Решение
email.attach(new ByteArrayDataSource(pdfBytes, "application/pdf"),
      "document.pdf", "Document description",
       EmailAttachment.ATTACHMENT);

это работает с обычным адресом электронной почты 1.1.

pdfBytes должен быть byte[] содержащий байты PDF-документа. Если вас это не устраивает, вы можете попробовать другие DataSource реализации, но я не могу гарантировать, что они будут работать (хотя они должны).

(Тот, что выше org.apache.commons.mail.ByteArrayDataSource)

Обратите внимание, что с помощью:

email.attach(new ByteArrayDataSource(pdfBytes, "application/pdf"),
      "document.pdf", "Document description",
       EmailAttachment.ATTACHMENT);

на HtmlEmail использование commons-email 1.1 приводит к тому, что в полученном электронном письме его сообщение (текст или html) включается в качестве вложения.

Переключение на MultiPartEmail исправил это.

Я предлагаю вам попробовать текущий релиз кандидата v1.2 RC2 как 1.1 (я полагаю, вы используете это) имеет некоторые проблемы с версткой HTML

обыкновенная электронная почта 1.2 RC2

Я использую метод HtmlEmail#embed(URL, String):

File pdf = new File(pdfPath);
email.embed(pdf.toURI().toURL(), pdf.getName)

В последней версии (1.5) у меня работал следующий код

 email.attach(new FileDataSource(attachmentFileObject), "AttachmentName", "Description");

Вы можете использовать преобразование вверх и вниз в Java.

  1. HtmlEmail расширяет MultiPartEmail, а метод attacch возвращает класс MultiPartEmail.
  2. HtmlEmail будет преобразован в MultiPartEmail, а затем будет использоваться tempEmail.attach (вложение).
  3. Затем MultiPartEmail будет преобразован обратно в класс HtmlEmail.

    HtmlEmail email;
    MultiPartEmail tempEmail;
    
    // HtmlEmail -> MultiPartEmail
    tempEmail = new HtmlEmail();
    
    // Add a attachment
    EmailAttachment attachment = new EmailAttachment();
    attachment.setURL(new URL(fileURL));
    attachment.setDisposition(EmailAttachment.ATTACHMENT);
    attachment.setName(MimeUtility.encodeText(fileName));
    tempEmail = tempEmail.attach(attachment);
    
    // MultiPartEmail -> HtmlEmail
    email = (HtmlEmail)tempEmail;
    
Другие вопросы по тегам