SPF 配置了但测试显示 neutral 而不是 pass,怎么排查?

SPF 配置了但测试显示 neutral 而不是 pass,怎么排查?
问题原因:RFC 7208 §2.5 定义了 SPF 的七种结果码:pass(+)、fail(-)、softfail(~)、neutral(?)、none、temperror、permerror。neutral 的含义是"该机制既没有授权、也没有拒绝此次发信",相当于"无可奉告"。它通常不会导致邮件被拒收,但会让 DKIM 和 DMARC 评估缺少可靠的 SPF 支撑——如果 DMARC 策略设为 reject,neutral 的 SPF 结果很可能导致 DMARC fail。
Step 1 — 检查 all 机制前缀:运行 dig txt yourdomain.com +short 查看当前 SPF 记录。如果末尾是 ?all,表示"对所有未匹配的发信来源不做判断",这是 neutral 的最常见来源。RFC 7208 §4.2.2 建议生产环境使用 -all(硬失败),明确拒绝非授权来源。将 ?all 改为 -all 即可让未匹配来源返回 fail 而非 neutral。
Step 2 — 排查第三方 include:如果 all 已经是 -all 但仍返回 neutral,问题可能出在 include 的第三方域的 SPF 记录上。用 dig txt _spf.mailprovider.com +short 查看被 include 的域的 SPF 记录——如果对方的记录末尾也是 ?all 或者返回了 neutral,接收方会按 neutral 处理。
Step 3 — 确认发信 IP 在允许列表中:nslookup -type=txt yourdomain.com 确认 DNS 返回了完整 SPF 记录(无截断)。然后检查所有 ip4/ip6 机制是否覆盖了实际发信 IP。如果你的邮件服务器最近更换了出口 IP 或新增了发信节点,但 SPF 记录中的 ip4 机制未对应更新,该 IP 发出的邮件就会走 all 机制返回 neutral。
Step 4 — 验证工具自查:使用 dig txt yourdomain.com +short 配合在线 SPF 测试工具验证所有发信 IP,确保每个 IP 都能匹配到明确的 ip4/include/a 机制上,而不是落到 ?all 分支。

📎 RFC 7208 §2.5 SPF 结果码;RFC 7208 §4.2.2 "all" 机制