简体   繁体   中英

How to attach a file to an HTML email using Apache Commons Email

I'm using Apache Commons Email 1.1 and I can't figure out how to attach a file to an HtmlEmail. If I run the code below, I get an email with an attachment, but the HTML message comes across as an attachment also.

If I don't call email.attach() the HTML message come through as you would expect, but I need both the HTML message to come through and the attachment. What am I missing?

  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();
email.attach(new ByteArrayDataSource(pdfBytes, "application/pdf"),
      "document.pdf", "Document description",
       EmailAttachment.ATTACHMENT);

this works with commons-email 1.1.

pdfBytes should be a byte[] containing the bytes of the pdf document. If that doesn't suit you, you can try other DataSource implementations, but I can't guarantee they'd work (although they should).

(The one above is org.apache.commons.mail.ByteArrayDataSource )

Note that using:

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

on a HtmlEmail using commons-email 1.1 causes the resulting email to have its message (text or html) enclosed as an attachment.

Switching to a MultiPartEmail fixed this.

I suggest you try the current release candidate v1.2 RC2 as 1.1 (I guess you use that) has some html layout problems

commons-email 1.2 RC2

I use the HtmlEmail#embed(URL, String) method:

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

在最新版本 (1.5) 上,以下代码对我有用

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

You can use up-casting and down-casting in Java.

  1. HtmlEmail extends MultiPartEmail, and attacch method returns the MultiPartEmail class.
  2. HtmlEmail will be converted to MultiPartEmail, and then use tempEmail.attach (attachment).
  3. Then MultiPartEmail will be converted back to HtmlEmail class.

     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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM