上周有个客户找到我,说网站表单提交后系统提示「邮件发送成功」,但收件人那边根本没收到,问是不是程序 bug。我第一反应还是老一套:去看队列、看日志、看有没有报错。结果日志干干净净,队列也是空的,什么异常都没有。
后来客户把一封「退信通知」转发给我,里面就一句 550 5.7.1 Message rejected by recipient。我看完就明白了程序层面这封邮件确实"发"出去了,是对方服务器在最后一跳把我们拒了。邮件送达这件事,坑从来不在代码里,而在 SMTP 那条链路上。很多站长以为发信送达率是玄学,其实它是一串可以逐跳排查的路径。
如果你手上正好有台机器要跑发信服务,邮件出口 IP 的干净程度直接决定送达率:干杯cloud(美国原生家宽静态 IP,运营商原生分配不共享出口)、nexip(独立 IP 租赁,可单独拿来做邮件出口)。共享出口 IP 是很多 VPS 商家默认给的方案,也是批量进垃圾箱的头号原因,下面会具体讲。

一、先把失败分两类:硬退信和软退信
排查之前必须先分清楚一件事对方拒你,和对方暂时没空收你,是完全不同的两回事。
硬退信(Permanent Failure,5xx):对方明确拒绝,这封邮件不会再投了。你会收到一封 bounce 邮件,里面带具体状态码。常见的是 550、552、554。这种情况必须改配置或者换发信 IP,重试一万次也没用,硬重试反而会让你的 IP 信誉掉得更快。
软退信(Transient Failure,4xx):对方只是暂时收不下,比如 421 服务不可用、451 临时错误、452 存储空间不足。这种邮件还躺在队列里,MTA 会按退避策略隔一段时间重试,指数退避重试机制就是专门伺候这类情况的。大多数时候等几十分钟到几小时它自己就进去了。
所以第一件事,是看退信邮件里冒出来的是 5 开头还是 4 开头。这一步判错,后面所有动作都是白费。
二、550、552、554 到底分别是什么意思
这三个是最常碰到的,但它们的成因差很多,处理方式也完全不同。
550 5.7.1:最常见的拒信,通常是策略性拒绝。细分下来还有意义差别:5.7.1 多半是「发信 IP 或域名不被信任」发信方被列进了对方的黑名单,或者没有正确配置反向解析;5.7.2 一般指向账号本身,比如目标邮箱不存在、或者被策略屏蔽;5.1.1 则是标准意义上的用户不存在(User unknown)。看到 550 别急着换 IP,先看后面的 Enhanced Status Code 细分。
552 5.2.2:明确写着「邮箱超限」,常见两种情况对方邮箱满了,或者你的邮件体积超过了对方允许的单封大小。这个报错其实是好事,它证明连接是通的、认证是过的,只是内容或体积不满足对方策略。把附件砍小、或者分批发,就能解决。
554 5.7.0:这个最容易被误判。很多人以为 554 是「对方拒收」,其实它经常来自中间的垃圾邮件网关,含义是「你的这封邮件触发了我们的过滤规则,但我不告诉你具体哪条规则」。典型触发点:纯文本邮件里带超链接、带跟踪像素、标题里有敏感词、发信频率突然从每天几封涨到每小时几百封。554 属于「身份没问题,但内容或行为有问题」,方向应该是降速和调整内容,而不是换 IP。
还有个 421,很多人不当回事。421 的意思是对方服务器在跟你打招呼时直接说了「太忙」,你这次连接会被断开。这类基本不用查配置,加队列、加退避重试就行。

