JavaMail API:如何在HTML邮件中保留内容换行格式
解决JavaMail HTML邮件换行丢失的问题
首先,我注意到你的代码里有一个明显的HTML结构错误——你最后拼接的是"/<div>",这应该是"</div>"才对!标签闭合错误会导致浏览器无法正确识别你的样式规则,这也是white-space: pre-wrap没生效的关键原因之一。
接下来,咱们一步步解决格式保留的问题:
1. 修复HTML结构错误
先把你的createEmailContent方法里的闭合标签改对:
private static String createEmailContent(String descp) { StringBuilder sb = new StringBuilder("<style> div { white-space: pre-wrap;}</style><div>"); sb.append(descp); sb.append("</div>"); // 这里把"/<div>"改成"</div>" return sb.toString(); }
2. 正确处理换行符
HTML默认会忽略文本中的\r\n和多余空格,即使设置了pre-wrap,有时候也需要确保换行符被浏览器正确识别。你有两个可选方案:
方案A:将\r\n转换为HTML换行标签<br>
直接把原字符串中的换行符替换成HTML的换行元素,这样不管样式如何,换行都会生效:
private static String createEmailContent(String descp) { // 先替换换行符 String formattedDescp = descp.replaceAll("\r\n", "<br>"); StringBuilder sb = new StringBuilder("<style> div { white-space: pre-wrap;}</style><div>"); sb.append(formattedDescp); sb.append("</div>"); return sb.toString(); }
方案B:确保pre-wrap样式生效并保留原始换行
如果你想完全保留原始的空格和换行格式,除了修复标签闭合,还可以把div换成<pre>标签(或者给div加上pre的特性),同时注意转义HTML特殊字符(比如<、>、&等,避免破坏HTML结构):
private static String createEmailContent(String descp) { // 转义HTML特殊字符 String escapedDescp = org.apache.commons.text.StringEscapeUtils.escapeHtml4(descp); StringBuilder sb = new StringBuilder("<style> pre { white-space: pre-wrap;}</style><pre>"); sb.append(escapedDescp); sb.append("</pre>"); return sb.toString(); }
(如果没有Apache Commons库,也可以自己实现简单的字符转义,比如替换&为&,<为<等)
3. 验证邮件内容类型
确保你确实把邮件的内容类型设置为text/html; charset=utf-8,比如:
message.setContent(createEmailContent(descp), "text/html; charset=utf-8");
这样处理后,收件人收到的邮件就会和你原输入的格式完全一致了。
内容的提问来源于stack exchange,提问作者roger_that
相关产品推荐
相关产品推荐

