
本文介绍如何将前端提交含换行符(\n)的动态文本,在 SendGrid Java SDK 发送的 HTML 邮件中正确显示为换行,核心方案是将换行符安全转换为 标签,并避免 XSS 风险。
本文介绍如何将前端提交含换行符(\n)的动态文本,在 sendgrid java sdk 发送的 html 邮件中正确显示为换行,核心方案是将换行符安全转换为 `
` 标签,并避免 xss 风险。
在使用 SendGrid Java SDK 发送 HTML 邮件时,若模板中需插入用户从表单(如 textarea)提交的富文本内容,常见问题是:前端输入的换行符 \n 或 \r\n 在 HTML 中默认不被渲染为可视换行——浏览器会将其合并为空格,导致邮件内容“挤成一行”。
根本原因:HTML 规范中,纯文本内的换行符(\n)不会触发换行;必须显式使用
标签或 CSS(如 white-space: pre-wrap)才能保留格式。
✅ 推荐解决方案:服务端预处理 + 安全转义
不要依赖 StringEscapeUtils.unescapeHtml4()(它用于解码 HTML 实体,如 < →
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
import org.apache.commons.text.StringEscapeUtils;
public static String convertNewlinesToBr(String input) {
if (input == null) return "";
// 1. 先进行 HTML 转义(防止 XSS)
String escaped = StringEscapeUtils.escapeHtml4(input);
// 2. 将换行符替换为 <br>(注意:仅替换 \n,\r\n 已被标准化为 \n)
return escaped.replace("\n", "<br>");
}
然后在 SendGrid 模板中直接使用该处理后的字符串:
Email from = new Email("sender@example.com");
String subject = "Your Dynamic Email";
Email to = new Email("recipient@example.com");
// 假设 frontendText 来自 HTTP 请求体
String frontendText = request.getParameter("message"); // 可能含 \n 和用户输入
String htmlSafeWithBr = convertNewlinesToBr(frontendText);
Content content = new Content("text/html",
"<h3>Message:</h3><p>" + htmlSafeWithBr + "</p>"
);
Mail mail = new Mail(from, subject, to, content);
// ... 发送逻辑(使用 SendGrid API client)
⚠️ 关键注意事项:
-
永远先转义再换行:顺序不可颠倒!若先替换
再转义,会导致 <br> 被输出为纯文本,而非实际换行。 - 避免 nl2br() 的 PHP 式误用:Java 无内置等效函数,需手动实现且确保安全性。
-
CSS 替代方案(可选):若模板可控,也可对容器元素设置 style="white-space: pre-wrap;",此时无需修改字符串,但需确保用户输入已整体转义:
<div style="white-space: pre-wrap;">{{unescaped_user_input}}</div>⚠️ 此方式仅适用于完全可信数据,否则存在 XSS 风险,不推荐。
✅ 总结:
正确处理动态换行的核心是「安全转义 + 显式
插入」。通过 StringEscapeUtils.escapeHtml4() 防御 XSS,再用 replace("\n", "
") 实现语义换行,即可在 SendGrid HTML 邮件中稳定、安全地呈现用户输入的多行文本。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










