PHP发送HTML格式邮件时$message内的回车换行不生效如何解决
PHP发邮件时换行失效的解决办法
问题核心原因
你在headers中指定了邮件格式为Content-Type: text/html; charset=UTF-8,也就是HTML类型邮件:
在HTML规范中,普通文本里的回车换行符不会被渲染为可见换行,只有
<br>标签、<p>等块级元素的间距才会产生换行效果,这就是你设置的换行失效的直接原因。
两种可行的修复方案
方案1:保留HTML邮件格式,修改内容的换行写法
将$message里的所有手动换行替换为HTML的<br>换行标签即可,修改后的代码示例:
$message = "Dear ".$row['user']."<br> The report you ran (".$row['report_name'].") has finished <br> Thanks<br> Matchmaker."; $subject = "Report has finished successfully"; $headers = "From: test@test.com\r\n"; $headers .= "Reply-To: test@test.com\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; // 注意此处$row['login']要加单引号,避免PHP将login识别为常量抛出警告 mail($row['login'], $subject, $message, $headers);
方案2:改为纯文本邮件格式,保留原换行写法
如果你不需要HTML格式的富文本内容,可以直接修改headers里的Content-Type为纯文本类型,原有的回车换行就会自动生效:
// 仅需要修改headers中的这一行即可 $headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
额外注意事项
- 邮件相关的换行官方标准为
\r\n(Windows风格换行),不要单独使用\n,避免部分兼容性较差的邮件客户端解析异常 - 数组键名如果是字符串必须加引号,
$row[login]建议改为$row['login'],否则PHP会先尝试将login识别为常量,未定义时才会当做字符串处理,会产生不必要的运行时警告
内容的提问来源于stack exchange,提问作者Matias
相关产品推荐
相关产品推荐

