CristianBanan
CristianBanan

Reputation: 41

Spring Boot - Can't add inline image using thymeleaf mail template

I'm trying to add an inline image in thymeleaf email html template like in tutorials, but nothings work.

This is my method from service class:

public void sendOrderDetailsEmail(PortfolioModel model)  {  
        try {

          MimeMessage mimeMessage = mailSender.createMimeMessage();
          MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
          Context context = new Context();
          context.setVariable("portfolio", model);
          context.setVariable("products", model.getProducts());
          context.setVariable("logo", "logo");

          String htmlContent = templateEngine.process(ORDER_DETAILS_HTML, context);
          message.addInline("logo", new ClassPathResource("images/logo.png"), "image/png");

          LOG.info("Sending order configuration email to  " + model.getUser().email);
          configureMessage(message, model.getUser().email, "Order details", htmlContent);
          mailSender.send(mimeMessage);
        } catch (Exception e) {
            LOG.error(e);
        }
    }

private void configureMessage(MimeMessageHelper message, String to, String subject, String content) 
{
    message.setFrom(new InternetAddress("[email protected]", "info"));
    message.setTo(to);
    message.setSubject(subject);
    message.setText(content, true /* is html */);
}


And this is my thymeleaf HTML template:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://thymeleaf.org">
<head>
</head>
<body>
<p>
    <img src="logo.png" th:src="|cid:${logo}|" />
</p>
<div th:object="${portfolio}">
    <p><span th:utext="${portfolio.user.fullname}"></span></p>
    <p><b>Your order id: </b><span th:utext="${portfolio.orderId}"></span></p>
    <p><b>Order information:</b></p>
   <div th:if="${products} != null">
       <table>
         <tr th:each="product : ${products}">
             - Product:
            <td th:text="${product.model}"></td >
            <td th:text="${product.year}"></td >
            <td th:text="${product.color}"></td >
        </tr>
       </table>
    </div>
</div>
</body>
</html>


All above the <img src=...> which is not appearing, works perfectly fine.

Upvotes: 3

Views: 2432

Answers (1)

zwartbont
zwartbont

Reputation: 33

You need to initialize your message as a Multipart message like this:

final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, MimeMessageHelper.MULTIPART_MODE_MIXED, "UTF-8"); // true = multipart

It is not sufficient to just set multipart to true.

Upvotes: 1

Related Questions