免费 · 无需账户

SPF 和 DMARC 检测工具

在线查询域名的 SPF、DMARC、MTA-STS 和 CAA 记录,并查看每项的评估结果。请输入你用来发送邮件的域名,例如 example.com,而不是 www.example.com。

免费检查网站的公开设置,不会更改您的网站。

无需注册 无破坏性流量 公开网站检查
记录参考

每条记录的作用及评估方式

此工具在你输入的主机名上读取这些记录。只有当主机有 MX 记录时,缺少 SPF、DMARC 和 MTA-STS 记录才会被标记,因为不接收邮件的主机对它们的需要不同。

记录发布位置良好配置此工具的评估方式
MX主机名上的 MX 记录。接收邮件的域名上应存在。统计并显示;本身从不构成发现。
SPF主机名上以 v=spf1 开头的 TXT 记录。恰好一条 SPF 记录,列出代表该域名发送邮件的所有服务。主机有 MX 记录但缺失:中。会显示记录文本。
SPF all 机制SPF 记录的最后一项。-all 或 ~all。+all:高。?all:低。-all 和 ~all 不产生发现。
SPF DNS 查询记录中的 include、a、mx、ptr、exists 和 redirect 项。需要 DNS 查询的项最多十个。顶层记录中超过十个:中。不展开 include: 目标,因此不计算嵌套查询。
DMARC对于 example.com,位于 _dmarc.example.com、以 v=DMARC1 开头的 TXT 记录。报告显示所有合法邮件都能通过后,使用 p=quarantine 或 p=reject。主机有 MX 记录但缺失:中。p=none:低。quarantine 或 reject:通过。不评估 sp、pct、rua 和对齐。在子域名上,接收方还会应用组织域名的 DMARC 策略,此检查不读取它。
MTA-STS位于 _mta-sts.example.com、以 v=STSv1 开头的 TXT 记录,以及 mta-sts 主机上的策略文件。记录和策略文件都具备,测试后使用 enforce 模式。主机有 MX 记录但缺少该记录:低。只检查 DNS 记录,不获取策略文件。
CAA主机名上的 CAA 记录。只列出你实际使用的证书颁发机构的记录。存在任何 CAA 记录:通过。没有:低。不会将内容与你的证书比对。在子域名上,证书颁发机构还会遵循上级域名的 CAA,此检查不读取它。
DKIM位于 selector._domainkey.example.com 的 TXT 记录。为每个签名你邮件的服务提供一个密钥。不检查:仅凭 DNS 无法发现 selector 名称。

不检查 TLS 报告、DNSSEC 和 BIMI。

如何修复

如何修复常见的 SPF 和 DMARC 问题

每次只修改一条记录,再次检查前给 DNS 留出更新时间。示例使用 example.com 和占位服务;请替换为你的域名和实际为你发送邮件的服务。

以监控模式发布 DMARC

在 From 地址所用域名的 _dmarc 下只添加一条 TXT 记录。p=none 不会改变投递,rua 会请求接收方发送汇总报告,显示哪些服务器以你的域名发送邮件,以及它们是否以对齐的方式通过 SPF 或 DKIM。如果报告发往另一个域名,该域名必须发布一条授权接收这些报告的记录。

; DMARC record for example.com, monitoring only
_dmarc.example.com.  TXT  "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com"

; Only if rua points to another domain, for example rua=mailto:reports@example.net,
; example.net publishes:
example.com._report._dmarc.example.net.  TXT  "v=DMARC1"

先改为 quarantine,再改为 reject

当报告显示所有合法来源都能通过时,改为 p=quarantine,再次观察报告,然后改为 p=reject。RFC 7489 曾提供 pct,用于只对部分未通过的邮件应用策略。取代它的 RFC 9989 删除了 pct,因为部分比例的执行并不一致,并新增了 t=y,请求接收方按比已发布策略低一级的方式执行。仍遵循 RFC 7489 的接收方会忽略 t=y,因此测试期间请同时添加 pct=0,它会请求这些接收方同样按低一级的方式处理。正式执行时删除这两个标签。

