自建邮箱最让人崩溃的情况,不是“发不出去”,而是SMTP 显示发送成功,结果对方收不到,或者直接进垃圾箱。
很多人已经按教程搭好了 Docker Mailserver、Postfix/Dovecot、Mailcow 或 Poste.io,也配置了 SPF、DKIM、DMARC,但发到 Gmail、Outlook 还是不稳。问题在于:邮箱投递不是“能连上 25 端口”就结束了,收件方还会看你的身份、IP 信誉、反向解析、发送行为和历史投诉。
这篇不再讲怎么安装邮件服务器。安装可以看这篇:
本文只处理一个问题:自建邮箱发出的邮件为什么进垃圾箱、被退信,应该按什么顺序排查。
不要一上来就改 SPF。先确认你遇到的是哪一种:
- 直接退信:收到 bounce,里面有
550、5.7.1、policy、SPF fail、PTR required等字样; - 收件方接受了,但进垃圾箱:SMTP 日志看起来成功,Gmail/Outlook 也能收到,只是不进 inbox;
- 延迟投递:日志里是
deferred、temporarily rejected、rate limited,过一段时间可能又成功。
这三种原因不一样。
退信通常是硬错误,优先看 DNS 认证、PTR、黑名单;进垃圾箱通常是信誉和内容问题;延迟投递通常是频率、信誉、灰名单或临时策略限制。
先看邮件日志。Debian/Ubuntu 常见路径:
sudo tail -n 200 /var/log/mail.log
如果是 Docker Mailserver:
docker logs mailserver --tail=200
Postfix 队列:
postqueue -p
查看某封邮件的队列详情:
postcat -vq QUEUE_ID
看到具体错误码后再动手,不要盲修。
SPF 是告诉收件方:哪些服务器可以代表你的域名发信。
先查 DNS:
dig TXT example.com +short
一个最简单的自建邮件 SPF 可能长这样:
v=spf1 mx -all
或者明确写 IP:
v=spf1 ip4:203.0.113.10 -all
常见错误有几个:
- 同一个域名存在两条
v=spf1记录; - 忘了把 VPS IP 加进去;
- 乱加很多
include,超过 SPF 10 次 DNS lookup 限制; - 永远用
~all,长期不收紧; - 应用实际从第三方服务发信,但 SPF 没包含那个服务。
注意:SPF 看的是 envelope sender / Return-Path,不一定是用户看到的 From。很多 DMARC 失败,其实是 SPF 通过了,但和 From 域名不对齐。
DKIM 是给邮件加签名。收件方会用 DNS 里的公钥验证邮件有没有被改过。
从邮件原文里找 DKIM-Signature,会看到类似:
s=mail; d=example.com;
这里 s=mail 就是 selector。查 DNS:
dig TXT mail._domainkey.example.com +short
常见错误:
- 邮件里 selector 是
mail,DNS 却发布在default._domainkey; - DKIM 公钥复制不完整;
- DNS 服务商把长 TXT 记录截断;
- 服务器换过 DKIM key,DNS 还是旧公钥;
- 没给所有发信服务启用 DKIM。
发到 Gmail 后,可以点“显示原始邮件”,看 Authentication-Results 里有没有:
dkim=pass
spf=pass
dmarc=pass
如果 DKIM fail,先别管内容文案,身份都没验过,进 inbox 的概率很低。
DMARC 建在 SPF 和 DKIM 之上。它关心的是:用户看到的 From 域名,是否和 SPF 或 DKIM 验证通过的域名对齐。
查 DMARC:
dig TXT _dmarc.example.com +short
刚开始排查时建议先用:
v=DMARC1; p=none; rua=mailto:[email protected]
确认所有发信来源都正常后,再逐步升级到:
v=DMARC1; p=quarantine; rua=mailto:[email protected]
最后才考虑:
v=DMARC1; p=reject; rua=mailto:[email protected]
不要一上来就 p=reject。如果你还有网站表单、监控系统、第三方邮件服务、Git 服务通知在发信,没梳理清楚就 reject,很容易把自己的合法邮件也打掉。
PTR 反向解析是自建邮箱的硬门槛之一。
查你的 VPS IP:
dig -x 203.0.113.10 +short
理想结果应该返回你的邮件主机名,比如:
mail.example.com.
然后再查正向解析:
dig A mail.example.com +short
应该能回到同一个 IP。
这叫 forward-confirmed reverse DNS。很多收件方会看这个信号。
PTR 不是在 Cloudflare DNS 里设置的,也不是在你的域名 DNS 面板里设置的。它要在 VPS 服务商控制台设置,或者开工单让服务商改。
常见错误:
- PTR 为空;
- PTR 指向服务商默认主机名;
- PTR 指向
mail.example.com,但mail.example.com没有 A 记录; - HELO/EHLO 主机名和 PTR 不一致;
- 多个域名共用一台邮件服务器,但身份没统一。
Postfix 里看主机名:
postconf myhostname
postconf myorigin
如果你的服务器对外宣称 vps123.provider.com,但邮件 From 是 example.com,信誉会很难看。
很多云厂商默认封 outbound 25 端口。你本地能登录邮箱客户端,不代表服务器能向外投递。
测试到 Gmail MX:
nc -vz gmail-smtp-in.l.google.com 25
如果超时或被拒,可能是服务商封了 25。
也可以用 telnet:
telnet gmail-smtp-in.l.google.com 25
如果端口 25 被封,通常只有三种选择:
- 开工单申请解封;
- 换一个允许邮件出站的 VPS 服务商;
- 使用 SMTP Relay,比如 Amazon SES、Mailgun、SendGrid、Postmark。
不要用 587/465 代替服务器之间的 25 投递。587/465 是客户端提交邮件用的,不是正常 MTA 对 MTA 投递的替代品。
如果 DNS 都对,PTR 也对,但邮件还是被拒,下一步查 IP 信誉。
先看常见 RBL/DNSBL。可以用在线工具,也可以查部分列表:
dig 10.113.0.203.zen.spamhaus.org A
这里 IP 要倒过来写。比如 203.0.113.10 变成 10.113.0.203。
更实用的是:
- MxToolbox blacklist check;
- Spamhaus;
- Google Postmaster Tools;
- Microsoft SNDS / JMRP。
新买 VPS 时就应该先查 IP。我们之前也写过:
如果 IP 已经进核心黑名单,别急着折腾 Postfix。先看能不能换 IP、退款、换服务商。便宜 VPS 的某些 ASN 长期被滥用,就算你配置满分,也可能很难进 Gmail inbox。
如果对方已经接受邮件,但进 spam,说明技术认证可能只是“够格”,还没建立信誉。
按这个顺序看:
- Gmail 原文里
spf/dkim/dmarc是否全 pass; - From 域名和 DKIM
d=是否对齐; - PTR、HELO、A 记录是否一致;
- 是否新 IP 一上来就发很多邮件;
- 是否给不存在的地址发太多,导致 bounce 高;
- 邮件内容是否全图、短链太多、链接域名不一致;
- 是否混用营销邮件和交易邮件;
- Google Postmaster Tools 是否显示低信誉。
新 IP 不要立刻群发。先从低量、真实互动邮件开始,逐步增加发送量。自建邮箱最适合发:
- 个人邮件;
- 站点通知;
- 少量交易邮件;
- 内部系统告警。
不适合一上来就发营销邮件。那是在主动把 IP 信誉打烂。
常见线索大概这样:
| 现象 / 错误 | 重点排查 |
|---|---|
550 5.7.1 | 策略拒收、信誉、认证失败 |
SPF fail | SPF 记录、Return-Path、发送 IP |
DKIM fail | selector、公钥、签名配置 |
DMARC fail | SPF/DKIM 对齐、From 域名 |
PTR required | 反向解析、HELO 主机名 |
blocked using Spamhaus | IP 黑名单 |
temporarily deferred | 频率、灰名单、信誉观察 |
| 接受但进 spam | 信誉、内容、发送节奏 |
看到 4xx,一般是临时拒绝;看到 5xx,多数是硬拒绝。别只看“失败”,要看后面的文字。
这不是丢人,是现实。
如果你遇到下面几种情况,建议认真考虑 SMTP Relay:
- 服务商不开放 25 端口;
- IP 段信誉很差,换 IP 也不稳定;
- 你要发业务通知、验证码、订单邮件,不能赌投递率;
- 你没有精力维护 RBL、DMARC 报告、退信处理;
- Gmail/Outlook 长期进 spam,且认证都已经 pass。
一种折中方案是:
- 自己的 VPS 负责收信、IMAP、邮箱存储;
- 出站邮件走 Amazon SES、Mailgun、SendGrid、Postmark 这类 relay;
- From、DKIM、Return-Path 都按 relay 要求对齐;
- 重要交易邮件和个人邮件分域名或子域名。
这样你仍然掌控邮箱数据,但不用把所有投递压力压在一个便宜 VPS IP 上。
如果邮件现在就进垃圾箱,按这个顺序做:
- 看
/var/log/mail.log或 Docker 日志,确认是退信、延迟还是进 spam; - 发到 Gmail,查看原始邮件里的
spf/dkim/dmarc; -
dig TXT example.com +short检查 SPF; -
dig TXT selector._domainkey.example.com +short检查 DKIM; -
dig TXT _dmarc.example.com +short检查 DMARC; -
dig -x VPS_IP +short检查 PTR; -
postconf myhostname检查 HELO/EHLO 身份; -
nc -vz gmail-smtp-in.l.google.com 25检查端口 25; - 查 Spamhaus / MxToolbox;
- 注册 Google Postmaster Tools;
- 新 IP 先低量发送,不要群发;
- 仍不稳定时,考虑 SMTP Relay。
因为认证只是入场券,不是 inbox 保证。收件方还会看 IP 信誉、域名信誉、发送频率、历史投诉、内容质量、链接域名、用户互动。新 VPS IP 即使配置正确,也可能需要一段时间建立信誉。
不能。Cloudflare 管的是你的域名正向 DNS。PTR/rDNS 是 IP 的反向解析,要在 VPS 服务商那里设置,或者开工单处理。
刚排查时可以用 ~all 降低误伤。确认所有合法发信来源后,建议逐步收紧到 -all。但前提是你真的知道所有发信来源,包括网站表单、监控系统、第三方邮件服务。
不建议。先 p=none 收集报告,确认 SPF/DKIM 和所有发信来源都对齐,再逐步到 quarantine、reject。否则你可能把自己的合法邮件也拒掉。
能,但不要低估维护成本。收信和个人少量发信问题不大;如果是验证码、订单通知、客户邮件,建议至少准备 SMTP Relay 方案。
VPS 自建邮箱发信进垃圾箱,最常见不是“邮件服务器坏了”,而是身份和信誉没过关。
排查顺序很简单:先看退信日志,再看 SPF、DKIM、DMARC,然后查 PTR/rDNS、HELO、端口 25、IP 黑名单和 Postmaster 数据。认证没过先修认证,认证过了再看信誉和发送行为。
如果你用的是便宜 VPS,IP 段长期被滥用,别把时间全耗在配置上。该换 IP 就换 IP,该用 SMTP Relay 就用 Relay。自建邮箱能不能稳定投递,技术配置只是一半,另一半是信誉。
