onar3d
(Ilias Bergstrom)
1
你好!
在下文内容中,请将 \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
IAmGav
(Gavin Perch)
2
需要查看错误日志,以了解您的邮件设置出现了什么问题。
onar3d
(Ilias Bergstrom)
4
我已经按照以下步骤操作:Troubleshoot email on a new Discourse install - #2
但效果不佳。运行 discourse-doctor 时,我得到的输出仍然是 Net::ReadTimeout,这个错误也出现在 shared/standalone/log/rails/production.log 中。
onar3d
(Ilias Bergstrom)
5
你好!
你指的是 shared/standalone/log/rails/production.log 吗?
我在那里看到:
已发送邮件 5208d56b-b84b-4de6-a13e-76b60179af46@forum.thewizardofosc.com (60142.6ms)
作业异常:Net::ReadTimeout
pfaffman
(Jay Pfaffman)
6
奇怪。如果你能从容器外部连接,可以检查一下那个 curl 命令在容器内部是否有效。我唯一的猜测是你在 Docker 网络方面遇到了问题。
neounix
(Dark Matter)
7
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
希望这对您有帮助。
onar3d
(Ilias Bergstrom)
8
不错的建议!
但我通过 “docker exec -it DOCKERID bash” 进入 Docker 容器后,使用了相同的 curl 命令,同样可以成功执行。
neounix
(Dark Matter)
10
你好 @onar3d
这虽然有点碰运气,但既然你使用的是 465 端口而不是 587 端口,不妨在你的容器 yml 文件中尝试以下设置:
DISCOURSE_SMTP_ENABLE_START_TLS: false
然后重新构建容器,看看是否运气好 
参考:
以 Gmail 为例(供比较),它开放了以下端口和认证方式:
- TLS/STARTTLS(有时称为显式 TLS):使用端口 587
- SSL(有时称为隐式 TLS):使用端口 465
… 这次就赌一把了…
但也许我们会好运
如果不行,你随时可以回退到原来的设置。
1 个赞
onar3d
(Ilias Bergstrom)
11
谢谢!
我刚才试了一下,邮件没有从 Discourse 发出 
neounix
(Dark Matter)
12
是啊,这本来就是个碰运气的尝试……抱歉让你白费时间了!
我目前唯一的另一个“疯狂想法”是,看看你是否能进入你的邮件服务器(无论它是哪家服务商),将端口设置为 587(许多 SMTP 提供商都提供此选项),然后再次“碰运气”,当然,同时设置 DISCOURSE_SMTP_ENABLE_START_TLS: true。
说实话,我通常不是那种喜欢碰运气的人,更倾向于以事实为依据;所以如果你不想尝试,我完全理解 @onar3d!!
onar3d
(Ilias Bergstrom)
14
谢谢!很遗憾,我没有权限更改该设置,这是由我的服务商提供的“交钥匙”式配置之一。
neounix
(Dark Matter)
15
你好 @onar3d
明白了。我现在已经想不出什么“疯狂的主意”了,也该休息了;祝你好运,希望我们团队中聪明的成员能提出更好的建议。
祝一切顺利。
onar3d
(Ilias Bergstrom)
16
经过几次尝试(非常感谢 @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 证书?我现在通过进一步查阅资料才意识到这一点。
IAmGav
(Gavin Perch)
17
如果非 SSL 选项无法工作,那么付费 SSL 也无法工作。您的邮件主机应为您提供免费的 Let’s Encrypt SSL。
neounix
(Dark Matter)
18
亲爱的 @onar3d
您可以考虑在运行 curl 测试时启用详细选项 -v,以便能够完整分析成功的握手过程,然后从该分析结果逆向推导。
您可以利用此详细选项逆向分析成功的关键所在 
希望这对您有帮助