; Publish one version at a time, in this order, after p=none
; 1. Quarantine in test mode (t=y, plus pct=0 for RFC 7489 receivers), then in full
_dmarc.example.com.  TXT  "v=DMARC1; p=quarantine; t=y; pct=0; rua=mailto:dmarc-reports@example.com"
_dmarc.example.com.  TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com"
; 2. Reject in test mode, then in full
_dmarc.example.com.  TXT  "v=DMARC1; p=reject; t=y; pct=0; rua=mailto:dmarc-reports@example.com"
_dmarc.example.com.  TXT  "v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com"

每个域名只保留一条 SPF 记录

一个名称只能有一条以 v=spf1 开头的 TXT 记录;有两条时,SPF 会以永久错误失败。把所有发件方合并到一条记录中。include: 检查服务商自己的记录,redirect= 把整个策略交给另一个域名,适合多个域名共用一个策略的情况。如果记录中还有 all 项,redirect= 会被忽略。

; Before: two SPF records on one name (permerror)
example.com.  TXT  "v=spf1 include:_spf.mailhost.example ~all"
example.com.  TXT  "v=spf1 include:spf.newsletter.example ~all"

; After: one record
example.com.  TXT  "v=spf1 include:_spf.mailhost.example include:spf.newsletter.example ~all"

; Another domain that uses the same policy
example.org.  TXT  "v=spf1 redirect=example.com"

DNS 查询不超过十次

SPF 最多允许十个需要 DNS 查询的项(include、a、mx、ptr、exists 和 redirect),嵌套 include 中的项也计算在内。多出一个,SPF 就会以永久错误失败。删除不再使用的服务的 include,用你控制的 ip4 或 ip6 地址段代替 a 和 mx,去掉 ptr,并把群发服务移到拥有自己 SPF 记录的子域名。把服务商的地址直接复制到你的记录中也能减少查询,但服务商更换地址后,副本就会过时。此工具只统计顶层记录中的项。

; One lookup each: include, a, mx, ptr, exists, redirect (plus every lookup inside an include)
; No lookup: ip4, ip6, all

; Before: 4 lookups in the top-level record alone
example.com.       TXT  "v=spf1 a mx include:_spf.mailhost.example include:spf.oldtool.example ~all"

; After: fixed address, unused service removed, bulk mail on its own subdomain
example.com.       TXT  "v=spf1 ip4:192.0.2.10 include:_spf.mailhost.example ~all"
news.example.com.  TXT  "v=spf1 include:spf.newsletter.example ~all"

谨慎选择 ~all 或 -all

记录以 ~all(softfail)或 -all(fail)结尾,绝不要使用让任何服务器都通过的 +all。-all 是更严格的信号,但较早检查 SPF 的接收方可能会在 DMARC 看到有效 DKIM 签名之前拒收转发的邮件。已执行 DMARC 策略时,~all 会把决定交给 DMARC。不发送邮件的域名可以发布 v=spf1 -all。

; Choose one ending for example.com, not both
example.com.  TXT  "v=spf1 include:_spf.mailhost.example ~all"
example.com.  TXT  "v=spf1 include:_spf.mailhost.example -all"

; A domain that sends no mail
example.net.  TXT  "v=spf1 -all"

让 DKIM 与 From 域名对齐

当 SPF 或 DKIM 对一个与 From 地址对齐的域名通过时,DMARC 就会通过。许多服务默认用自己的域名签名,这样 DKIM 能通过,但对齐不通过。在每个服务中启用使用你自己域名的签名,让签名带有 d=example.com,并在其选择器下发布服务提供的密钥或 CNAME。默认的宽松对齐接受同一组织域名下的任何子域名;adkim=s 和 aspf=s 要求完全匹配。

