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

Thymeleaf 3.0.15生成文本换行异常:Windows Outlook行内联问题求助

解决Thymeleaf邮件模板在Windows Outlook中的换行异常问题

针对你遇到的Thymeleaf 3.0.15生成的邮件模板在Windows Outlook中出现随机行合并,而macOS和网页版正常的问题,以下是几个可行的解决方案:

1. 强制Thymeleaf输出CRLF换行符

Thymeleaf的模板解析器支持指定换行符类型,直接配置解析器的lineSeparator属性为\r\n,就能让渲染后的内容统一使用CRLF,适配Windows Outlook的要求。

在Spring中自定义模板解析器的示例代码:

@Bean
public SpringResourceTemplateResolver emailTemplateResolver() {
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("classpath:/templates/email/");
    resolver.setSuffix(".txt");
    resolver.setTemplateMode(TemplateMode.TEXT);
    resolver.setCharacterEncoding("UTF-8");
    // 强制设置输出换行符为CRLF
    resolver.setLineSeparator("\r\n");
    resolver.setOrder(1); // 若有多个解析器,设置优先级
    return resolver;
}

这个设置会让Thymeleaf在渲染文本模板时,把所有换行都替换为CRLF,从根源上解决换行符不一致的问题。

2. 模板中显式添加CRLF

如果不想修改解析器配置,可以在模板里需要换行的位置直接写入\r\n,或者用Thymeleaf的<text>标签包裹换行符:

您好,[[${username}]]:
<text>\r\n</text>
您的订单编号是:[[${orderId}]]
<text>\r\n</text>
请在30分钟内完成支付。

这种方式适合局部调整,避免全局修改解析器带来的潜在影响。

3. 调整邮件发送的MIME配置

确保发送邮件时正确设置文本类型和编码,避免邮件传输过程中换行符被篡改:

MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, false, "UTF-8");
helper.setTo("user@example.com");
helper.setSubject("订单支付提醒");

// 渲染Thymeleaf模板
Context context = new Context();
context.setVariable("username", "张三");
context.setVariable("orderId", "ORD20240501001");
String emailContent = templateEngine.process("order-reminder", context);

// 显式设置为纯文本类型,确保Outlook识别换行
helper.setText(emailContent, false);
// 添加format=flowed头,优化Outlook的换行处理
message.addHeader("Content-Type", "text/plain; charset=UTF-8; format=flowed");

4. 确认模板模式为TEXT

确保Thymeleaf使用TemplateMode.TEXT解析邮件模板,而非HTML模式——HTML模式下Thymeleaf会自动合并连续的空白和换行,导致文本格式混乱。可以在模板文件开头添加声明:

<!DOCTYPE text>

或者在解析器配置中明确指定setTemplateMode(TemplateMode.TEXT)。

问题根源说明

Linux服务器默认使用LF换行,而Windows Outlook仅识别CRLF作为换行标记。Thymeleaf默认会将模板中的换行标准化为LF,即便你手动替换为CRLF,渲染过程中也可能被重新转换。上述方案从Thymeleaf渲染、模板编写、邮件发送三个环节入手,确保CRLF能正确保留并被Outlook识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:32:54