SPF 或 DMARC 检测工具只是读取几条 DNS TXT 记录,并告诉你它们能否被正确解析。你完全可以自己执行同样的查询,而且直接阅读记录比看一个“通过”结果得到的信息更多:哪些服务器可以以你的域名发信、接收方应如何处理验证失败的邮件,以及报告会发送到哪里。
本文介绍每种机制检查什么、如何读懂记录、如何稳妥地收紧 DMARC 策略、不发信的域名应发布什么记录,以及 Gmail、Yahoo 和 Outlook.com 的要求。文中所有域名和 IP 地址均为示例。
本指南的适用范围
免费的上线准备快照会读取你所输入的确切主机名上的 SPF、DMARC、MTA-STS 和 CAA 记录。它不检查 DKIM,不展开 SPF 的 include: 项,不获取 MTA-STS 策略文件,也不会去查找父域名上的记录。
SPF、DKIM 和 DMARC 分别检查什么
| 机制 | 发布位置 | 接收方检查内容 | 所覆盖的域名 |
|---|---|---|---|
| SPF | example.com 上的 TXT 记录 | 发信服务器的 IP 地址是否在列表中? | 信封发件人(MAIL FROM,之后显示为 Return-Path) |
| DKIM | selector._domainkey.example.com 上的 TXT 记录 | 签名能否用已发布的密钥验证? | d= 中的签名域名 |
| DMARC | _dmarc.example.com 上的 TXT 记录 | SPF 或 DKIM 是否在与 From 对齐的域名上通过? | 读者看到的 From 域名 |
SPF 和 DKIM 都可能针对读者根本看不到的域名通过验证。DMARC 通过对齐(alignment)弥补了这个缺口:只要 SPF 或 DKIM 在与 From 域名对齐的域名上通过,邮件即通过,一项对齐通过就足够。默认的宽松对齐只要求组织域名相同,因此 bounce.example.com 与 example.com 对齐。严格对齐则要求完全一致。
假设有一个新闻邮件服务,可以说明这一点的重要性。它以 news@example.com 的名义发信,却使用自己位于 example.net 的退信域名作为信封发件人。SPF 对 example.net 通过,但并不对齐,所以只有该服务以 d=example.com 进行 DKIM 签名,DMARC 才会通过。
如何用 dig 或 nslookup 查询记录
只需要 dig(Linux、macOS)或 nslookup(Windows):
dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short MX example.com
nslookup -type=TXT _dmarc.example.comSPF 记录是以 v=spf1 开头的 TXT 记录;其他服务的验证令牌常常与它并排存在。DMARC 记录是 _dmarc 下以 v=DMARC1 开头的 TXT 记录。SPF 应在信封发件人域名上检查,它可能与 From 域名不同;已送达邮件的 Return-Path 头可以显示它。
DKIM 密钥无法从外部列出,因为每个密钥都位于某个选择器之下。请在你发送的邮件的 DKIM-Signature 头中读取 s= 和 d= 的值,再查询对应名称,例如 dig +short TXT s1._domainkey.example.com。
修改之后,解析器在 TTL 到期前可能仍返回旧结果。要查看当前实际发布的内容,请用 dig +short NS example.com 找到权威服务器,并直接向其查询:dig +short TXT example.com @ns1.example.net。然后向你自己控制的邮箱发送一封真实邮件,查看其 Authentication-Results 头。它显示接收方对 SPF、DKIM 和 DMARC 的判定,而这才是真正算数的结果。
如何读懂 SPF 记录
v=spf1 ip4:192.0.2.10 include:_spf.mail.example.net -all机制从左到右依次评估,第一个匹配的机制决定结果。每个机制可以带一个限定符:+ 通过(默认)、- 失败、~ 软失败、? 中性。
| 项 | 匹配条件 | DNS 查询 |
|---|---|---|
ip4: / ip6: | IP 地址在所列范围内 | 否 |
a / mx | IP 地址属于该域名或其某个 MX 主机 | 是 |
include: | 另一个域名的记录返回通过 | 是,且包含其内部的每一次查询 |
exists:、ptr、redirect= | 较少使用;RFC 7208 指出不应使用 ptr | 是 |
all | 始终匹配;为之前未匹配的所有服务器设定结果 | 否 |
~all 还是 -all
~all 表示未列出的服务器很可能未获授权,接收方不应仅凭此拒收。-all 表示它们未获授权;之后如何处理取决于接收方自己的策略。两者都合理,德国 BSI 也接受任一种。RFC 9989 补充了一点提醒:使用 -all 时,在 SMTP 会话早期就检查 SPF 的接收方,可能拒收本来能凭对齐 DKIM 通过的邮件(典型的是转发邮件),而这种拒收不会出现在 DMARC 报告中。?all 或完全没有 all,对未列出的服务器不作任何表态。+all 会让互联网上任何 IP 地址都通过,切勿发布。
10 次查询上限
接收方最多评估 10 个会触发 DNS 查询的项,被包含记录内部的项也计算在内(第 4.6.4 节)。超过后结果为 permerror,SPF 就无法再帮助邮件通过 DMARC。另有一个单独的上限针对没有返回答案的查询:超过两次这样的查询也应以 permerror 告终。记录里看起来只有四项,也可能因为被包含的记录里还有自己的 include 而超限,所以要递归计数。要降到上限以下,可以删除不再使用的服务,对你控制的地址改写为 ip4/ip6,并把大批量服务迁到各自的退信子域名,使用独立的 SPF 记录。把服务商的 IP 范围复制进你的记录(即“展平”)会在服务商变更地址后过期。
每个名称只能有一条记录
同一名称上有两条以 v=spf1 开头的 TXT 记录会产生 permerror,请合并。超过 255 个字符的记录要写成单条 TXT 记录中的多个带引号字符串,接收方会不加空格地将它们拼接。SPF 也不会继承:example.com 上的记录并不覆盖 mail.example.com,所以每个用作信封发件人的名称都需要自己的记录。
如何读懂 DMARC 记录
DMARC 现已成为 RFC 9989(2026 年 5 月),是取代 RFC 7489 的标准轨道规范。记录仍位于 _dmarc,并以 v=DMARC1 开头:
v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; adkim=r; aspf=r| 标签 | 含义 |
|---|---|
v=DMARC1 | 必须是第一个标签,否则整条记录被忽略 |
p | none(仅监控)、quarantine(视为可疑)或 reject;没有 p 的记录按 none 处理 |
sp / np | sp 用于已存在的子域名,np 用于不存在的子域名;np 先回退到 sp,再回退到 p |
rua | 聚合报告的接收地址;没有它就不会发送报告 |
adkim / aspf | r 宽松(默认)或 s 严格对齐 |
t=y | 新增:要求接收方在已发布策略的基础上降低一个级别执行(reject 按 quarantine,quarantine 按 none) |
pct | 已移除;RFC 指出 0 和 100 以外的值在实际应用中并不一致 |
example.com 上的记录也覆盖没有自己记录的子域名;接收方通过 RFC 9989 所称的 DNS 树遍历(DNS Tree Walk)找到它。发送聚合报告的接收方会以 XML 文件的形式提交,通常每天一次,列出以你的域名发信的 IP 地址及其结果。如果 rua 指向另一个组织域名(例如报告服务),该域名必须发布一条以 v=DMARC1 开头、名称形如 example.com._report._dmarc.reports.example.net 的 TXT 记录(RFC 9990,第 4 节),否则接收方会忽略该地址。
从 none 到 reject
- 列出所有以该域名发信的服务:邮箱平台、新闻邮件、CRM、账单、客服系统、网站表单。
- 发布带
rua的p=none,并阅读报告。 - 逐一修复合法来源,直到它们在对齐的情况下通过,优先采用 DKIM,因为 DKIM 通常在转发后依然有效,而 SPF 不能。
- 升级到
quarantine,可先配合t=y,然后再考虑reject。
RFC 9989 指出,用户会向邮件列表发信的域名 SHOULD NOT 发布 reject;仍想使用的域名应先在 none 阶段至少停留一个月,再在 quarantine 阶段停留同样长的时间,并比较结果。任何发布 reject 的域名都 MUST 用 DKIM 为邮件签名。德国 BSI TR-03182 的立场更严格:发信域名 SHOULD 要求 reject。只用于发票和通知的域名,与员工用来参与邮件列表的域名是不同情形。RFC 9989 还要求接收方不要仅凭 p=reject 就拒收,但也承认在实践中,From 行未改动的列表邮件经常被拒收。
不发信的域名
停放域名、防拼写错误域名和仅用于跳转的域名,仍可能出现在伪造的 From 行中。RFC 7208 把为不发信域名设置 SPF 记录称为成熟的最佳实践。以下是一个假设的停放域名的完整记录集:
example.net. TXT "v=spf1 -all"
_dmarc.example.net. TXT "v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com"
example.net. MX 0 .该 SPF 记录不授权任何人,而 p=reject 在这里没有代价,因为不存在会被误伤的合法邮件。RFC 7505 中的空 MX 表示该域名不接收邮件,因此报告发送到 example.com,后者必须发布 example.net._report._dmarc.example.com。BSI TR-03182 将这一组合列为未使用域名的 MUST 要求。DMARC 策略覆盖子域名,但 SPF 不覆盖,所以任何有自己 A 或 MX 记录的子域名也应设置 v=spf1 -all。
Gmail、Yahoo 和 Outlook.com 对发件人的要求
| 服务商 | 谁算大批量发件人 | 所有发件人 | 大批量发件人还需要 |
|---|---|---|---|
| Gmail(个人账户) | 每天向个人 Gmail 账户发送接近 5,000 封或更多邮件,按主域名计算;一旦达到,该身份永久保留 | SPF 或 DKIM、正向和反向 DNS、TLS、垃圾邮件率低于 0.3% | SPF 和 DKIM、DMARC(接受 p=none)、对齐、营销邮件的一键退订 |
| Yahoo | 未公布门槛 | SPF 或 DKIM、正向和反向 DNS、垃圾邮件率低于 0.3% | SPF 和 DKIM、通过 DMARC 且至少为 p=none、在 2 天内处理一键退订 |
| Outlook.com(hotmail.com、live.com、outlook.com) | 每天超过 5,000 封邮件 | 该公告未涉及 | SPF 和 DKIM 通过,DMARC 至少为 p=none 且与 SPF 或 DKIM 对齐;自 2025 年 5 月 5 日起执行 |
自 2025 年 11 月起,Gmail 一直在加强执行力度,包括拒收邮件。Google 的规则针对个人 Gmail 账户,不包括 Google Workspace 收件人。Google 和 Yahoo 要求 DKIM 密钥至少 1024 位。Microsoft 会以 550 5.7.515 拒收不符合要求的邮件。三家都接受 p=none,它满足规则,但对伪造邮件没有表达任何处理倾向;请把它当作一个阶段,而不是最终配置。
MTA-STS 和 CAA:另外两条需要检查的记录
MTA-STS(RFC 8461)保护收件:它告诉发件方,除非你的 MX 主机提供带受信任证书的 TLS,否则不要投递。它需要在 _mta-sts.example.com 上有一条 TXT 记录,例如 v=STSv1; id=20261001000000Z;,以及位于 https://mta-sts.example.com/.well-known/mta-sts.txt 的策略文件,其中列出模式、MX 名称和 max_age。先从 testing 模式开始,此时发件方仍会投递,并在 _smtp._tls.example.com 配置了 TLS 报告时上报失败,然后再切换到 enforce。每次策略变更时都要更改 id。
CAA(RFC 8659)指明哪些证书颁发机构可以为该域名签发 TLS 证书,例如 CAA 0 issue "ca.example.net"。公共 CA 在签发前必须检查它;它无法阻止已获授权的 CA 错误签发,浏览器也不使用它。example.com 上的记录覆盖没有自己记录的子域名。请列出你使用的所有 CA,包括 CDN 所用的,否则续期可能失败。TLS 与安全响应头指南对证书有更详细的介绍。
常见的 SPF 和 DMARC 错误及修复方法
| 错误 | 影响 | 修复 |
|---|---|---|
同一名称上有两条 v=spf1 记录 | permerror | 合并为一条 TXT 记录,过长时拆分为多个字符串 |
| 计入 include 后超过 10 次查询 | permerror | 删除不用的 include,改用 ip4/ip6 |
+all、?all 或没有 all | +all 让所有服务器通过;其他情况不排除任何服务器 | 以 ~all 或 -all 结尾 |
| 某服务只在它自己的退信域名上通过 SPF | 未对齐 | 用你的域名进行 DKIM 签名 |
DMARC 发布在域名本身,或 v=DMARC1 不在最前 | 找不到或被忽略 | 发布在 _dmarc,版本标签放最前 |
rua 指向另一个域名但未授权 | 收不到报告 | 添加 _report._dmarc 记录 |
有来源仅依赖 SPF 时就设置 p=reject | 转发邮件失败 | 先为每个来源配置 DKIM |
用低于 100 的 pct 逐步推行策略 | 已从标准中移除;部分比例的应用并不均匀 | 去掉 pct;测试时使用 t=y |
免费上线准备快照会检查你的邮件 DNS 哪些方面
免费的上线准备快照无需注册,对一个公开源站运行八项被动检查。它不是渗透测试,也不是六个领域的审计。八项检查中有一项读取邮件 DNS 记录:
- 确切主机名。MX、TXT、
_dmarc、_mta-sts和 CAA 都在你输入的主机名上查询,不会回退到父域名。www.example.com 上缺少记录,并不意味着 example.com 没有保护。若要读取邮件域名的记录,请直接输入该域名本身(输入 example.com 而不是 www.example.com);它需要能解析到一个地址,快照才能给出评分。 - SPF。只有主机存在 MX 记录时,缺少记录才会被标记(中等)。
+all被标记为高风险,?all为低风险;~all和-all不产生任何提示。超过十个会触发 DNS 查询的项会被标记(中等),但只统计顶层记录中的项,因为不会跟进include:。 - DMARC。只有主机存在 MX 记录时,缺少记录才会被标记(中等)。
p=none被标记为监控模式(低),quarantine 或 reject 视为通过。sp、pct、rua和对齐不在评估范围内。 - MTA-STS 和 CAA。只有主机存在 MX 记录时,缺少
_mta-stsTXT 记录才会被标记(低);不会获取策略文件。任何 CAA 记录都视为通过,没有则是低级别信号;其内容不会与你的证书比对。 - 不检查:DKIM、TLS 报告和 DNSSEC。
你会得到一个评分和等级、一个加固等级、风险信号和通过检查的数量、最多三条按严重程度排序的信号,以及每一项检查(包括每个邮件 DNS 行)及其评级。无法解析到地址的名称没有评分。网站上线检查清单逐一讲解全部八项检查,DNS 与邮件安全指南则介绍持续审查。
如果想先看这项检查,可以使用免费的 SPF 和 DMARC 检测工具:它运行同一份快照,并把邮件 DNS 检查展开显示在其余七项检查之前。
常见问题
我的 SPF 记录应该以 ~all 还是 -all 结尾?
两者都合理。-all 表示未列出的服务器未获授权,~all 表示它们很可能未获授权。RFC 9989 指出,使用 -all 时,提前检查 SPF 的接收方可能在 DMARC 运行之前就拒收转发邮件,即使邮件带有有效且对齐的 DKIM 签名。切勿使用 +all。
DMARC 策略设为 p=none 够吗?
它满足 Gmail、Yahoo 和 Outlook.com 对大批量发件人设定的最低 DMARC 策略要求,配合 rua 还能开始收到报告。但它对验证失败的邮件没有表达任何处理倾向,所以应借此找出并修复你的合法发件来源,然后升级到 quarantine。
example.com 上的 DMARC 记录会覆盖子域名吗?
会,针对没有自己 DMARC 记录的子域名:如果设置了 sp 和 np,接收方对已存在的子域名应用 sp,对不存在的子域名应用 np,否则使用 p。SPF 不会继承,所以每个发信名称都需要自己的 SPF 记录。
SPF 通过了,还需要 DKIM 吗?
需要。邮件被转发时 SPF 通常会失败,而 DKIM 一般依然有效。Gmail、Yahoo 和 Outlook.com 要求大批量发件人同时具备两者,RFC 9989 也要求发布 p=reject 的域名使用 DKIM。
上线准备快照会检查 DKIM 吗?
不会。DKIM 密钥位于选择器之下,而选择器只出现在真实邮件中。请向你控制的邮箱发送一封邮件,并查看其 DKIM-Signature 和 Authentication-Results 头。
来源与延伸阅读
- RFC 7208:发件人策略框架(SPF)www.rfc-editor.org
- RFC 9989:DMARCwww.rfc-editor.org
- RFC 9990:DMARC 聚合报告www.rfc-editor.org
- Google:邮件发件人指南support.google.com
- Yahoo 发件人中心:发件人要求与建议senders.yahooinc.com
- Microsoft:Outlook 对大批量发件人的要求techcommunity.microsoft.com
- RFC 8461:SMTP MTA 严格传输安全(MTA-STS)www.rfc-editor.org
- BSI TR-03182:邮件认证(PDF)www.bsi.bund.de
由 Sitelemetry 编辑团队编写。文末的一手资料可帮助你深入了解相关主题。



