安装后,Curl 可以发送电子邮件,但 Discourse 不能。求助修复?

你好!

在下文内容中,请将 \u003cDOT\u003e 替换为 . —— 由于我是新用户,Discourse 不允许我直接发布链接。

我在一台新创建的 Hetzner 云服务器上安装了 Discourse,其 URL 解析正常:forum.thewizardofosc.com

但是,我注册时使用的邮箱从未收到邮件。在日志文件中,Discourse 的日志显示为 Net::ReadTimeout,这是否说明了什么问题?

telnet 连接成功——输入 "telnet mail.thewizardofosc.com 465" 后显示 "Connected to thewizardofosc.com"

此外,使用 Curl 也能成功发送邮件!

输入以下内容:
curl --ssl smtps://mail.thewizardofosc.com --mail-from discourse@thewizardofosc.com --mail-rcpt <VARIOUS_WORKED> --upload-file email.txt --user 'discourse@thewizardofosc.com:<PASSWORD>'

可以成功发送。

那为什么 Discourse 却无法发送呢?

以下是我认为与问题相关的 my app 文件中的部分配置:

## 初始注册示例:'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'iliasb@thewizardofosc.com'

## TODO: 用于验证新账户和发送通知的 SMTP 邮件服务器
# 必须提供 SMTP 地址、用户名和密码
# 警告:SMTP 密码中包含字符 '#' 可能导致问题!
DISCOURSE_SMTP_ADDRESS: mail.thewizardofosc.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: discourse@thewizardofosc.com
DISCOURSE_SMTP_PASSWORD: <PASSWORD>
#DISCOURSE_SMTP_ENABLE_START_TLS: true           # (可选,默认为 true)

## 如果您添加了 Let's Encrypt 模板,请取消注释以下行以获取免费 SSL 证书
LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

需要查看错误日志,以了解您的邮件设置出现了什么问题。

我已经按照以下步骤操作:Troubleshoot email on a new Discourse install - #2

但效果不佳。运行 discourse-doctor 时,我得到的输出仍然是 Net::ReadTimeout,这个错误也出现在 shared/standalone/log/rails/production.log 中。

你好!

你指的是 shared/standalone/log/rails/production.log 吗?

我在那里看到:

已发送邮件 5208d56b-b84b-4de6-a13e-76b60179af46@forum.thewizardofosc.com (60142.6ms)
作业异常:Net::ReadTimeout

奇怪。如果你能从容器外部连接,可以检查一下那个 curl 命令在容器内部是否有效。我唯一的猜测是你在 Docker 网络方面遇到了问题。

Jay 说得对。

下一步逻辑操作,@onar3d,是在容器内部尝试您的 curl 测试。

我刚刚为您检查过,curl 已经安装在容器中,因此您至少不需要安装它。

docker exec -it app bash
root@hostname-app/# curl --version
curl 7.64.0 (x86_64-pc-linux-gnu) libcurl/7.64.0 OpenSSL/1.1.1d zlib/1.2.11 libidn2/2.0.5 libpsl/0.20.2 (+libidn2/2.0.5) libssh2/1.8.0 nghttp2/1.36.0 librtmp/2.3
Release-Date: 2019-02-06
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL 

希望这对您有帮助。

不错的建议!

但我通过 “docker exec -it DOCKERID bash” 进入 Docker 容器后,使用了相同的 curl 命令,同样可以成功执行。

谢谢,我刚刚试过了,一切正常!

所以不可能是 Docker 被阻止了……

你好 @onar3d

这虽然有点碰运气,但既然你使用的是 465 端口而不是 587 端口,不妨在你的容器 yml 文件中尝试以下设置:

DISCOURSE_SMTP_ENABLE_START_TLS: false

然后重新构建容器,看看是否运气好 :slight_smile:

参考:

以 Gmail 为例(供比较),它开放了以下端口和认证方式:

  • TLS/STARTTLS(有时称为显式 TLS):使用端口 587
  • SSL(有时称为隐式 TLS):使用端口 465

… 这次就赌一把了… :slight_smile: 但也许我们会好运

如果不行,你随时可以回退到原来的设置。

1 个赞

谢谢!

我刚才试了一下,邮件没有从 Discourse 发出 :confused:

是啊,这本来就是个碰运气的尝试……抱歉让你白费时间了!

我目前唯一的另一个“疯狂想法”是,看看你是否能进入你的邮件服务器(无论它是哪家服务商),将端口设置为 587(许多 SMTP 提供商都提供此选项),然后再次“碰运气”,当然,同时设置 DISCOURSE_SMTP_ENABLE_START_TLS: true

说实话,我通常不是那种喜欢碰运气的人,更倾向于以事实为依据;所以如果你不想尝试,我完全理解 @onar3d!!

谢谢!很遗憾,我没有权限更改该设置,这是由我的服务商提供的“交钥匙”式配置之一。

你好 @onar3d

明白了。我现在已经想不出什么“疯狂的主意”了,也该休息了;祝你好运,希望我们团队中聪明的成员能提出更好的建议。

祝一切顺利。

经过几次尝试(非常感谢 @IAmGav!),我的 Discourse 设置已确认可以与另一台邮件服务器配合工作,这排除了一些可能的排查方向。

我的邮件服务提供商回复了我,提供了他们那边的错误日志信息和建议:

工程师检查了日志,从其 IP 地址看到的错误与 SSL 设置有关。最有可能的是他们使用了旧版本的连接设置。

证据:
来自 [95.216.139.49]:33568 的连接出现 TLS 错误:SSL_accept: 对等方关闭了 TCP 连接。

请尝试将 SSL 模式关闭,看看是否能正常工作。

我按照上述建议,将 DISCOURSE_SMTP_ENABLE_START_TLS 设置为 false,并在端口 465 以及 26(我的服务提供商列为非 SSL 连接的端口)上进行测试,但均未成功。

这是否是因为我尚未为 thewizardofosc.com 域名购买 SSL 证书?我现在通过进一步查阅资料才意识到这一点。

如果非 SSL 选项无法工作,那么付费 SSL 也无法工作。您的邮件主机应为您提供免费的 Let’s Encrypt SSL。

亲爱的 @onar3d

您可以考虑在运行 curl 测试时启用详细选项 -v,以便能够完整分析成功的握手过程,然后从该分析结果逆向推导。

您可以利用此详细选项逆向分析成功的关键所在 :slight_smile:

希望这对您有帮助