使用SendGrid Java发送带动态换行HTML邮件的问题
解决方案:SendGrid Java发送HTML邮件保留换行和空格
为什么StringEscapeUtils.unescapeHtml4()无效?
unescapeHtml4()仅负责还原HTML转义字符(比如把<转回<),完全不处理换行符\n或空格的显示逻辑,所以对保留换行/空格的需求没用。
实用解决方法
方法1:用CSS样式处理(推荐)
利用CSS的white-space: pre-wrap属性,让HTML元素自动保留空格和换行,同时支持自动换行适应容器宽度,样式更自然。
- 实现方式:将动态内容包裹在带有该样式的HTML标签中,同时对用户输入做HTML转义防止XSS:
String userInput = "前端传入的带换行和空格的文本"; // 先转义特殊字符,再放入带样式的容器 String htmlContent = "<html><body>" + "<div style='white-space: pre-wrap; font-family: sans-serif;'>" + StringEscapeUtils.escapeHtml4(userInput) + "</div>" + "</body></html>";
方法2:手动替换换行和空格
如果不想依赖CSS,可以直接将文本中的换行符替换为HTML换行标签<br>,空格替换为 (解决多个连续空格被合并的问题):
String userInput = "前端传入的带换行和空格的文本"; // 先转义特殊字符,再替换换行和空格 String formattedText = StringEscapeUtils.escapeHtml4(userInput) .replace("\n", "<br>") .replace(" ", " "); String htmlContent = "<html><body>" + formattedText + "</body></html>";
方法3:使用<pre>标签
<pre>标签默认会保留所有空格和换行,但默认是等宽字体,可通过CSS调整样式:
String userInput = "前端传入的带换行和空格的文本"; String htmlContent = "<html><body>" + "<pre style='font-family: inherit; white-space: pre-wrap;'>" + StringEscapeUtils.escapeHtml4(userInput) + "</pre>" + "</body></html>";
关键注意事项
无论用哪种方法,必须先对用户输入做HTML转义(StringEscapeUtils.escapeHtml4()),防止恶意代码注入(XSS攻击)。
内容的提问来源于stack exchange,提问作者Ramesh G
相关产品推荐
相关产品推荐

