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

Quarkus Qute模板发送HTML邮件时动态内容换行不生效如何解决

根因

Qute默认对所有注入模板的变量做HTML转义:

  1. 你传入字符串里的<br>会被转义为&lt;br&gt;,变成普通文本字符,不会被识别为HTML换行标签
  2. 字符串里的\n、System.lineSeparator()属于纯文本换行,在HTML渲染规则中会被自动折叠为单个空格,本身就不会产生页面换行效果
  3. 你写的\\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:27:31