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 .
Advertisement
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 :
- Create a multipart (as you did)
- Create a part, that has your file attachment as a content (as you did)
- Add this first part to the multipart (as you did)
- Create a second
MimeBodyPart
- Add your html content to that second part
- Add this second part to your multipart
- 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