Criando templates de e-mail com Thymeleaf


1. Configurando o Thymeleaf

No Spring, o Thymeleaf pode ser configurado para renderizar templates HTML, que serão usados para gerar o conteúdo dos e-mails.

O arquivo ThymeleafConfig.java configura o Thymeleaf para o seu projeto, especificando onde os templates estão localizados e como eles devem ser processados.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
 
@Configuration
public class ThymeleafConfig implements WebMvcConfigurer {
    @Bean
    public ClassLoaderTemplateResolver templateResolver() {
        ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
 
        resolver.setPrefix("templates/"); // Localização dos templates Thymeleaf
        resolver.setCacheable(false); // Desativando cache para facilitar mudanças nos templates
        resolver.setSuffix(".html"); // Extensão dos arquivos de template
        resolver.setTemplateMode("HTML"); // Tipo de template
        resolver.setCharacterEncoding("UTF-8");
 
        return resolver;
    }
 
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
 
        return engine;
    }
}

2. Criando um Template do Thymeleaf

Em /resources/templates/, crie um arquivo HTML que servirá como base para o conteúdo dos e-mails.

O arquivo template template.html define uma estrutura básica onde o conteúdo dinâmico será inserido.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
        <!-- 
        O código HTML será adicionado na tag div abaixo,
        que será fornecido como input pelo usuário.
        -->
        <div th:utext="${content}"></div>
    </body>
</html>

3. Criando o Data Transfer Object (DTO)

O DTO MailRequest captura as informações necessárias para renderizar o template de e-mail corretamente.

import com.fasterxml.jackson.annotation.JsonAlias;
 
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
 
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MailRequest {
    private String message;
}

4. Criando o Serviço de E-mail

O serviço EmailingService usa o Thymeleaf para processar templates, adicionando as informações fornecidas pelo cliente via API.

import com.example.demo.dto.MailRequest;
 
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
 
import lombok.RequiredArgsConstructor;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
 
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
 
@Service
@RequiredArgsConstructor
public class EmailingService {
 
    private final TemplateEngine templateEngine;
 
    @Async
    public void sendMail(MailRequest request) {
        Context context = new Context();
		/*
		content é a variável definida no nosso template HTML dentro da tag div
		*/
		context.setVariable("content", request.getMessage());
		
		return templateEngine.process("template", context);
    }
}

5. Criando o Controlador de E-mail

O controlador EmailingController expõe um endpoint REST para enviar e-mails utilizando o serviço de e-mail.

EmailingController.java

import com.example.demo.dto.MailRequest;
import com.example.demo.service.EmailingService;
 
import jakarta.mail.MessagingException;
 
import lombok.RequiredArgsConstructor;
 
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/mail")
public class EmailingController {
    private final EmailingService emailingService;
    
    @PostMapping
    @ResponseStatus(HttpStatus.OK)
    public void sendMail(@RequestBody MailRequest request) throws MessagingException {
        emailingService.sendMail(request);
    }
}

Referências


https://gaganchordia.medium.com/spring-boot-mail-thymeleaf-362fda6000cf