Quarkus Qute模板发送HTML邮件时动态内容换行不生效如何解决
根因
Qute默认对所有注入模板的变量做HTML转义:
- 你传入字符串里的
<br>会被转义为<br>,变成普通文本字符,不会被识别为HTML换行标签 - 字符串里的
\n、System.lineSeparator()属于纯文本换行,在HTML渲染规则中会被自动折叠为单个空格,本身就不会产生页面换行效果 - 你写的
\\n是转义后的字面量\n字符串,完全不具备换行能力
解决方案
- 最直接的修复方式:在模板中对body变量关闭转义
将模板中对应位置的{body}修改为{body.raw},Qute会直接输出传入内容的原始HTML,不做字符转义。注意:如果body内容来自不受信任的用户输入,需要提前对内容做XSS过滤,避免恶意脚本注入。
- 不想关闭转义的适配方式:在代码侧统一处理换行
先把传入的正文里所有纯文本换行符统一替换为<br>标签,再传入模板,同时仍然需要给变量加.raw保证标签正常渲染。示例处理逻辑:String emailBody = "First line\nSecond line\nThird line\nFourth line"; // 统一替换纯文本换行为HTML换行标签 emailBody = emailBody.replace(System.lineSeparator(), "<br>").replace("\n", "<br>"); - 预格式化文本场景:用
<pre>标签包裹变量
如果你的邮件正文是日志、代码这类需要保留原生格式的内容,可以直接在模板里用<pre>标签包裹{body},不需要加.raw,<pre>标签会自动保留文本中的原生换行、空格格式,缺点是会用等宽字体渲染,不适合常规商务邮件。
修复后示例
调整后的模板核心片段:
<body class="body"> <br> Hi <b>Receiver</b>, <br><br> {body.raw} <br><br> </body> </html>
调整后的传参逻辑:
String emailBody = "First line <br>" + "Second line <br>" + "Third line <br>" + "Fourth line"; mailObject.to(recipient) .subject("Default subject") .data("body", emailBody) .send().subscribe().with( success -> logger.info("Message sent"), fail -> logger.error("Exception while sending mail", fail));
内容的提问来源于stack exchange,提问作者Suraj Gudimetla
相关产品推荐
相关产品推荐

