错误信息
dkim=fail reason="key not found in DNS"
也可能输出为
- dkim=neutral (no key)
不同验证方的归类不同(OpenDKIM 为 `fail`,mailauth 为 `neutral (no key)`,两者均已复现),因此同一封邮件在你自己服务器的邮件头中和在大型邮箱服务商那里看起来可能不一样;Gmail 的邮件头通常写作 `dkim=neutral (no key for signature)`,这是线上服务的措辞,无法在容器中复现。如果不是记录缺失而是 DNS 超时,结果则是 `dkim=temperror`。
含义
邮件中的 DKIM 签名指定了选择器 `s=` 和域名 `d=`,但 TXT 记录 `<selector>._domainkey.<domain>` 并不存在,因此接收方无法做任何验证。OpenDKIM 把这种情况报告为 `dkim=fail` 并附上这条原因;其他验证方对同一情况的归类不同——mailauth 报告为 `dkim=neutral (no key)`,有些则报告为 `dkim=permerror`。对 DMARC 来说,这些结果都不算 DKIM 通过。
原因
选择器的记录从未创建
常见新的签名密钥(或新的邮件服务商)在选择器的 TXT 记录添加之前就开始用它签名了。Google Workspace、Microsoft 365、SendGrid 等邮件服务商(ESP)只有在相应记录存在之后才会开始正确签名。
记录存在,但名称略有不同
常见会自动追加区域名的 DNS 管理面板会生成 `s2026._domainkey.example.com.example.com`;如果子域名已委派到别处,在父区域中创建的记录同样查不到。
CNAME 目标或拆分的记录已损坏
偶见有些服务商用 CNAME 指向它们自己的密钥记录(`s1._domainkey → s1.domainkey.u123.wl.sendgrid.net`),如果 CNAME 缺失或指向已删除的目标,验证就会失败。
密钥已删除,但仍有邮件在使用它
偶见密钥轮换后立即删除旧选择器,会导致仍在队列中的邮件或稍后被重新验证的邮件(转发、ARC)验证失败。
修复方法
- 1.
查询准确的记录名称
用签名头中的 `s=` 和 `d=` 拼出记录名称,然后从你的网络外部查询。
bash # s= and d= from the DKIM-Signature header name the record: <s>._domainkey.<d> dig +short TXT s2026._domainkey.example.com dig +short TXT s2026._domainkey.example.com @1.1.1.1 # bypass local caches - 2.
发布密钥,并将旧选择器保留一段时间
先发布新选择器,再用它签名;切换后把之前的选择器再保留几天。
text ; zone example.com - long keys are split into several quoted strings of at most 255 characters s2026._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." )
相关错误
dkim=fail reason="signature verification failed"OpenDKIM (Authentication-Results header added by the opendkim milter); mailauth reports the same as "bad signature"dkim=permerrorOpenDKIM (Authentication-Results); mailauth reports syntax errors as dkim=neutraldkim=fail (body hash did not verify)DKIM verifiers (Gmail, mailauth, Rspamd…)