
当邮件头设置为 text/html 时,\n 换行符将被忽略,必须改用 标签;若需保留纯文本换行,则应使用 text/plain 并确保字符编码正确。本文详解两种方案的实现方式、代码示例及关键注意事项。
当邮件头设置为 `text/html` 时,`\n` 换行符将被忽略,必须改用 `
` 标签;若需保留纯文本换行,则应使用 `text/plain` 并确保字符编码正确。本文详解两种方案的实现方式、代码示例及关键注意事项。
在 PHP 中通过 mail() 发送表单数据时,开发者常希望邮件内容具备清晰的段落结构。但如问题所示:一旦将邮件头($headers)设为 'Content-type: text/html; charset=utf-8',原本使用 \n 实现的换行便完全失效——收件方看到的是一整段挤在一起的文字。根本原因在于:HTML 渲染引擎不解析 \n 或 \r\n 作为可视换行,只识别 )
标签或块级元素(如
✅ 方案一:保持 HTML 格式,改用
换行
这是最直接的修复方式。只需将消息字符串中的 \n 替换为
,并确保所有 HTML 特殊字符(如 , &)已转义,避免 XSS 或格式错乱:
$msg = "Antwort an: " . htmlspecialchars($useremail) . "<br>" .
"Name: " . htmlspecialchars($username . ' ' . $lastname) . "<br>" .
"Telefonnummer: " . htmlspecialchars($fon) . "<br>" .
"Nachricht: " . nl2br(htmlspecialchars($usermsg));⚠️ 注意:nl2br() 可将用户输入中的 \n 转为
,但务必先调用 htmlspecialchars() 防止恶意 HTML 注入。切勿省略转义!
✅ 方案二:改用纯文本格式(推荐用于简单通知)
若无需 HTML 样式,更安全、更兼容的做法是改用 text/plain 类型——此时 \n 恢复生效,且天然规避 XSS 风险:
立即学习“PHP免费学习笔记(深入)”;
$headers = 'Content-Type: text/plain; charset=utf-8' . "\r\n" .
'From: ' . $myemail . "\r\n";
// $msg 中继续使用 \n 换行(无需修改)
$msg = "Antwort an: $useremail\n" .
"Name: $username $lastname\n" .
"Telefonnummer: $fon\n" .
"Nachricht: $usermsg";? 提示:text/plain 是邮件客户端默认解析模式,兼容性极佳;而 text/html 易受客户端安全策略限制(如部分邮箱会屏蔽内联样式或禁用脚本),非必要不建议滥用。
? 关键总结
-
不要混用:text/html 头 + \n 换行 → 必然失效;text/plain 头 +
→ 会被当作普通字符显示。 - 始终过滤输入:无论选择哪种方案,对用户提交内容(尤其是 $usermsg)执行 htmlspecialchars() 是基本安全要求。
- 测试真实环境:Gmail、Outlook、Apple Mail 对 HTML 邮件的渲染差异较大,建议用多客户端验证换行效果。
- 进阶建议:生产环境应使用 PHPMailer 或 Symfony Mailer,它们自动处理编码、MIME 分界、附件及安全转义,大幅降低出错概率。