三、退信邮件该按什么顺序读
退信邮件本身是有结构的,从下往上读最省事,因为越靠下越接近原因本身。
第一眼看 Diagnostic-Code 那一行,它会带上最后那台服务器的完整说明,比如 Diagnostic-Code: smtp; 550 5.7.1 Service unavailable, blocked using rbl.spamhaus.org。这一行里出现的域名和 IP 才是关键spamhaus 是全球最著名的 DNS 黑名单之一,被它拦下就是你的出口 IP 前科有问题。
第二眼看 Final-Recipient 和 Action。Action 字段会写 failed(终了)或 delayed(还在排队),这一行帮你确认是硬退还是软退。
第三步才是顺着 Reporting-MTA 和那段 ... will retry in ... 的时间戳往回找,找到到底是哪一跳出的问题。如果退信邮件里没有这些字段,那说明你的 MTA 在生成 bounce 的时候把原始报错给吞了这本身就是个 bug,需要去改 smtpd_* 的日志配置,把真实错误带出来。
四、Received 头:把投递路径完整还原出来
如果说退信码告诉你「结果」,那邮件原始头里的 Received 字段告诉你「过程」。这是排查邮件问题最有价值、也最少人看的一块。
每一台中继服务器在转发邮件时,都会在邮件头最上面插入一行 Received,格式是固定的:from 标识上一跳、by 标识自己、with 写协议类型(ESMTP、SMTP、ESMTPSA)、id 是这台机器的队列编号、for 是收件人、最后 time 是时间戳。
我一般的看法是:从上往下读,就是邮件真实走过的路径。最上面那行是最后一个碰过邮件的服务器,最下面那行是发件方自己的机器。中间任何一台的 time 出现异常大的间隔,就说明卡在那一跳了。
举个真实例子:有一封邮件从发出到落地花了 6 个多小时,用户以为是服务器性能问题。我把 Received 头拉出来一看,第 3 跳到第 4 跳之间空了 5 小时 50 分钟,第 4 跳是某个企业的边界网关。然后去查这个企业的公开策略,发现它把来自陌生 ASN 的邮件全部延迟到非工作时间再投递典型的灰名单策略。这种延迟其实不影响送达,只是难看。
反过来,如果路径里根本没出现对方的收信服务器,那说明它被拒在了半路上;如果出现了但 status 字段写的是 unknown 或者内容空着,那就是连接建立后被掐断了。

五、送达率真正的杀手:IP 信誉和发信行为
配置层面(DNS 认证记录、反向解析、端口开放)只能决定「有没有被硬拒」。真正决定长期送达率的是两件更虚但更要命的事。
第一是发信 IP 的信誉。这条特别值得单独说。市面上大量便宜 VPS 给的是共享 IP,同一个 IP 上可能有几百家用户在发信,其中一个用户群发保健品,整个 IP 段就进了垃圾箱数据库。你自己配置做得再对,IP 是共享的,一样进垃圾箱。所以做邮件发送,独立 IP 是底线。原生 IP、家宽 IP 这类运营商直接分配的地址,信誉起点天然比数据中心共享 IP 高很多,因为它们不是从 abused 列表里反复回收再利用的。
第二是发信节奏。新 IP 建立信誉要爬坡,前几天从每天几十封慢慢加到几百封,突然拉高会被当成垃圾邮件源。内容上,带短链、带追踪参数、纯 HTML 正文、标题堆砌关键词,这些都会直接触发过滤规则。一个很实用的经验:如果你的系统自动发的是验证码、订单通知这类模板化邮件,务必在标题里带上收件人自己的名字,机器学习式的反垃圾系统对「个性化程度」的权重给得非常高。

六、该自己搭还是买企业邮箱
绕不开的选择题。简单说:如果发信量一年就几千封,注册域名做验证(把企业邮箱的 DKIM 和 DMARC 记录挂上去)几乎零成本,优先用企业邮箱,人家养了十几年的 IP 信誉不是你能比的。
真正值得自建的场景是三种:发信量到每天几千封以上且高度模板化;需要邮件内容完全可控(比如自己系统直接产出最终邮件、不想再经过第三方);以及有批量投递需求但又想保住 IP 信誉(那就得自建 MTA + 独立 IP + 长期养 reputation)。
如果走自建路线,Postfix 是当下最省心的选择,队列管理、限速、退信分类这些细节它都处理得比较到位:
另外几个必踩的坑提前说:别用系统默认的 25 端口直连,很多机房是封 25 的,走 587 提交加认证更稳;一定要配反向解析,对端服务器会拿你的 IP 去查 PTR,查不到就直接拒;退信要单独归档统计,不看退信率的话,你的送达率掉到 50% 也不会有人发现。
最后给一个我自己用的最小排查清单:收到「没收到」的反馈,第一步要退信邮件原文(没有原文等于没线索),第二步看状态码定性质(4xx 等,5xx 改配置),第三步看 Enhanced Code 细分,第四步拉 Received 头还原路径找卡点,第五步查出口 IP 的黑名单状态和发信频率。如果五步走下来发现配置都没问题,那八成是共享 IP 的锅,这时候换独立 IP 比改十遍配置都管用。



下载 
下载 
下载
下载 
下载
下载
喜欢
顶
难过
囧
围观
无聊




