Discourse SMTP 发送“EHLO localhost”而非域名,导致 Google smtp-relay 故障

@iwaffles -

你试过这个线程和其他相关线程中的解决步骤吗?

在你的 app.yml 中添加一行:

DISCOURSE_SMTP_DOMAIN: [your server's fqdn]

然后在 /var/discourse 目录下执行 ./launcher rebuild app。

discourse-doctor 可能仍会报告失败,但从管理控制台发送测试邮件应该可以正常工作,正常的邮件流程也应恢复。

如果上述方法没有奏效,请反馈,因为那意味着还有尚未发现的其它问题。

3 个赞

我尝试了重建,它起作用了!

你说得对,discourse-doctor 对我来说仍然失败。

我想我之前是重启了 Discourse 而不是重建,这很可能就是更改未生效的原因。谢谢 @Syonyk

2 个赞

看起来很明显,localhost 总是错误的,但大多数 SMTP 服务器会忽略该值,因此这一直无关紧要。

https://github.com/discourse/discourse 中,smtp_domain 出现的三个地方都已有 2 到 7 年的历史。我在想,是否某个库出于某种原因开始发送 localhost

尽管 @Falco 有所顾虑,我认为最好的解决方案还是在某处真正修复这个问题。

无论共识是否决定继续发送 localhost(尽管这不符合 RFC 规范),都需要按照上述方式修复 rake 任务。哦,顺便提一下,那段代码是我写的。:man_shrugging: 但是,等等。我发现 action_mailer.smtp_settings['domain'] 可以为空。所以我想:

Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])

应该改为:

Net::SMTP.start(smtp[:address], smtp[:port], smtp[:domain] || 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])

至少暂时这样。我认为如果存在 domain 就应使用它;如果 discourse_smtp_host 未定义,则使用当前的(但可能是错误的)行为,即使用 localhost

我不太愿意将此添加到 discourse-setup 中,因为目前对几乎所有人来说都能正常工作,而且这会增加一个令人困惑的问题。(我正准备为 notification_email 添加一个问题,如果我们不小心,它可能会开始变得像我记忆中几十年前的 Linux 内核那样复杂。)

也许 localhost 的来源就在这里?

2 个赞

刚被标记到这个问题,可以确认修复有效。我们原本低流量的实例也在 Sidekiq 中出现了激增, apparently 是由于摘要任务多次重试所致。

我原本以为 Google 实施了新的使用限制,因为那里的错误信息正是他们用于拒绝 DoS 攻击时发出的。

2 个赞

感谢您的报告!我很快将在 Discourse 设置中添加对此问题的修复。

2 个赞

现在已:

  • 作为示例环境变量配置添加到所有示例文件中

  • 在 Discourse 新安装设置过程中被询问

  • 在 discourse doctor 和 rake 任务中已修复

感谢大家 :tada:

5 个赞