无法发送电子邮件 - 端口 465 出现问题

我想更改 SMTP 提供商,但似乎不起作用,尽管我确信服务器可以发送电子邮件。

我在 app.yml 中有这个:

  DISCOURSE_SMTP_ADDRESS: <<SMTP SERVER>>
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: <<USER>>
  DISCOURSE_SMTP_PASSWORD: <<PASSWORD>>

使用 telnet <<SMTP SERVER>> 465 可以正常连接,但当我尝试发送电子邮件时,Discourse 返回:

ERROR - Net::ReadTimeout with #<Socket:(closed)>

有人有什么建议需要设置的吗?

我根据这个主题检查了服务器:Troubleshoot email on a new Discourse install

当我手动执行此操作时,它似乎可以连接到服务器并正确发送测试电子邮件:

> sudo ./launcher enter app
root@support-app:/var/www/discourse# openssl s_client -connect mail.xxxxxxxx.com:465
  :
  :
  大量垃圾信息
  :
  :
220 xxxxxxx.com Anti-spam GT for Coremail System (mispb-6da2110f-64b0-4d67-acf1-2d302bd594f9-xxxxxxx.com[20220915])
EHLO mail.xxxxxxxxx.com
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrUDI0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrpDiNKUCa0xDrUUUUj
250-STARTTLS
250-SMTPUTF8
250 8BITMIME
AUTH PLAIN xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
235 Authentication successful
mail from: <xxx@xxxxxx.com>
250 Mail OK
rcpt to: <xxxx@xxxxxxx.com>
250 Mail OK
data
354 End data with <CR><LF>.
content

.
250 Mail OK queued as AQAAfwBXr9nSGHdj3hEgAA--.7073S2

输出需要多长时间才能显示?

在我发送命令后几乎立即显示。

编辑:有没有办法获得更详细的日志记录,以找出是哪个步骤导致了错误?

您的主机提供商很可能正在阻止出站端口。如果您使用的是 mailgun(或其他大多数服务),则端口 2525 应该可以工作。如果这是您运行的邮件服务器,那么您可以让它侦听另一个端口(例如 2525)。

或者(可能最难),您可以与托管您服务器的任何人开一个工单,要求他们打开该端口。

嗯,考虑到我可以 ./launcher enter app 然后 openssl 连接到邮件服务器,通过 SMTP 登录并成功从 discourse 容器内发送电子邮件,我怀疑不是端口不起作用……

2 个赞

我跟踪了代码,似乎甚至没有到达 EHLO。SMTP 服务器已连接,但似乎缺少 SSL 握手,因此服务器退出,Discourse 未收到任何响应,从而导致了错误。

因此,我怀疑端口 465 支持似乎存在 bug(它默认为 SSL,但我不认为 Discourse 能识别它),所以很可能 SSL 连接从未建立。

切换到端口 25 至少可以消除错误,尽管我还没有收到任何已发送的电子邮件……

编辑:我可以确认端口 25 可以正常工作(587 也应该可以,但不幸的是我的 smtp 服务器不公开 587)。

我之前没有收到任何电子邮件是因为 Discourse 服务器 IP 地址因尝试次数过多而被 smtp 服务器暂时列入黑名单。

1 个赞

我认为你说得对。

而且事实证明你不是第一个……在搜索 DISCOURSE_SMTP_PORT 465 时,我发现了一堆类似的问题。

最后一个包含一个(可能的?)解决方案链接

有了这个补丁,就可以设置
DISCOURSE_SMTP_FORCE_TLS=true 来在端口 465 上使用隐式 TLS
3 个赞

我也看到不少关于“465问题”的帖子。不过,除了显而易见的问题之外,我的邮件调试能力并不强,所以我一直在引用故障排除指南:

我们能在这上面添加些什么来帮助大家吗?

2 个赞

嗯,如果 @schungx 能够确认 DISCOURSE_SMTP_FORCE_TLS=true 确实是一个解决方案,我们可以添加它。

5 个赞

我马上试试!

编辑:@RGJ 我可以确认在 app.yml 中设置 DISCOURSE_SMTP_FORCE_TLS: true 成功解决了问题! :champagne:

我建议添加一个醒目的警告,说明 如果您使用端口 465,请设置 DISCOURSE_SMTP_FORCE_TLS: true,或者 Discourse 不应该足够智能地检测到这一点吗?

4 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.