通过 Google 的 SMTP 中继发送电子邮件时出现问题

问题描述 投票:0回答:2

我的基于 Ubuntu 的网络服务器偶尔需要发送电子邮件。我的Python代码是:

withsmtplib.SMTP('smtp-relay.gmail.com', 587, 'mydomain.com') as s:
    s.sendmail(fromaddr, toaddr, msg.as_string())
    s.quit()

我有

  • Google Workspace 帐户
  • 正在使用 IP 身份验证(不是 SMTP 身份验证
  • 我的登台和生产服务器已添加为可信 IP(登台是 本地,生产在云端

此设置已正常运行 6 个多月。

两天前,我将 Ubuntu 从 20LTS 升级到 22LTS,将 python 3.8 升级到 3.10。现在,电子邮件在临时服务器上运行良好,但生产环境不断出现问题:

Invalid credentials for relay [...]. The IP\n5.7.1 address you've registered in your G Suite SMTP Relay 
service doesn't\n5.7.7 match domain of the account this email is being sent from. If you are\n5.7.1 trying to 
relay mail from a domain that isn't registered under your G\n5.7.1 Suite account or has empty envelope-from, 
you must configure your\n5.7.1 mail server either to use SMTP AUTH to identify the sending domain or\n5.7.1 to 
present one of your domain names in the HELO or EHLO command. For\n5.7.1 more information, please visit 
https://support.google.com/a/answer/6140680#invalidcred ...

有什么建议吗?

编辑1: 我在云中启动了旧的 ubuntu 服务器。我将其新 IP 添加为 Google 信任的。电子邮件工作正常。我只能想到三种可能性

  • Google 以某种方式识别并信任来自旧版本的请求 设备(即使它现在有不同的IP
  • Linode 不知何故没有从我的新设备发送正确的 IP 地址 服务器
  • Ubuntu 升级期间出现了一些问题

我发现这 3 种可能性中的每一种都非常奇怪和令人难以置信,但我会继续研究。


PS:三个可能/可能不相关的事实:

  • 我已就地升级了临时服务器。为了生产,我纺了一个新的 例如,确保其他一切工作正常(除了 电子邮件),然后将 IP 从现有实例转移到新实例
  • 当我登录我的谷歌管理员帐户编辑可信IP列表时,我的 IP 与临时服务器相同。我不认为我有相同的 生产选项,因为它是我通过 SSH 管理的 Ubuntu 服务器
  • 我在网上找到了一些评论(官方文档中没有), 在 Google 中继任何内容之前,需要设置反向 DNS。 我大约 20 小时前设置了条目进行生产,但仍然 得到同样的错误。对于我的临时服务器,我没有 rDNS 它仍然发送电子邮件(可以通过互联网访问,但我 没有静态IP

PPS:

  • 发件人电子邮件是 [电子邮件受保护]不是@gmail.com
  • 生产服务器托管在 linode.com 上
  • 这个帖子即将结束 讨论类似的情况,但更侧重于 登录。我的设置使用 IP 身份验证,而不是 SMTP 身份验证。另外,直到周五(8/12)为止都运行良好
email smtp gmail smtplib
2个回答
0
投票

事实证明这是一个非常令人沮丧的问题。我最好的猜测是 Linode 的 Ubuntu 22.04 存储库存在问题。无论如何我们都在考虑迁移到AWS,这给了我们强大的动力。

无论如何,以下是我的经验中的一些提示,未来的读者可能会从中受益

  1. 当您使用 IP 身份验证 进行 Google 的 SMTP 中继时,更新相当。我最终使用 5 个不同的 IP 旋转了至少 5 个实例,每次 Google 都能在 2-3 秒内信任我的 IP(在工作区控制台中更新后
  2. Google 不关心我的反向 DNS 条目。我在网上读到一些评论说 Google 不会在没有 rDNS 的情况下进行中继,但我没有遇到任何此类问题(至少没有我设置的任何 rDNS。ISP 或云提供商有一个默认条目,这已经足够好了- 如果谷歌正在寻找它的话)。这个问题尤其严重,因为该信息可能需要几个小时才能传播,而且我一直在想也许我的代码明天就会开始工作。
  1. 我从 Google 收到的错误消息信息很少。我联系了 Google 支持,看看他们是否可以访问服务器端更有意义的内容。他们没有——这是浪费时间
  2. 运行一个假 SMTP 服务器来查看我的客户端发送的内容是有帮助的。我从这个post得到的。我运行了它,以获得一个有效的设置和一个无效的设置。就我而言,收到的通信是相同的。但事后看来,如果我在远程服务器上运行它,我可能会看到一些差异。
python -m smtpd -n -d -c DebuggingServer localhost:2500

0
投票

我今天遇到了同样的问题 - 这是为我解决的问题。

新服务器启用了 IPv6,这导致了问题。禁用 IPv6 后它立即开始工作。

禁用 IPv6:

  1. sudo nano /etc/sysctl.conf

  2. 添加以下行:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
  1. 使用
    sudo sysctl -p
  2. 保存并应用更改
© www.soinside.com 2019 - 2024. All rights reserved.