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