通过 smtp.gmail.com IPv6 地址发送邮件,报错 421 4.7.0 Try again later

更新日期: 2025-10-28 阅读次数: 42 字数: 806 分类: DNS

今天线上服务器通过 smtp.gmail.com 发送邮件时,持续报错:

fail to send email: 421 4.7.0 Try again later, closing connection.

比较奇怪的是:

  • 在其他服务器上,同样的代码和配置,却能正常发送邮件。
  • 当前服务器上,换成 smtp.163.com 等其他 SMTP 服务器,也能正常发送邮件。
  • 这个发送邮件的服务运行一年多了,今天第一次出邮件无法发送的问题

nc 命令测试

有问题的服务器上测试:

# nc -v smtp.gmail.com 587
Connection to smtp.gmail.com (2404:6800:4003:c05::6c) 587 port [tcp/submission] succeeded!
421 4.7.0 Try again later, closing connection.

而正常的服务器上测试:

# nc -v smtp.gmail.com 587
Connection to smtp.gmail.com 587 port [tcp/submission] succeeded!
220 smtp.gmail.com ESMTP a640c23a62f3a-b6d85372e5asm1014513766b.32 - gsmtp

比较奇怪的是,有问题的服务器上,nc 命令连接到的 IP 地址是 IPv6 地址,而正常的服务器上,连接到的是 IPv4 地址。

  • 出问题的服务器,同时有 IPv4 和 IPv6 地址
  • 发邮件正常的服务器,只有 IPv4 地址

改成 IPv4 试试

参考 stackoverflow 上的建议(这个老哥的测试真是细致),换成 IPv4 地址试试:

https://stackoverflow.com/questions/63375834/gmail-421-4-7-0-try-again-later-closing-connection

在 /etc/hosts 文件中添加一行:

108.177.15.109 smtp.gmail.com

再次使用 nc 命令测试:

# nc -v smtp.gmail.com 587
Connection to smtp.gmail.com (108.177.15.109) 587 port [tcp/submission] succeeded!
220 smtp.gmail.com ESMTP ffacd0b85a97d-429952d9e80sm17755367f8f.28 - gsmtp

此时,连接成功,没有再出现 421 错误。

然后在 golang 代码和 PHP 代码中测试,也都能成功发送邮件了。🥲

隐患

虽然通过修改 /etc/hosts 文件解决了问题,但这并不是一个根本的解决方案。 因为 Gmail smtp 服务器可能会更改其 IP 地址,导致 /etc/hosts 文件中的记录失效。

我查了一下,可以通过系统级的配置,强制让系统使用 IPv4 地址。但是这会影响到所有的服务,感觉不太合适。 因为之前遇到过有的服务商只支持 IPv6 地址访问。参考前文:

docker 误朕,Joomla 发送邮件超时失败,原因竟是 docker 默认不支持 IPv6

为什么 IPv6 会导致 421 错误?

参考这个帖子:

https://stackoverflow.com/questions/65377421/django-force-ipv4-for-email-host-gmail-421-4-7-0-try-again-later-closing

My IPv6 reverse DNS did not resolve. That was the problem. After adding my ipv6 address to the DNS things worked.

但是我查了半天还是没有理解这跟 reverse DNS (rDNS)有什么关系? 😅 按理说我是利用 gmail 账号发送邮件的,跟我的 IPv6 地址有什么关系呢? 难道是 IPv6 地址被 ban 了?检查了半天日志,发现发送的邮件也不多,一天不到 20 封,应该不会被 ban 吧 ……

今天先不查了,后续有时间再研究吧。

golang 中的逻辑优化

  • 可以通过代码解析 smtp.gmail.com 的 IP 地址,优先选择 IPv4 地址进行连接。
  • 如果遇到发送失败,再尝试使用其他服务商的 SMTP 服务器发送邮件。例如 smtp.163.com 等等。

关于作者 🌱

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式