本文介绍如何将前端提交含换行符(n)的动态文本,在 SendGrid Java SDK 发送的 HTML 邮件中正确显示为换行,核心方案是将换行符安全转换为 <br> 标签,并避免 XSS 风险。
本文介绍如何将前端提交含换行符(n)的动态文本,在 sendgrid java sdk 发送的 html 邮件中正确显示为换行,核心方案是将换行符安全转换为 `
` 标签,并避免 xss 风险。
在使用 SendGrid Java SDK 发送 HTML 邮件时,若模板中需插入用户从表单(如 textarea)提交的富文本内容,常见问题是:前端输入的换行符 n 或 rn 在 HTML 中默认不被渲染为可视换行——浏览器会将其合并为空格,导致邮件内容“挤成一行”。
根本原因:HTML 规范中,纯文本内的换行符(n)不会触发换行;必须显式使用 <br> 标签或 CSS(如 white-space: pre-wrap)才能保留格式。
✅ 推荐解决方案:服务端预处理 + 安全转义
不要依赖 StringEscapeUtils.unescapeHtml4()(它用于解码 HTML 实体,如
立即学习“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,rn 已被标准化为 n) return escaped.replace("n", "<br>");}
然后在 SendGrid 模板中直接使用该处理后的字符串:
Email from = new Email("[email protected]");String subject = "Your Dynamic Email";Email to = new Email("[email protected]");// 假设 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)
⚠️ 关键注意事项:
<div style="white-space: pre-wrap;">{{unescaped_user_input}}</div>
⚠️ 此方式仅适用于完全可信数据,否则存在 XSS 风险,不推荐。
✅ 总结:
正确处理动态换行的核心是「安全转义 + 显式 <br> 插入」。通过 StringEscapeUtils.escapeHtml4() 防御 XSS,再用 replace("n", "<br>") 实现语义换行,即可在 SendGrid HTML 邮件中稳定、安全地呈现用户输入的多行文本。