如果你在运营自建邮件服务器,要想让邮件稳定送达,就必须实现三项认证标准:SPF、DKIM 和 DMARC。缺少这些配置,你的合法邮件将会进入垃圾箱,甚至直接被拒绝。本文逐一讲解每项标准并提供详细配置步骤。
为什么需要邮件认证
电子邮件协议设计之初没有身份认证机制,使得伪造发件人地址极为容易。以下三种基于 DNS 的标准解决了这一问题:
| 标准 | 作用 |
|---|---|
| SPF | 声明哪些服务器有权以你的域名发送邮件 |
| DKIM | 对外发邮件进行密码学签名,证明邮件未被篡改 |
| DMARC | 将 SPF 和 DKIM 结合,告知收件方认证失败时如何处理 |
三者均为 DNS TXT 记录——SPF 和 DMARC 无需安装额外软件,DKIM 需要一个小型守护进程(opendkim)。
第一部分:SPF(发件人策略框架)
SPF 是在你的域名上设置的 DNS TXT 记录,列出所有被授权以该域名发送邮件的 IP 地址。
创建记录:
服务器 IP 为 203.0.113.10,域名为 example.com:
example.com. IN TXT "v=spf1 ip4:203.0.113.10 ~all"
各字段说明:
v=spf1— SPF 版本ip4:203.0.113.10— 授权此 IPv4 地址发送邮件~all— 其他来源软失败(确认稳定后改为-all硬失败)
如果你使用了第三方中继服务(如 Amazon SES 或 SendGrid):
"v=spf1 ip4:203.0.113.10 include:amazonses.com ~all"
验证:
dig TXT example.com +short
第二部分:DKIM(域名密钥识别邮件)
DKIM 为外发邮件添加密码学签名。公钥发布在 DNS,私钥由邮件服务器用于签名。
安装 OpenDKIM
sudo apt update
sudo apt install opendkim opendkim-tools -y
生成密钥对
sudo mkdir -p /etc/opendkim/keys/example.com
sudo opendkim-genkey -b 2048 -d example.com -s mail -D /etc/opendkim/keys/example.com/
sudo chown -R opendkim:opendkim /etc/opendkim/keys/
生成两个文件:
mail.private— 私钥(严禁泄露)mail.txt— 需要发布的 DNS 记录
发布 DNS 记录
查看生成的记录:
cat /etc/opendkim/keys/example.com/mail.txt
输出类似:
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkq..." )
在 DNS 中创建 TXT 记录:
- 名称:
mail._domainkey.example.com - 值:粘贴完整的
p=...内容(去掉括号)
配置 OpenDKIM
编辑 /etc/opendkim.conf:
Mode sv
Canonicalization relaxed/simple
Domain example.com
Selector mail
KeyFile /etc/opendkim/keys/example.com/mail.private
Socket inet:8891@localhost
创建 /etc/opendkim/TrustedHosts:
127.0.0.1
localhost
example.com
与 Postfix 集成
在 /etc/postfix/main.cf 中添加:
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
重启服务:
sudo systemctl restart opendkim
sudo systemctl reload postfix
验证 DKIM
发送一封测试邮件到 check-auth@verifier.port25.com,你会收到包含 DKIM 验证结果的自动回复。
第三部分:DMARC
DMARC 将 SPF 和 DKIM 结合起来,告知邮件服务商在认证失败时如何处理邮件。
创建记录(_dmarc.example.com):
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
策略选项(p=):
none— 仅监控,不采取行动(从这里开始)quarantine— 将失败邮件投入垃圾箱reject— 直接拒绝失败邮件
建议先设为 p=none,通过聚合报告(rua)分析 2–4 周的数据,再逐步升级到 quarantine 或 reject。
严格策略示例(验证完毕后使用):
"v=DMARC1; p=reject; pct=100; rua=mailto:dmarc@example.com; aspf=s; adkim=s"
一键验证
# 检查 SPF
nslookup -type=TXT example.com
# 检查 DKIM
nslookup -type=TXT mail._domainkey.example.com
# 检查 DMARC
nslookup -type=TXT _dmarc.example.com
也可以使用在线工具 MXToolbox 进行综合检测。
配置汇总
| 步骤 | 记录 | 位置 |
|---|---|---|
| SPF | example.com TXT "v=spf1 ..." | 域名 DNS |
| DKIM | mail._domainkey.example.com TXT "v=DKIM1; ..." | 域名 DNS |
| DMARC | _dmarc.example.com TXT "v=DMARC1; p=none; ..." | 域名 DNS |
三项全部配置完成后,你的邮件将能通过 Gmail、Outlook、Yahoo 等主流邮件服务商的认证检查。