邮件服务器已经搭好,Postfix 和 Dovecot 都在运行,但邮件总是进垃圾箱——甚至直接被退回。本文系统性地梳理了最常见的原因,并提供逐一诊断的方法。
快速诊断
先做两个快速测试:
测试 1:发送到 mail-tester.com
访问 mail-tester.com,将邮件发到他们显示的地址,然后点击”查看分数”。你会得到 1–10 分的评分及详细说明。
测试 2:检查 IP 信誉
# 替换为你的服务器 IP
IP="203.0.113.10"
# 检查 Spamhaus ZEN(涵盖多个黑名单)
host -t A $(echo $IP | awk -F. '{print $4"."$3"."$2"."$1}').zen.spamhaus.org
# 检查 Barracuda
host -t A $(echo $IP | awk -F. '{print $4"."$3"."$2"."$1}').b.barracudacentral.org
如果返回了 IP 地址(如 127.0.0.2),说明你的 IP 已被列入黑名单。
问题一:缺少 SPF 记录(最常见)
症状:邮件认证失败,被识别为垃圾邮件或直接拒绝。
诊断:
dig TXT example.com +short
如果没有 v=spf1 开头的记录,这就是问题所在。
修复:
example.com. IN TXT "v=spf1 ip4:你的服务器IP ~all"
SPF 也会因配置错误而失败:DNS 查询次数超过 10 次上限、IP 填写错误、或使用了过于宽松的 +all。
问题二:DKIM 未签名或验证失败
症状:邮件头部显示 DKIM=fail,mail-tester 评分低。
查看邮件原始头部——在 Gmail 中点击”更多” → “显示原始邮件”:
Authentication-Results: mx.google.com;
dkim=fail (test mode) header.d=example.com
检查 DNS 记录是否存在:
dig TXT mail._domainkey.example.com +short
检查 OpenDKIM 服务状态:
sudo systemctl status opendkim
sudo grep milter /var/log/mail.log | tail -20
常见修复方法:
- 密钥文件权限:
sudo chown opendkim:opendkim /etc/opendkim/keys/example.com/mail.private - 套接字不匹配:确保
smtpd_milters = inet:localhost:8891与Socket inet:8891@localhost一致 - 选择器错误:DNS 记录名称必须是
{选择器}._domainkey.{域名}
问题三:缺少反向 DNS(PTR 记录)
症状:邮件被拒绝,错误信息类似 550 5.7.1 ... does not have a PTR record。
诊断:
dig -x 你的服务器IP +short
应返回你的邮件主机名(如 mail.example.com.)。若无返回,PTR 记录缺失。
修复: 通过 VPS 服务商控制台配置 PTR 记录。登录 Vultr/DigitalOcean 等控制台,找到”反向 DNS”或”PTR”设置,将你的 IP 指向 mail.example.com。PTR 生效可能需要最多 24 小时。
问题四:IP 被列入黑名单
症状:退信显示 550 IP blacklisted,或邮件无声无息地进入垃圾箱。
批量检查黑名单:
IP 被列黑的常见原因:
- VPS 的前任租户曾用此 IP 发送垃圾邮件
- 短时间内发送了大量邮件(需要逐步热身)
- 服务器上有被入侵的账号在发送垃圾邮件
申请移除:
- Spamhaus:https://www.spamhaus.org/lookup/
- Barracuda:https://www.barracudacentral.org/rbl/removal-request
- Microsoft SNDS:https://sendersupport.olc.protection.outlook.com/snds/
问题五:DMARC 记录缺失或配置错误
症状:Gmail 显示”此邮件未通过安全检查”。
诊断:
dig TXT _dmarc.example.com +short
若缺失,添加:
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:admin@example.com"
阅读发送到 rua 地址的聚合报告,了解失败原因。
问题六:25 端口被封锁
症状:无法发送邮件到外部服务器,连接到 25 端口超时。
测试:
telnet smtp.gmail.com 25
若超时,说明 VPS 服务商封锁了出站 25 端口(这是防止垃圾邮件的常见措施)。
解决方法: 联系 VPS 客服申请开放 25 端口,通常需要身份验证。或者使用事务性邮件中继服务(Amazon SES、Mailgun、SendGrid)通过 587 端口发送出站邮件。
问题七:邮件内容触发垃圾邮件过滤
即使认证配置完美,邮件内容也可能触发垃圾邮件过滤器。
常见内容触发词:
- 过多使用垃圾词汇(“免费”、“限时优惠”、“点击领取”等)
- 纯图片邮件,或文字与图片比例严重失衡
- 链接指向信誉差的域名
- HTML 代码错误
- 批量邮件缺少退订链接
用 SpamAssassin 本地检测:
sudo apt install spamassassin -y
echo "测试邮件" | spamassassin -t
问题八:退信分析
退信分为两种类型:
硬退信(5xx) — 永久性失败:
550 5.1.1— 收件人不存在550 5.7.1— 被策略拒绝(IP 被列黑,或认证失败)550 5.4.1— 域名不存在
软退信(4xx) — 临时性失败,Postfix 会自动重试:
421 4.7.0— 被限速,稍后重试452 4.2.2— 收件人邮箱已满
查看邮件日志中的退信信息:
sudo grep "status=bounced" /var/log/mail.log | tail -30
快速诊断清单
遇到邮件无法送达时,逐项检查:
- SPF 记录存在,且包含服务器 IP
- DKIM 记录存在,
opendkim服务正在运行 - DMARC 记录存在
- PTR/反向 DNS 已设置为邮件主机名
- IP 未被列入黑名单(MXToolbox 检查)
- 25 端口未被 VPS 服务商封锁
- TLS 证书有效(
sudo certbot certificates) - Postfix/Dovecot 服务正在运行(
systemctl status postfix dovecot) -
/var/log/mail.log无报错
工具参考
| 工具 | 用途 |
|---|---|
| mail-tester.com | 完整送达率评分 |
| MXToolbox | DNS + 黑名单检测 |
dig TXT example.com | SPF 查询 |
dig TXT mail._domainkey.example.com | DKIM 查询 |
dig TXT _dmarc.example.com | DMARC 查询 |
dig -x IP | PTR 记录查询 |
sudo grep reject /var/log/mail.log | 查看拒绝原因 |