如何结合Thymeleaf模板与javax.mail实现邮件发送?
如何将Thymeleaf模板与javax.mail结合使用(不依赖spring-boot-starter-mail)
直接使用Thymeleaf核心库完成模板渲染,再将渲染后的HTML内容通过javax.mail发送即可,无需依赖Spring Boot邮件组件。以下是完整实现步骤:
1. 添加必要依赖
如果使用Maven,在pom.xml中添加Thymeleaf核心和javax.mail的依赖:
<dependencies> <!-- Thymeleaf核心 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.1.2.RELEASE</version> </dependency> <!-- javax.mail --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> </dependencies>
2. 编写Thymeleaf模板
在项目的src/main/resources/templates目录下创建模板文件email-template.html:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>邮件模板</title> </head> <body> <h1 th:text="${subject}"></h1> <p>您好,<span th:text="${username}"></span>!</p> <p th:text="${content}"></p> </body> </html>
3. 实现Thymeleaf模板渲染工具
创建工具类加载模板并渲染成HTML字符串:
import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; import java.util.Map; public class ThymeleafTemplateUtil { private static final TemplateEngine templateEngine; static { // 初始化模板解析器 ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver(); resolver.setPrefix("templates/"); resolver.setSuffix(".html"); resolver.setTemplateMode("HTML"); resolver.setCharacterEncoding("UTF-8"); // 初始化模板引擎 templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(resolver); } // 渲染模板方法 public static String renderTemplate(String templateName, Map<String, Object> variables) { Context context = new Context(); context.setVariables(variables); return templateEngine.process(templateName, context); } }
4. 修改javax.mail发送逻辑,支持HTML邮件
更新EmailUtil,添加HTML邮件发送方法:
import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class EmailUtil { // 发送纯文本邮件(保留原方法) public static void sendEmail(Session session, String toEmail, String subject, String body) throws MessagingException { sendHtmlEmail(session, toEmail, subject, body); } // 发送HTML邮件方法 public static void sendHtmlEmail(Session session, String toEmail, String subject, String htmlBody) throws MessagingException { MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("your-sender-email@example.com")); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail)); msg.setSubject(subject, "UTF-8"); // 设置邮件内容为HTML格式 msg.setContent(htmlBody, "text/html; charset=UTF-8"); Transport.send(msg); } }
5. 整合模板渲染与邮件发送
修改原SimpleEmail类,完成模板渲染后发送邮件:
package com.journaldev.mail; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.mail.Session; import javax.mail.MessagingException; public class SimpleEmail { public static void main(String[] args) { System.out.println("SimpleEmail Start"); String smtpHostServer = "smtp.example.com"; String emailID = "email_me@example.com"; Properties props = System.getProperties(); props.put("mail.smtp.host", smtpHostServer); // 若SMTP需认证,添加以下配置 // props.put("mail.smtp.auth", "true"); // props.put("mail.smtp.port", "587"); Session session = Session.getInstance(props, null); // 需认证时使用Authenticator // Session session = Session.getInstance(props, new Authenticator() { // protected PasswordAuthentication getPasswordAuthentication() { // return new PasswordAuthentication("your-sender-email@example.com", "your-password"); // } // }); try { // 准备模板变量 Map<String, Object> variables = new HashMap<>(); variables.put("subject", "Thymeleaf邮件测试"); variables.put("username", "测试用户"); variables.put("content", "这是通过Thymeleaf模板渲染的HTML邮件内容"); // 渲染模板得到HTML内容 String htmlContent = ThymeleafTemplateUtil.renderTemplate("email-template", variables); // 发送HTML邮件 EmailUtil.sendHtmlEmail(session, emailID, "Thymeleaf邮件测试", htmlContent); System.out.println("邮件发送成功"); } catch (MessagingException e) { e.printStackTrace(); } } }
关键说明
- 核心逻辑是用Thymeleaf的
TemplateEngine和Context完成模板渲染,完全不依赖Spring组件 - SMTP认证可通过
Session初始化时添加Authenticator实现 - 模板文件路径可通过
ClassLoaderTemplateResolver的setPrefix调整,确保正确加载
内容的提问来源于stack exchange,提问作者BAKHALED Ibrahim
相关产品推荐
相关产品推荐

