You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP脚本发送邮件因broken headers致X-Spam评分过高,如何修复?

修复PHP邮件头以降低垃圾邮件评分

首先,邮件头损坏是垃圾邮件检测的高频触发点,我来帮你梳理最容易踩坑的问题和对应的修复方案:

1. 严格遵循RFC标准的邮件头格式

邮件头的每一行必须是键: 值的规范格式,冒号前后的空格不能乱加:

  • 错误示例:From : user@example.com(冒号后多空格)、Subject:Hello World(冒号后缺空格)
  • 正确示例:From: user@example.com、Subject: Hello World

另外,头与头之间的分隔必须用\r\n(Windows和Linux服务器都兼容),只用\n会被判定为损坏的头结构。

2. 必须包含核心邮件头

缺少这些头会直接被标记为可疑邮件:

  • From: 必须是和发送服务器域名匹配的有效邮箱(比如用noreply@yourdomain.com,别随便填陌生邮箱)
  • Reply-To: 可选但建议添加,指定用户回复的目标邮箱,可与From不同
  • Subject: 不能为空,避免全大写、过多特殊符号(比如!!!、$$$)
  • Date: PHP的mail()函数会自动生成,但如果手动设置,必须符合RFC 2822格式(比如Tue, 15 Nov 1994 08:12:31 -0500)

3. 放弃手动拼接,用可靠方式传递头信息

手动拼接头字符串很容易出错,推荐两种更稳妥的做法:

方式一:正确使用mail()的头参数

别把Subject这类专属参数混到头里,也别乱用换行:

// 错误示范
$headers = "From: user@example.com\n";
$headers .= "Subject: 测试邮件\n"; // Subject是mail()的第二个参数,不该放这里

// 正确写法
$to = 'recipient@example.com';
$subject = '你的邮件主题';
$message = '邮件内容';
$headers = "From: noreply@yourdomain.com\r\n";
$headers .= "Reply-To: support@yourdomain.com\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n"; // 发送HTML邮件必须加这个

mail($to, $subject, $message, $headers);

方式二:用专业邮件库自动处理头

手动处理头太容易踩坑,PHPMailer或SwiftMailer这类库会自动生成符合标准的所有必要头:

require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';

$mail = new PHPMailer\PHPMailer\PHPMailer();
$mail->isSMTP();
$mail->Host = '你的主机SMTP服务器地址';
$mail->SMTPAuth = true;
$mail->Username = '你的邮箱账号';
$mail->Password = '你的邮箱密码';
$mail->SMTPSecure = 'tls'; // 或ssl,根据主机要求选择
$mail->Port = 587; // 对应tls的标准端口

$mail->setFrom('noreply@yourdomain.com', '你的品牌名称');
$mail->addAddress('recipient@example.com');
$mail->Subject = '合规的邮件主题';
$mail->isHTML(true);
$mail->Body = '<h1>你的HTML邮件内容</h1>';

$mail->send();

这类库会自动处理Date、Message-ID、MIME-Version等细节,完全避免手动拼接的错误。

4. 正确转义特殊字符

如果头里包含中文、引号或逗号,必须做转义处理:

  • 发件人名称有特殊字符时,用双引号包裹:From: "Your Brand Name" <noreply@yourdomain.com>
  • 中文名称要转成MIME编码:
$fromName = '你的品牌名称';
$encodedName = mb_encode_mimeheader($fromName, 'UTF-8', 'B');
$headers = "From: $encodedName <noreply@yourdomain.com>\r\n";

5. 避免添加可疑或无效头

  • 不要伪造Received头(服务器会自动生成,手动添加会被视为篡改)
  • X-Mailer可以加,但别填Custom PHP Script这种模糊内容,建议填具体库名或品牌名

额外测试技巧

发送测试邮件后,在邮箱里选择“显示原始邮件”,检查头部分:

  • 有没有前导空格(RFC不允许头行开头有空格,除非是合规的换行续行)
  • 有没有缺失的冒号
  • 有没有无效的邮箱地址

如果能提供你的具体PHP代码片段,我可以帮你精准定位问题!

内容的提问来源于stack exchange,提问作者curious_guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:43:41