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

6

10

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("[email protected]", "Test");
  email.setFrom("[email protected]", "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();
Rostov answered 22/10, 2009 at 22:16 Comment(3)
Oh.. by the way, I was using gmail as my test client.Rostov
Did you try to force content type by doing email.setContent(javax.mail.internet.MimeMultipart aMimeMultipart)? It's probably redundant but worth a shotGuendolen
@droidin-net I'm not sure I understand what you mean. I though the whole point of apache commons email was to abstract you from the MimeMultipart stuff.Rostov
A
13
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)

Axes answered 20/1, 2010 at 22:6 Comment(0)
G
4

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.

Guillema answered 8/2, 2011 at 8:53 Comment(0)
K
3

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

Kasiekask answered 22/10, 2009 at 23:43 Comment(0)
B
0

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

File pdf = new File(pdfPath);
email.embed(pdf.toURI().toURL(), pdf.getName)
Bossism answered 24/10, 2013 at 7:43 Comment(0)
A
0

On latest release (1.5) the following code worked for me

 email.attach(new FileDataSource(attachmentFileObject), "AttachmentName", "Description");
Argilliferous answered 30/6, 2018 at 18:58 Comment(0)
S
0

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;
    
Sulphonamide answered 20/4, 2020 at 2:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.