收到退信"550 4.4.1 Connection timed out"应如何排查?

发往某域名一直退信"550 4.4.1 Connection timed out",但对方邮件系统网页端能访问,怎么解决?

550 4.4.1 Connection timed out(或 451 4.4.1 临时性超时变体)表示您的邮件服务器在 SMTP 连接阶段(通常是 TCP 握手或初始 banner 接收)超时,未能与收件方 MTA 建立有效连接。这类问题的排查步骤如下:

1. 基础网络连通性检查

首先从邮件服务器上用基本工具测试目标 MX 主机的可达性:

# 查询目标域 MX 记录
dig mx target.com +short

# 测试 TCP 25 端口可达性(注意只显示握手成功)
nc -zv mx.target.com 25

# 使用 telnet 手动 SMTP 连接
telnet mx.target.com 25

如果 TCP 连接本身超时,说明网络层面被阻断——可能是本地出方向防火墙禁止了 25 端口、目标网络屏蔽了您的源 IP、云服务商(如 AWS EC2、阿里云 ECS)默认限制了 25 端口出站。

2. 出方向 25 端口限制

绝大多数公有云平台默认禁用 25 端口出站(以防范垃圾邮件),需提交工单申请解封。验证方法:curl -v telnet://mail.target.com:25。如果在非 25 端口(如 465/587)可以连接,唯独 25 端口超时,则基本可确认是 ISP/云平台限制。

3. DNS 解析问题

检查本机 DNS 是否能够正确解析目标域的 MX 记录。有时根 DNS 或权威 DNS 的查询超时也会导致投递失败:

# 指定公共 DNS 重新查询
dig target.com mx @8.8.8.8

如果本机 DNS 返回结果慢或不一致,考虑调整 Postfix 的 smtp_dns_resolver_options 或使用独立的 DNS 缓存服务(如 Unbound)。

4. 队列状态与重试间隔

在 Postfix 上检查邮件队列状态:

# 查看队列中待投递的邮件
postqueue -p

# 查看具体邮件的投递日志
mailq | grep target.com

Postfix 默认重试间隔为 0 分钟后立刻尝试、15 分钟、1 小时逐渐递增。如果连接超时是临时性的(目标服务器过载),邮件会在队列中等待 maximal_queue_lifetime(默认 5 天)后返回退信。

5. 目标服务器侧的检查

如果上述全部正常,可能是对端防火墙或 IP 黑名单策略导致:

  • 对方可能配置了 IP 级别的连接速率限制或 Greylisting;
  • 您的源 IP 可能出现在对方使用的连接级别拒绝列表中(如 Spamhaus DROP 列表);
  • 尝试使用 openssl s_client -connect mx.target.com:25 -starttls smtp 查看是否能收到对方的 SMTP banner。

建议联系对方邮件管理员确认其入站过滤策略,或通过第三方中转服务(如 SMTP relay 服务)临时转发来定位隔离问题。

参考来源:RFC 5321 Section 4.5 — Mail Routing and the SMTP 4xx/5xx Status Codes · Postfix Queue Management