Search code examples
htmlspringemailtextmime

Create multi-part message in MIME format Freemarker template via Spring 3 JavaMail


How do you create email message that contains text and HTML version for the same content?

Of course I would like to know how to setup the freemarker template or the header of the message that will be send.

When I look on the source of message multi-part message in MIME format that I receive in inbox every once in while this is what is in there:

This is a multi-part message in MIME format.

------=_NextPart_000_B10D_01CBAAA8.F29DB300
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

...Text here...

------=_NextPart_000_B10D_01CBAAA8.F29DB300
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html><body> html code here ... </body></html>

Solution

  • If you spot any inconsistencies please let me know. I had to extract this from pretty complex object so that's why this looks like it does.

    //some important imports
    import freemarker.template.Template;
    import org.springframework.mail.javamail.*;
    import org.springframework.context.*;
    import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
    import javax.mail.internet.MimeMessage;
    
    private JavaMailSender mailSender;
    private MessageSource messageSource;
    private ExecutorService executor = Executors.newFixedThreadPool(50);
    
    MimeMessagePreparator preparator = new MimeMessagePreparator() {
        public void prepare(MimeMessage mimeMessage) throws Exception {
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
    
                message.setFrom(from);
                message.setTo(recipient);
                message.setSubject(subject);
    
                // Now the message body.
                Multipart mp = new MimeMultipart();
    
                BodyPart textPart = new MimeBodyPart();
                Template textTemplate = freemarkerConfig.getConfiguration().getTemplate(textEmailTemplate); // "/WEB-INF/emailText/*.ftl"
                final StringWriter textWriter = new StringWriter();
                textEmailTemplate.process(modelMap, textWriter);
                textPart.setText(textWriter.toString()); // sets type to "text/plain"
    
    
                BodyPart pixPart = new MimeBodyPart();
                Template pixTemplate = freemarkerConfig.getConfiguration().getTemplate(pixEmailTemplate); // "/WEB-INF/emailPix/*.ftl"
                final StringWriter pixWriter = new StringWriter();
                textEmailTemplate.process(modelMap, pixWriter);
                pixPart.setContent(pixWriter.toString(), "text/html");
    
                // Collect the Parts into the MultiPart
                mp.addBodyPart(textPart);
                mp.addBodyPart(pixPart);
                // Put the MultiPart into the Message
                 message.setContent(mp);                  
    
         }
    };
    
    executor.submit(new SendMail(preparator));
    
    class SendMail extends Thread {
        MimeMessagePreparator preparator;
    
        SendMail(MimeMessagePreparator preparator) {
            this.preparator = preparator;
        }
    
        public void run() {
            mailSender.send(preparator);
          }
    }