how to send a html email with attached file using JavaMail

Tags: , ,



The following Java code is used to attach a file to a html email and send it. I want to send attachment with this html email. Any suggestions would be appreciated.

public void sendEmail(final String userName, final String password, final String host, final String html, final List<String> emails, String subject, String file) throws MessagingException
    {
        System.out.println("User Name: " + userName);
        System.out.println("Password: " + password);
        System.out.println("Host: " + host);

        //Get the session object  
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(props,
                new javax.mail.Authenticator()
                {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication()
                    {
                        return new PasswordAuthentication(userName, password);
                    }
                });

        if (!emails.isEmpty())
        {
            //Compose the message  
            InternetAddress[] address = new InternetAddress[emails.size()];
            for (int i = 0; i < emails.size(); i++)
            {
                address[i] = new InternetAddress(emails.get(i));
            }

            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(userName));
            message.setRecipients(Message.RecipientType.TO, address);
            message.setSubject(subject);

            MimeBodyPart messageBodyPart = new MimeBodyPart();

            Multipart multipart = new MimeMultipart();

            messageBodyPart = new MimeBodyPart();
            String fileName = "attachmentName";
            DataSource source = new FileDataSource(file);
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName(fileName);
            multipart.addBodyPart(messageBodyPart);
            message.setContent(html, "text/html; charset=utf-8");
            message.setContent(multipart);
            //send the message  
            Transport.send(message);

            System.out.println("message sent successfully...");
        } else
        {
            System.out.println("No Recieptions");
        }

    }

This brings me just only the attachment . But i want to send html email with this attachment .

Answer

Creating a mail with an HTML body and an attachment, actually means creating a mail whose content is a “multipart entity”, that contains two parts, one of them being the HTML content, et the second being the attached file.

This does not correspond to your current code:

Multipart multipart = new MimeMultipart(); // creating a multipart is OK

// Creating the first body part of the multipart, it's OK
messageBodyPart = new MimeBodyPart();
// ... bla bla
// ok, so this body part is the "attachment file"
messageBodyPart.setDataHandler(new DataHandler(source));
// ... bla bla
multipart.addBodyPart(messageBodyPart); // at this point, the multipart contains your file attachment, but only that!

// at this point, you set your mail's body to be the HTML message    
message.setContent(html, "text/html; charset=utf-8");
// and then right after that, you **reset** your mail's content to be your multipart, which does not contain the HTML
message.setContent(multipart);

At this point, your email’s content is a multipart that has only 1 part, which is your attachment.

So, to reach your expected result, you should proceed differently :

  1. Create a multipart (as you did)
  2. Create a part, that has your file attachment as a content (as you did)
  3. Add this first part to the multipart (as you did)
  4. Create a second MimeBodyPart
  5. Add your html content to that second part
  6. Add this second part to your multipart
  7. Set your email’s content to be the multipart (as you did)

Which roughly translates to :

Multipart multipart = new MimeMultipart(); //1
// Create the attachment part
BodyPart attachmentBodyPart = new MimeBodyPart(); //2
attachmentBodyPart.setDataHandler(new DataHandler(fileDataSource)); //2
attachmentBodyPart.setFileName(file.getName()); // 2
multipart.addBodyPart(attachmentBodyPart); //3
// Create the HTML Part
BodyPart htmlBodyPart = new MimeBodyPart(); //4
htmlBodyPart.setContent(htmlMessageAsString , "text/html"); //5
multipart.addBodyPart(htmlBodyPart); // 6
// Set the Multipart's to be the email's content
message.setContent(multipart); //7


Source: stackoverflow