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

Java SMTP发邮件遇Outlook无法渲染text/html内容问题求助

解决Java SMTP发送HTML邮件在Outlook中无法正常渲染的问题

问题现象

使用Java SMTP发送邮件时,Outlook无法正确渲染text/html格式内容,显示的内容为:

<p id="content">Dear User,<br><br>Please treat this as urgent message,<br><br>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标签进行了自动转义:将<转换为&lt;,>转换为&gt;,导致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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:44:51