
当使用 Content-type: text/html 设置邮件头时,\n 换行符将失效,因为 HTML 不识别纯文本换行;必须改用 标签或切换为 text/plain 类型才能使 \n 生效。
当使用 `content-type: text/html` 设置邮件头时,`\n` 换行符将失效,因为 html 不识别纯文本换行;必须改用 `
` 标签或切换为 `text/plain` 类型才能使 `\n` 生效。
在 PHP 中通过 mail() 发送邮件时,消息体中的换行效果完全取决于 Content-Type 头部的设置。你遇到的问题——定义 UTF-8 编码后换行失效——根本原因并非 charset=utf-8,而是 Content-type: text/html。HTML 渲染引擎会忽略所有 \n 和 \r\n,仅将
、
等标签解析为实际换行。
✅ 正确解决方案(二选一)
方案一:保持 HTML 邮件 → 使用
替代 \n
$msg = "Antwort an: $useremail<br>" .
"Name: $username $lastname<br>" .
"Telefonnummer: $fon<br>" .
"Nachricht: $usermsg";
$headers = 'Content-Type: text/html; charset=utf-8' . "\r\n" .
'From: ' . $myemail . "\r\n";⚠️ 注意:HTML 邮件中若需保留段落结构,建议使用
或更语义化的包裹每行;同时确保所有用户输入已进行 HTML 实体转义(如 htmlspecialchars($usermsg, ENT_HTML5, 'UTF-8')),防止 XSS 或格式错乱。
方案二:改用纯文本邮件 → 保留 \n 并指定 text/plain
$msg = "Antwort an: $useremail\n" .
"Name: $username $lastname\n" .
"Telefonnummer: $fon\n" .
"Nachricht: $usermsg";
$headers = 'Content-Type: text/plain; charset=utf-8' . "\r\n" .
'From: ' . $myemail . "\r\n";✅ 优势:无需转义 HTML 特殊字符,\n 直接生效,兼容性极佳;适合内容简洁、无样式需求的系统通知类邮件。
? 关键注意事项
-
不要混用类型与换行方式:text/html + \n = 换行丢失;text/plain +
= 原样显示标签文字。 - 始终验证并过滤用户输入:无论哪种方案,都应使用 filter_var() 或 trim() 清理 $_POST 数据,避免空值、恶意脚本或头部注入(如 CRLF 注入攻击)。
- 调试技巧:发送测试邮件后,查看原始邮件源码(Gmail → 点击右上角「⋮」→「显示原始邮件」),确认 Content-Type 和换行符是否按预期存在。
? 总结
换行失效的本质是 MIME 类型与内容格式不匹配。选择 text/html 就要用 HTML 语法控制排版;选择 text/plain 则可直接使用 \n。根据实际需求权衡——对外展示邮件推荐 HTML(支持加粗/链接),后台日志类通知推荐纯文本(安全、稳定、易维护)。
立即学习“PHP免费学习笔记(深入)”;