; Key for a sending service, selector s1: a CNAME or a TXT record, as the service says
s1._domainkey.example.com.  CNAME  s1.dkim.mailhost.example.
s1._domainkey.example.com.  TXT    "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOC..."

; Aligned signature in a delivered message: d= matches the From domain
From: news@example.com
DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=s1; ...

DNS 更改可能需要旧记录 TTL 那么长的时间才能到达所有解析器。之后请对 From 地址所用的域名再次运行此工具,因为它读取的是你输入的确切主机名。

解读结果

如何理解每种状态。

  1. 01通过找到了该记录,并通过检查。
  2. 02低 · 中 · 高某条记录缺失,或其设置方式被此检查标记。级别与完整 Snapshot 使用的相同。
  3. 03已观察观察到一条记录,但检查既未判定通过,也未产生发现。
  4. 04未观察到检查已运行,但没有找到可显示的记录。
  5. 05不适用该检查不适用,例如主机没有 MX 记录时的 SPF 或 DMARC。
  6. 06未测量DNS 查询失败,因此该检查不计为通过。
范围

此工具不做的事。

  1. 01只在你输入的确切主机名上读取记录。对于 www.example.com,它查询 www.example.com 和 _dmarc.www.example.com,而不是 example.com。
  2. 02主机名必须能解析到地址。没有 A 或 AAAA 记录、仅用于邮件的域名在这里不会得到结果。
  3. 03不检查 DKIM、TLS 报告或 DNSSEC,也不展开 SPF 的 include: 项。
  4. 04邮件记录只从公共 DNS 读取,不发送任何邮件。同一次运行还会为其他七项检查向首页发送几次普通请求。它不是邮件送达测试、漏洞扫描或渗透测试。
  5. 05结果是某一时刻的状态;DNS 变更可能需要一段时间才能到达所有解析器。
常见问题

关于 SPF 和 DMARC 检查的问题。

为什么 www.example.com 没有显示 SPF 记录?

此工具读取确切的主机名。邮件记录通常位于你发送邮件所用的域名上,所以请直接输入 example.com。

p=none 是错误的吗?

p=none 是监控模式。在阅读 DMARC 报告期间,这是正常的第一步,因此评为低。所有合法邮件都能通过后,再改为 quarantine 或 reject。

为什么不检查 DKIM?

DKIM 密钥发布在只有发送服务才知道的 selector 名称下,因此仅凭 DNS 无法找到。请在每个为你发送邮件的服务的设置中检查它们。

这会测试我的邮件能否进入收件箱吗?

不会。邮件记录只从公共 DNS 读取,不发送任何邮件;同一次运行还会为其他检查向首页发送几次普通请求。它不是漏洞扫描或渗透测试。能否进入收件箱还取决于发送服务、其信誉以及每封邮件。

一个域名可以有两条 SPF 记录吗?

不可以。如果一个名称有多条以 v=spf1 开头的 TXT 记录,SPF 会对每封邮件返回永久错误。请把机制合并到一条记录中;较长的记录可以在同一条记录内拆分为多个带引号的字符串,接收方会在不添加空格的情况下把它们拼接起来。

为什么 SPF 通过了,DMARC 却失败?

SPF 检查的是信封发件人,通常是邮件服务的退信域名,而不是 From 地址中的域名。只有两个域名对齐时,这个结果才会计入 DMARC。请在每个服务中设置使用你自己域名的 DKIM 签名,或在你的某个子域名上设置自定义信封发件人。

p=none 应该保持多久?

直到汇总报告显示所有合法来源都以对齐的域名通过,包括发票这类每月只发送一次的邮件。对于用户会向邮件列表发信的域名,RFC 9989 不建议使用 reject;如果仍然选择,请先至少在 none 保持一个月,再在 quarantine 保持同样长的时间。

下一步

将检测到的问题转化为清晰的修复计划。