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
相关产品推荐
相关产品推荐

