如何配置DKIM及相关策略,阻止收件方接收未签名的伪造域名邮件?
咱们先理清楚你遇到的问题根源:你设置了SPF、DKIM和DMARC,但伪造的未签名邮件还能被Gmail接收,核心原因是DMARC默认只要求SPF或DKIM其中一项通过对齐验证就算合规——你那封伪造邮件刚好通过了SPF验证,所以Gmail的DMARC直接判定为pass,根本不需要检查DKIM。
而Outlook会隔离那封邮件,大概率是因为它对SPF的验证更严格(比如你的SPF记录在Outlook那边解析出了错误,导致SPF permerror),所以触发了DMARC的fail动作。
接下来给你一步步解决的方案:
1. 先排查并收紧你的SPF记录
你提到用DNSExit发的伪造邮件居然SPF pass了,这说明DNSExit的发送服务器IP(或它的SPF记录)被包含在你的域名SPF里了!这太危险了——如果第三方发送平台不验证域名所有权(比如你说的DNSExit),那任何人都能用它们它们的服务器伪造你域名的邮件,还能通过SPF验证。
所以第一步:
- 查看你的SPF记录(用
dig txt mydomain.com命令),把所有不严格验证域名所有权的第三方发送者(比如DNSExit这种)从SPF里移除,只保留那些需要你验证域名才能发件的平台(比如Mailgun)。 - 确保SPF记录不要太宽松,比如别用
include:spf.example.com这种包含大量未知IP的记录,也绝对不能用+all(这等于允许所有IP发你域名的邮件,完全失去SPF的意义)。
2. 调整DMARC记录,强制要求DKIM验证
现在你需要修改DMARC规则,让只有带有效DKIM签名且对齐的邮件才算合规,同时收紧对齐要求:
把你的_dmarc.mydomain.com TXT记录改成:
v=DMARC1; p=quarantine; sp=quarantine; adkim=s; aspf=s; rua=mailto:abuse@mydomain.com; pct=100
我给你解释每个参数的作用:
p=quarantine:对不符合DMARC的邮件先隔离(测试没问题后可以改成p=reject直接拒绝)sp=quarantine:对子域名应用同样的隔离策略adkim=s:DKIM严格对齐——签名的域名必须和邮件头里的header.from完全一致,不能是子域名(避免有人用子域名伪造)aspf=s:SPF严格对齐——发件人邮箱的域名(smtp.mailfrom)必须和header.from完全一致pct=100:所有邮件都应用这个策略(测试阶段可以先设成10,逐步提高到100,避免误杀合法邮件)
这样设置后,只有同时满足以下任一条件的邮件才会被判定为合规:
- SPF验证通过,且
smtp.mailfrom的域名和header.from完全一致; - DKIM验证通过,且签名的域名和
header.from完全一致。
如果伪造的邮件没有DKIM签名,同时又过不了SPF验证(因为你已经收紧了SPF),就会触发DMARC的隔离/拒绝动作。
3. 确保所有合法邮件都带DKIM签名
你已经确认合法发送的邮件DKIM验证正常,但还是要再检查一遍所有第三方发送平台(比如Mailgun)的配置:
- 确保每个平台都正确配置了你的DKIM密钥(对应你域名的selector记录);
- 确认这些平台发送的邮件都会自动添加DKIM签名,并且签名的域名和
header.from完全一致(满足严格对齐要求)。
4. 关于旧的_domainkey记录
你提到的那个_domainkey顶级域记录确实是DKIM的旧规范,现在已经被废弃了,完全不需要设置,只需要保留你当前的selector._domainkey格式的DKIM记录就行,不用管它。
测试验证
改完记录后,等DNS生效(一般15-30分钟),再做测试:
- 用不在SPF里的服务器发送伪造的未签名邮件,看Gmail和Outlook是否会隔离/拒绝;
- 查看收到的合法邮件的头信息,确认
DKIM=pass、SPF=pass、DMARC=pass。
备注:内容来源于stack exchange,提问作者Guss

