Alex H
Alex H

Reputation: 23

HTML mail using Spring4 and Thymeleaf

I am trying to send a simple HTML mail using Spring 4 and Thymeleaf templates. In my java class I have:

 // Prepare the evaluation context
 final Context ctx = new Context(locale);
 ctx.setVariable("token", token);
 ctx.setVariable("serverUrl", serverUrl);

 //process template
 final String htmlContent = templateEngine.process("resetPassword", ctx);
 templateEngine.addTemplateResolver(emailTemplateResolver);

 // Prepare message using a Spring helper
 final MimeMessage mimeMessage = this.javaMailSender.createMimeMessage();
 MimeMessageHelper mailMessage;
 try {
    mailMessage = new MimeMessageHelper(mimeMessage, true, "UTF-8");
    mailMessage.setTo(email);
    mailMessage.setSubject("Reset password");
    mailMessage.setFrom("[email protected]");

    // Create the HTML body using Thymeleaf
    mailMessage.setText(htmlContent, true);

    this.javaMailSender.send(mimeMessage);
 } catch (MessagingException e) {
        logger.error(e.toString());
 } 

My template engine is org.thymeleaf.spring4.SpringTemplateEngine

I've also tried assigning a custom template engine configuration:

public ClassLoaderTemplateResolver emailTemplateResolver(){
    ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver();
    emailTemplateResolver.setPrefix("/templates/");
    emailTemplateResolver.setSuffix(".html");
    emailTemplateResolver.setTemplateMode("HTML5");
    emailTemplateResolver.setCharacterEncoding("UTF-8");
    emailTemplateResolver.setOrder(1);

    return emailTemplateResolver;
}

And my HTML template contains blocks like this within HTML markup:

th:href="#{${serverUrl}resetPassword?token=${token}}"

I would expect serverUrl and token to evaluate to Context variables, I've set in java code, but instead I get this within my email:

??${serverUrl}resetPassword?token=${token}_en_US??

I've spent two days reading every single post on the subject and I can say, with absolute assurance, that I am firmly stuck. Any help would be highly appreciated.

Alex

Upvotes: 2

Views: 1052

Answers (1)

gregdim
gregdim

Reputation: 2071

You are trying to create a link by using syntax for i18n messages.

Instead of:

th:href="#{${serverUrl}resetPassword?token=${token}}"

use the following :

th:href="@{${serverUrl} +'resetPassword'(token=${token})}"

Upvotes: 1

Related Questions