springthymeleafhtml-emailtemplate-engineinline-images

Couldn't prepare mail with inline image using Thymeleaf templateEngine?


I am trying to send a html email with an inline-image attached using spring mvc and Thymeleaf. My code works without attaching the image. I get the html email successfully without image. But When I added the following line to my code I get the below error message.

Without this line code works and I get the email without image:

 message.addInline(image.getName(), imageSource,  image.getContentType());

This is the method:

public void sendUserRegisterEmail(String receiver, String receiverEmailAddress){
    MimeMessagePreparator preparator = new MimeMessagePreparator() {
        public void prepare(MimeMessage mimeMessage) throws Exception {

            Path path = Paths.get("/assets/dist/img/dialog_tv_logo-white-01.png");
            String fileName = "dialog_tv_logo-white-01.png";
            String originalFileName = "dialog_tv_logo-white-01.png";
            String contentType = "image/png";
            byte[] content = null;
            try {
                content = Files.readAllBytes(path);
            } catch (final IOException e) {
            }
            MultipartFile image = new MockMultipartFile(fileName,
                    originalFileName, contentType, content);

            Locale locale = Locale.getDefault();
            final Context ctx = new Context(locale);
            ctx.setVariable("name", receiver);
            ctx.setVariable("subscriptionDate", new Date());
            ctx.setVariable("imageResourceName", image.getName());

            MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
            message.setSubject(USER_REGISTER_MESSAGE_SUBJECT);
            message.setTo(receiverEmailAddress);
            message.setFrom(SENDER_EMAIL_ADDRESS);
            final String htmlContent = emailTemplateEngine.process("email-inlineimage", ctx);
            message.setText(htmlContent, true /* isHtml */);

            final InputStreamSource imageSource = new ByteArrayResource(image.getBytes());
            message.addInline(image.getName(), imageSource,  image.getContentType());

           }
    };
    sendEmail(preparator);
}  

Following error message I get when the image prepare line is added:

 org.springframework.mail.MailPreparationException: Could not prepare mail; nested exception is java.lang.IllegalStateException: Not in multipart mode - create an appropriate MimeMessageHelper via a constructor that takes a 'multipart' flag if you need to set alternative texts or add inline elements or attachments.

Can any one figure out what is the issue here?


Solution

  • Finally able to fix the error after a lot of effort. Changing the following line fixed the issue. Create MimeMessageHelper by passing true

    MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);