
当 PHP 邮件头设置为 Content-type: text/html 时,纯文本换行符 \n 将被忽略;需改用 HTML 标签(如 )或切换为纯文本格式,才能确保邮件内容中的换行正常显示。
当 php 邮件头设置为 `content-type: text/html` 时,纯文本换行符 `\n` 将被忽略;需改用 html 标签(如 `
`)或切换为纯文本格式,才能确保邮件内容中的换行正常显示。
在使用 PHP 的 mail() 函数发送表单数据时,一个常见误区是:为支持中文等 Unicode 字符而设置了 UTF-8 编码的 HTML 邮件头(如 'Content-type: text/html; charset=utf-8'),却未意识到这会彻底改变邮件正文的解析方式——邮件客户端将按 HTML 规则渲染内容,而非纯文本。此时,原本有效的换行符 \n 或 \r\n 将被浏览器/邮件阅读器直接忽略(HTML 中连续空白符(含换行)默认折叠为单个空格),导致所有信息挤在一行,可读性严重受损。
✅ 正确解决方案(二选一)
方案一:保持 text/html 类型,改用 HTML 换行标签
将消息字符串中的 \n 替换为
,并确保整个 $msg 是合法的 HTML 片段(建议添加简单
$msg = "<html><body>" .
"Antwort an: " . htmlspecialchars($useremail) . "<br>" .
"Name: " . htmlspecialchars($username) . " " . htmlspecialchars($lastname) . "<br>" .
"Telefonnummer: " . htmlspecialchars($fon) . "<br>" .
"Nachricht: " . nl2br(htmlspecialchars($usermsg)) .
"</body></html>";? 关键说明:
- htmlspecialchars() 防止用户输入中恶意 HTML/JS 被执行(XSS 风险);
- nl2br() 可将用户消息中可能存在的原始换行自动转为
,提升健壮性;- 包裹 提高 Outlook、Apple Mail 等客户端的渲染一致性。
方案二:改用 text/plain 类型,保留 \n 换行
若无需富文本格式,更推荐回归纯文本模式——语义清晰、无 XSS 风险、换行天然生效:
立即学习“PHP免费学习笔记(深入)”;
$headers = 'Content-Type: text/plain; charset=utf-8' . "\r\n" .
'From: ' . $myemail . "\r\n";
$msg = "Antwort an: $useremail\n" .
"Name: $username $lastname\n" .
"Telefonnummer: $fon\n" .
"Nachricht: $usermsg";⚠️ 注意事项:
- text/plain 下仍需确保 $msg 使用 \n(Unix 风格换行),PHP 在 Windows 环境中建议显式用 \n 而非 PHP_EOL,以避免部分邮件服务器处理异常;
- UTF-8 编码在 text/plain 中依然有效,中文等字符可正常显示。
? 最佳实践总结
- 优先选择 text/plain:联系表单类邮件通常无需样式,纯文本更安全、简洁、可靠;
- 若必须 HTML,请严格转义 + 结构化:永远对用户输入调用 htmlspecialchars(),避免注入;
- 切勿混用格式:不要在 text/html 头下发送纯文本内容,也不要在 text/plain 头下插入 HTML 标签;
- 补充验证与错误处理:当前代码中 header("location:index.html?error") 后未 exit(),可能导致后续 mail() 执行,应添加 exit; 阻断流程。
通过明确内容类型与换行机制的对应关系,即可彻底解决“定义 header 后换行失效”这一高频问题。











