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

Java替换HTML中{}占位符并生成邮件内容的技术咨询

实现方案

方案1:直接使用JDK自带MessageFormat(无额外依赖)

适合占位符顺序固定、数量不多的场景,实现成本最低,你的模板中{}格式刚好匹配MessageFormat默认占位符规则。

import java.text.MessageFormat;

public class HtmlTemplateTest {
    public static void main(String[] args) {
        // 定义HTML模板,Java字符串中双引号需要转义
        String htmlTemplate = """
                <td width="66"><p>{0}</p></td><td width="96">
                          <p><u><a href="{1}">{2}</a></u></p></td><td width="111"><p>{3}</p></td>
                <td width="283"><p>{4}</p></td><td width="215"><p>{5}</p></td>
                <td width="137"><p>{6}</p></td><td width="92"><p>{7}</p></td>
                <td width="99"><p><em>{8}</em></p></td><td width="109"><p>{9}</p></td>
                <td width="109"><p>{10}</p></td> 
                """;
        // 按占位符出现顺序传入应用内的实际取值
        Object[] params = new Object[]{
                "序号",
                "https://示例链接地址",
                "链接显示文本",
                "第3列内容",
                "第4列内容",
                "第5列内容",
                "第6列内容",
                "第7列内容",
                "斜体显示内容",
                "第9列内容",
                "第10列内容"
        };
        // 替换完成得到最终HTML,可直接作为邮件内容发送
        String finalHtml = MessageFormat.format(htmlTemplate, params);
        System.out.println(finalHtml);
    }
}

注意:如果参数内容包含单引号',需要提前替换为两个单引号'',否则会导致MessageFormat解析错误。

方案2:使用Apache Commons Lang3的StrSubstitutor(命名占位符更易维护)

如果参数较多容易混淆顺序,可以将占位符改为命名格式,可读性和可维护性更高。

import org.apache.commons.text.StringSubstitutor;
import java.util.HashMap;
import java.util.Map;

public class HtmlTemplateTest2 {
    public static void main(String[] args) {
        // 模板中将{}改为命名占位符
        String htmlTemplate = """
                <td width="66"><p>{orderId}</p></td><td width="96">
                          <p><u><a href="{detailUrl}">{linkText}</a></u></p></td><td width="111"><p>{col3}</p></td>
                <!-- 其余占位符同理改为语义化命名 -->
                """;
        // 构造参数映射
        Map<String, Object> params = new HashMap<>();
        params.put("orderId", "123456");
        params.put("detailUrl", "https://示例订单详情链接");
        params.put("linkText", "查看订单详情");
        params.put("col3", "测试内容");
        // 替换占位符
        StringSubstitutor substitutor = new StringSubstitutor(params);
        String finalHtml = substitutor.replace(htmlTemplate);
        System.out.println(finalHtml);
    }
}

方案3:Thymeleaf模板方案(适合复杂邮件模板)

之前调试失败大概率是模板配置问题,以下是最简可用实现:

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

public class ThymeleafMailTest {
    public static void main(String[] args) {
        // 配置模板解析器
        ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
        resolver.setPrefix("templates/"); // 模板存放在resources/templates目录下
        resolver.setSuffix(".html");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setCharacterEncoding("UTF-8");
        
        // 初始化模板引擎
        TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(resolver);
        
        // 存入业务参数
        Context context = new Context();
        context.setVariable("orderId", "123456");
        context.setVariable("detailUrl", "https://示例订单详情链接");
        context.setVariable("linkText", "查看订单详情");
        
        // 渲染模板,参数为模板文件名(不含后缀)
        String finalHtml = templateEngine.process("mail_template", context);
        System.out.println(finalHtml);
    }
}

对应的模板文件resources/templates/mail_template.html占位符写法:

<td width="66"><p th:text="${orderId}"></p></td>
<td width="96">
  <p><u><a th:href="${detailUrl}" th:text="${linkText}"></a></u></p>
</td>
<!-- 其余字段同理配置即可 -->

注意事项

  • 所有替换的内容如果包含HTML特殊字符(<、>、&、"等),一定要提前做HTML转义,避免破坏邮件结构。
  • 生成的最终HTML要指定UTF-8编码再作为邮件内容发送,避免出现乱码。

内容的提问来源于stack exchange,提问作者Billy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:06