邮件送达故障排查:为什么邮件进了垃圾箱(及修复方法)

送达率 垃圾邮件 故障排查 DNS 黑名单
披露:Email Wiki 上的部分链接为 VPS 服务商(如 Vultr)的联盟链接。通过这些链接购买,我们可能获得佣金,但不会对您产生额外费用。这有助于我们保持网站免费。所有教程均独立撰写,我们仅推荐我们认为适合自建邮件服务器的可靠服务。

邮件服务器已经搭好,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:8891Socket 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 发送垃圾邮件
  • 短时间内发送了大量邮件(需要逐步热身)
  • 服务器上有被入侵的账号在发送垃圾邮件

申请移除:

问题五: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完整送达率评分
MXToolboxDNS + 黑名单检测
dig TXT example.comSPF 查询
dig TXT mail._domainkey.example.comDKIM 查询
dig TXT _dmarc.example.comDMARC 查询
dig -x IPPTR 记录查询
sudo grep reject /var/log/mail.log查看拒绝原因

准备好部署你的邮件服务器了吗?

你需要一台 IP 信誉干净的可靠 VPS。立即使用 Vultr——独立 IP、NVMe SSD、全球数据中心,最低 $6/月。