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

配置DKIM/DMARC/SPF后PHP邮件仍无法发送至Gmail,求排查

排查PHP邮件无法送达Gmail的问题

一、先检查DNS配置的匹配性

  • SPF记录的域名与发件人不匹配:你当前的SPF记录绑定在SUBDOMAIN.DOMAIN子域名上,但如果PHP发邮件时From头用的是主域名DOMAIN,这条SPF完全不会生效。另外,如果你的PHP是用本地服务器sendmail发件(而非调用Google邮件服务),include:_spf.google.com覆盖不了你的服务器IP,会直接导致SPF验证失败——得把服务器公网IP加到SPF规则里,比如改成v=spf1 ip4:你的服务器IP include:_spf.google.com ~all。
  • DKIM的选择器与发件域名不匹配:你的DKIM记录是dkim._domainkey.SUBDOMAIN.DOMAIN,意味着只有当邮件用dkim这个选择器签名,且发件人域名是SUBDOMAIN.DOMAIN时,DKIM才会验证通过。要确认PHP发邮件时是否配置了用该选择器签名,同时发件人域名要和DKIM绑定的域名一致。另外,公钥值要确保复制完整,无多余空格或换行。
  • DMARC的验证报告利用:你当前的DMARC是p=none,只会收集验证报告不会主动拦截,但如果SPF/DKIM全验证失败,Gmail照样会拒收或扔进垃圾邮件。先确认rua里的邮箱能收到DMARC报告,从报告里能直接看到是SPF还是DKIM出了问题。如果用子域名发件,主域名的DMARC默认覆盖子域名,也可以给子域名单独添加_dmarc.SUBDOMAIN.DOMAIN记录。

二、PHP发邮件的细节问题

  • 强制指定Return-Path与发件人一致:PHP的mail()函数默认会用服务器主机名(比如xxx.local)作为Return-Path,这会导致SPF验证的域名和发件人域名不匹配,直接触发拒收。必须用-f参数指定和From一致的域名邮箱:
    mail('xxx@gmail.com', '邮件标题', '邮件内容', 'From: noreply@SUBDOMAIN.DOMAIN', '-f noreply@SUBDOMAIN.DOMAIN');
    
  • 规范邮件格式:Gmail对邮件头要求严格,缺失Content-Type头(比如text/plain; charset=UTF-8)很容易被判定为垃圾邮件。同时,邮件内容要避开垃圾邮件关键词,比如大量广告话术、敏感词汇。
  • 检查服务器IP信誉:如果你的服务器IP曾被用于发送垃圾邮件,就算SPF/DKIM配置正确,Gmail也会拒收。可以查一下IP是否在反垃圾黑名单(如Spamhaus)中。

三、需要添加的额外邮件头

这些头信息能提升邮件可信度,建议补充:

  • Reply-To:指定回复邮箱,和From保持一致即可
  • Content-Type:明确邮件内容类型与编码
  • Message-ID:每个邮件唯一的ID,避免被Gmail判定为重复邮件,PHP默认可能不会生成,手动添加更稳妥

示例代码:

$headers = "From: noreply@SUBDOMAIN.DOMAIN\r\n";
$headers .= "Reply-To: noreply@SUBDOMAIN.DOMAIN\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
$headers .= "Message-ID: <" . uniqid() . "@SUBDOMAIN.DOMAIN>\r\n";

mail('xxx@gmail.com', '标题', '内容', $headers, '-f noreply@SUBDOMAIN.DOMAIN');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:12:17