Java SMTP发邮件遇Outlook无法渲染text/html内容问题求助
解决Java SMTP发送HTML邮件在Outlook中无法正常渲染的问题
问题现象
使用Java SMTP发送邮件时,Outlook无法正确渲染text/html格式内容,显示的内容为:
<p id="content">Dear User,&lt;br&gt;&lt;br&gt;Please treat this as urgent message,&lt;br&gt;&lt;br&gt;Thank you</p>
期望的正常显示效果是排版后的文本:
Dear User, Please treat this as urgent message, Thank you
现有代码
MimeMessage message = javaEmailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, 3, StandardCharsets.UTF_8.name()); Context context = new Context(); context.setVariable("body", dto.getBody()); log.info("body {}", dto.getBody()); // 输出内容:<p>Dear User,</p><p></p><p>Please treat this as urgent message,</p><p></p><p>Thank you</p> String htmlTemplate = getTemplate(); String html = templateEngine.process(htmlTemplate, context); javaEmailSender.send(message);
问题根源
模板引擎对body变量中的HTML标签进行了自动转义:将<转换为<,>转换为>,导致Outlook把转义后的内容识别为纯文本,而非可解析的HTML标签。
解决方案
1. 修改模板输出规则(以Thymeleaf为例)
在HTML模板中,使用不转义的语法渲染body变量:
- 原模板写法:
<div th:text="${body}"></div> - 修改为:
<div th:utext="${body}"></div>th:utext会直接输出原始HTML内容,不会触发转义。
2. 明确设置邮件内容类型
必须在代码中告知客户端邮件为HTML格式,添加以下代码:
// 生成html后添加 helper.setText(html, true); // 第二个参数true表示内容为HTML格式
若缺失此步骤,邮件客户端会默认按纯文本解析内容。
3. 手动取消变量转义(可选)
如果无法修改模板,可在代码中对变量做不转义处理(以Thymeleaf为例):
import org.thymeleaf.util.UnescapedUtils; // 设置变量时处理 context.setVariable("body", UnescapedUtils.unescape(dto.getBody()));
内容的提问来源于stack exchange,提问作者Unknown User
相关产品推荐
相关产品推荐

