You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:37:21