Spring Boot集成Thymeleaf发送HTML邮件显示源码问题排查
解决Spring Boot + Thymeleaf发送邮件显示纯HTML源码的问题
我帮你梳理几个最可能导致这个问题的原因,都是日常开发中容易踩的坑:
未正确设置邮件内容类型为HTML
这是最常见的诱因!当你用MimeMessageHelper构建邮件时,如果没明确告诉邮件客户端这是HTML内容,它会默认把内容当作纯文本处理,自然就会把HTML源码原封不动显示出来。
解决方法很简单:创建MimeMessageHelper时第二个参数传true(开启多部分邮件支持,同时允许HTML内容),并且调用setText()方法时,第二个参数也传true,明确标记内容为HTML:MimeMessage mimeMessage = emailSender.createMimeMessage(); // 第二个参数true支持HTML/附件,同时指定UTF-8编码避免乱码 MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); helper.setSubject("你的邮件主题"); helper.setTo("收件人邮箱地址"); // 渲染Thymeleaf模板 Context context = new Context(); context.setVariable("object", yourObject); // 传入模板需要的变量 // 注意:模板文件名不要带.html后缀,默认去templates目录下找 String htmlContent = templateEngine.process("email-template", context); // 关键:第二个参数true指定这是HTML内容 helper.setText(htmlContent, true); emailSender.send(mimeMessage);Thymeleaf模板路径或名称错误
哪怕模板代码没问题,如果模板放错了位置,或者调用process()时名称写错了,Thymeleaf就没法正确解析模板,直接把原模板的源码返回给你。
检查这两点:- 模板文件必须放在
src/main/resources/templates目录下(Spring Boot默认的Thymeleaf模板根目录) - 调用
templateEngine.process()时,传入的名称要和模板文件名一致(比如模板是order-notify.html,就传order-notify,不要带.html后缀)
- 模板文件必须放在
编码设置缺失导致解析异常
少数情况下,没指定正确的编码也会让邮件客户端误判内容类型。建议创建MimeMessageHelper时显式指定UTF-8编码,避免编码问题干扰内容识别。邮件客户端的显示设置问题
最后可以排除下客户端的问题:有些邮件客户端可能默认强制显示纯文本模式,你可以在收件端手动切换到“显示HTML”模式试试。如果切换后能正常渲染,那就是客户端设置的锅,和代码无关。
内容的提问来源于stack exchange,提问作者xampo
相关产品推荐
相关产品推荐

