SPF 记录是什么,如何配置

SPF 是防邮件伪造的 DNS 认证机制,通过 TXT 记录声明哪些服务器有权以你的域名发信。本文讲清 SPF 语法机制、配置步骤与验证方法。

最佳实践
应用程序模块协作插画

直接回答:SPF(Sender Policy Framework)是一条发布在域名 DNS 中的 TXT 记录,列出被授权代表该域名发送邮件的服务器。 配置方法是在 DNS 服务商处添加形如 v=spf1 include:_spf.example.com ~all 的 TXT 记录。收信端据此验证 SMTP MAIL FROM(信封发件人)或 HELO/EHLO 身份的来源 IP,不直接验证读者看到的 From 头,最终收拒由接收方策略决定。

SPF 记录语法速览

v=spf1 ip4:203.0.113.10 include:_spf.google.com ~all
片段 含义
v=spf1 版本声明,必须是开头
ip4:203.0.113.10 授权该 IPv4 地址(可用 /24 等网段)
ip6: 授权 IPv6 地址
a 按连接地址族匹配域名 A/AAAA 结果
mx 授权域名 MX 记录指向的服务器
include:域名 递归评估另一域名的 SPF,只有其结果为 Pass 时此 include 机制才匹配
~all 返回 Softfail,接收方按本地策略处理
-all 返回 Fail,是否拒收取决于接收方策略
?all 返回 Neutral,不作来源授权断言(与 None 不同结果)

一条 SPF 记录里可组合多个机制,空格分隔。

配置步骤

1. 盘点发信来源

列出所有以你的域名发信的服务:自有邮件服务器 IP、企业邮箱(Google Workspace、Microsoft 365、腾讯企业邮等)、营销邮件平台、应用服务器(工单/告警通知)。漏配可能导致 SPF 不通过,但结果还取决于实际 MAIL FROM/HELO 域、其他机制及接收方策略,不能直接断定邮件伪造。

2. 检查现有记录

dig TXT example.com | grep spf

同一身份域不能发布多个 v=spf1 策略记录;一条 TXT 记录可以包含多个字符串片段,接收时拼接,这不等于多条策略。已有策略应修改合并。

3. 编写并添加 TXT 记录

下面仅为语法示例。include 值必须来自实际邮件服务商当前文档,不能把示例服务商加入不使用其服务的域名。

到 DNS 服务商控制台添加:

  • 类型:TXT
  • 主机记录:@(根域名)或对应子域名
  • 值:v=spf1 mx include:spf.mxhichina.com ~all(按你的实际来源写)

4. 验证

dig TXT example.com

或用在线 SPF 校验工具检查语法、DNS 查询次数与覆盖范围。发测试邮件到 Gmail,查看接收方生成的 Authentication-Results/Received-SPF;一次 Pass 只验证此次来源与身份,不代表所有路径已覆盖。

关键限制:10 次 DNS 查询上限

SPF 规范要求一次校验中 include、a、mx、redirect 等机制触发的 需要 DNS 查询的机制/修饰符求值项累计不得超过 10 个,这不是简单统计实际 UDP/TCP DNS 包数;超限返回 PermError。嵌套 include 也要计入。来源多时要:

  • 优先用 ip4:/ip6: 直接列地址(不占查询次数)
  • 合并同一服务商的 include
  • 谨慎评估扁平化:手工固定服务商动态 IP 会过期,应优先采用服务商支持的方案并维护变更

与其他邮件认证机制的关系

SPF 只解决"来源服务器是否合法",完整的反伪造体系还有:

  • DKIM:对邮件内容签名,证明内容未被篡改
  • DMARC:在 SPF/DKIM 基础上定义处置策略并回收报告,结合可见 From 域对齐和报告逐步评估 quarantine/reject,不能不盘点转发与合法来源就收紧

三者可帮助身份认证和反伪造,但不能保证域名信誉或送达。

常见问题(FAQ)

Q:~all 和 -all 怎么选?
A:刚配置时用 ~all(软拒绝)观察一段时间,确认所有合法发信来源都被覆盖后再收紧到 -all。一开始就 -all 容易误伤自己漏配的服务。

Q:配了 SPF 为什么邮件还是进垃圾箱?
A:SPF 只是因素之一。检查 DKIM 签名、DMARC 策略、发信 IP 信誉、反向解析(PTR 记录)是否齐全;营销类邮件还与内容、投诉率有关。

Q:子域名的邮件需要单独配 SPF 吗?
A:需要。SPF 不从父域继承;应在实际 MAIL FROM 域(或所检查的 HELO 域)发布策略,不是仅按邮件服务器主机名决定;不从某子域发信也应显式配置 v=spf1 -all 防止被滥用。

参考资料

本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台