新用户注册后说没收到验证邮件,让他去垃圾箱里翻,果然躺在里面,邮件头里 spf=softfail。同一封信发到自己的企业邮箱却正常。日志里能对上时间点,这种反而好排。

SPF 里 -all 表示不在列表里的发信 IP 直接判失败,~all 只是标记软失败,收件方有权放行也有权降权,多数会直接投进垃圾箱。发信域名和实际出口 IP 不在同一条记录里时,这段落差就暴露出来了。这一点先确认清楚,后面就不用反复试。

dig +short TXT example.com | tr -d '"'
# v=spf1 include:_spf.example.net -all
php -r "var_dump(checkdnsrr('example.com', 'TXT'));"

围绕「SPF 软失败」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。

处理上按这个顺序:先把发信域名的 TXT 记录拉出来,数一遍 include 的段数,看着正常不代表最后一段写对了;改 -all 之前确认所有发信出口都在 include 里,改早了正常邮件也会被拒;用 dig 查一条记录,和发信服务商文档里的示例逐段对齐;改完用外部邮箱发一封注册信,看邮件头里 spf=pass 再收工。

结果对不对很好判断,外部邮箱收到的注册信不再进垃圾箱,邮件头里 spf=pass,dmarc 跟着通过。

作者 9823189