how to send a html email with attached file using JavaMail

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

**Send Email using html body and file attachement**

          > try {
            host = localhost;//use your host or pwd if any
            Properties props = System.getProperties();
            props.put("mail.smtp.host", host);
            props.setProperty("mail.smtp.auth", "false");

            Session session = Session.getInstance(props, null);
            MimeMessage mailer = new MimeMessage(session);

            // recipient
            mailer.setRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(toEmail));
            // sender
            mailer.setFrom(new InternetAddress(fromEmail));
            // cc
            if (ccEmail != null) {
                for (int i = 0; i < ccEmail.size(); i++) {
                    String cc = ccEmail.get(i);
                    mailer.addRecipient(javax.mail.Message.RecipientType.CC, new InternetAddress(cc));
                }
            }
            Transport t = session.getTransport("smtp");
            t.connect();

            mailer.setSubject(subject);
            mailer.setFrom(new InternetAddress(fromEmail));

            // attachement
            Multipart multipart = new MimeMultipart();
            BodyPart messageBodyPart = new MimeBodyPart();
            BodyPart attachmentBodyPart = new MimeBodyPart();
            messageBodyPart.setContent(htmlbody, "text/html"); // 5
            multipart.addBodyPart(messageBodyPart);

            // file path
            File filename = new File(xmlurl);
            DataSource source = new FileDataSource(filename);

            attachmentBodyPart.setDataHandler(new DataHandler(source));

            attachmentBodyPart.setFileName(filename.getName());

            multipart.addBodyPart(attachmentBodyPart);

            mailer.setContent(multipart);

            Transport.send(mailer);
            System.out.println("Mail completed");
         } catch (SendFailedException e) {//errr
            }
        }