philion
(Paul Philion)
2025 年3 月 9 日 05:32
1
我正在尝试使用 ./discourse-doctor 来排查 SMTP 问题。
我找到的最相关的 issue 是 https://meta.discourse.org/t/yet-other-smtp-587-port-email-various-errors/264267。
在实施建议之前,我一直遇到超时。
配置后:
DISCOURSE_SMTP_FORCE_TLS: true
DISCOURSE_SMTP_ENABLE_START_TLS: false
我从 discourse-doctor 得到以下信息:
==================== MAIL TEST ====================
为了进行稳健的测试,请从 http://www.mail-tester.com/ 获取一个地址。
或者直接给自己发送测试邮件。
邮件测试地址? ('n' 跳过) [admin@burlyqna.org]:
正在发送邮件至 admin@burlyqna.org...
正在使用 smtp.mailfence.com:465,用户名:philion@mailfence.com,使用 plain 认证进行测试。
SMTP 服务器连接成功。
正在发送至 admin@burlyqna.org...
发送邮件失败。
文件已到达末尾
参见:http://talk.burlyqna.org/NjdhMDAwYTk4NmM3MmM1.txt
我能够使用以下命令从外部验证 SMTP 服务器配置:
swaks --to philion@gmail.com --from admin@burlyqna.org --server smtp.mailfence.com:465 --auth LOGIN --tlsc --auth-user philion@mailfence.com
关于“SMTP 服务器连接成功。”但“发送邮件失败。”有什么线索吗?
非常感谢,
Paul
1 个赞
thoka
(Thomas Kalka)
2025 年3 月 9 日 06:42
3
对于 TLS,您应该使用端口 587 吗?
我建议在以下位置之后添加 puts error.backtrace(或类似内容):
然后重新运行 discourse-doctor。
1 个赞
sam
(Sam Saffron)
2025 年3 月 9 日 09:19
4
Support Helper Bot:
建议回复:
discourse-doctor 测试中出现的错误消息 “SMTP 服务器连接成功。发送邮件失败。已到达文件末尾” 可能表明 Discourse 环境在邮件提交过程中与您的 SMTP 服务器的交互存在问题。
首先,请在 app.yml 中确认您的 SMTP 设置:
DISCOURSE_SMTP_ADDRESS: smtp.mailfence.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: philion@mailfence.com
DISCOURSE_SMTP_PASSWORD: [您的密码]
DISCOURSE_SMTP_FORCE_TLS: true
DISCOURSE_SMTP_ENABLE_START_TLS: false
DISCOURSE_SMTP_DOMAIN: [您的域名] # 确保这与您的域名匹配!
在这种情况下,添加 `DISCOURSE_SMTP_DOMAIN` 设置至关重要。许多 SMTP 服务器(例如 Google 的 smtp-relay)会拒绝带有 `EHLO localhost` 的连接。此设置可确保 HELO/EHLO 命令使用您的完全限定域名 (FQDN)。
* 添加或修改这些设置后,请重建您的应用:
1. ```
cd /var/discourse
./launcher rebuild app
通过从管理面板发送测试邮件来测试您的配置。注意:尽管 discourse-doctor 由于其绕过常规应用邮件管道的方式,在某些特定配置下可能仍然失败,但管理面板测试更可靠。
此外,请确保您的 DNS 记录(如 SPF、DKIM 和 DMARC)已为您的域名正确配置,以避免被 SMTP 服务器拒绝。
有用的资源:
附加说明:
“已到达文件末尾”消息通常在 SMTP 握手失败或突然终止时出现。通过正确的域名设置 (DISCOURSE_SMTP_DOMAIN) 和重建,这些问题应该可以解决大多数配置。但是,请务必查阅您的电子邮件提供商的文档以了解服务器特定的细微差别。
这是我们的自动回复器给出的建议,我认为尝试设置 smtp 域名可能值得一试。
1 个赞
philion
(Paul Philion)
2025 年3 月 9 日 15:48
5
托马斯,
支持论坛上有很多关于 465 的讨论。根据我的阅读,看起来 Discourse 对 SMTP 上的 SSL 和 TLS 做了很多假设,并且有一些环境变量可以控制详细的行为。
然而,鉴于这些论坛中报告的错误和相关问题的数量,我强烈感觉这些设置文档不全且难以使用。而且看到类似的问题可以追溯到 2017 年,这个问题已经存在很多年了。
搜索“端口 465”或“Net::ReadTimeout smtp”可以发现一长串类似的问题。
philion
(Paul Philion)
2025 年3 月 9 日 16:18
7
托马斯,
我正在尝试在 Docker 构建中查找此文件,但找不到。我看到它被包装在一个容器中,但我克隆的是 discourse/discourse_docker 而不是 discourse/discourse。
当我尝试使用 launcher enter app 进入应用程序时,无法编辑该文件或安装 vi。
我找不到任何文档或标志来启用 ./discourse-doctor 的调试日志。
失败方式相同:无法发送电子邮件,./discourse-doctor 报告相同的错误。
philion
(Paul Philion)
2025 年3 月 9 日 16:19
8
已根据建议更新了 app.yml,重新构建了应用(无邮件),尝试运行 ./discourse-doctor 并收到相同的错误消息。
thoka
(Thomas Kalka)
2025 年3 月 9 日 16:20
9
./launcher enter app
sudo apt update && sudo apt install neovim -y
应该会有帮助。
philion
(Paul Philion)
2025 年3 月 9 日 16:31
10
谢谢!当我想不起 sudo apt install vi 而是 neovim 时,我感觉自己老了。我现在必须记住它叫 neovim。
philion
(Paul Philion)
2025 年3 月 9 日 16:39
11
鉴于建议的堆栈跟踪转储更改,我提供:http://talk.burlyqna.org/ODgyZjg5Y2QyMTU1ZmEx.txt
相关代码片段:
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:237:in `rbuf_fill'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:199:in `readuntil'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:209:in `readline'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1017:in `recv_response'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1008:in `block in getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1027:in `critical'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1006:in `getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:986:in `quit'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:732:in `do_finish'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `ensure in start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/message.rb:269:in `deliver!'
/usr/local/lib/ruby/3.3.0/delegate.rb:87:in `method_missing'
/var/www/discourse/lib/email/sender.rb:296:in `send'
thoka
(Thomas Kalka)
2025 年3 月 9 日 16:53
12
1 个赞
philion
(Paul Philion)
2025 年3 月 9 日 18:51
14
我更新了密码以移除符号,等待了 SMTP 身份验证传播延迟(足够长的时间可以吃午餐),并使用 swaks 确认了正确的凭据可以正确发送电子邮件,然后……
仍然是同样的错误。
我注意到重建会移除堆栈跟踪转储,所以我将把它加回来并尝试 ./launcher destroy app && ./launcher start app。
1 个赞
philion
(Paul Philion)
2025 年3 月 9 日 18:59
15
已安装调试跟踪,运行了 doctor:
http://talk.burlyqna.org/NWQ5MjBlMTIwN2JiNGNl.txt
==================== 邮件测试 ====================
为了进行稳健的测试,请从 http://www.mail-tester.com/ 获取地址
或者直接给自己发送测试邮件。
用于邮件测试的电子邮件地址?(输入 'n' 跳过) [admin@burlyqna.org]:
正在发送邮件到 admin@burlyqna.org. . .
正在使用 smtp.mailfence.com:465,用户名:philion,以纯文本身份验证测试发送到 admin@burlyqna.org。
SMTP 服务器连接成功。
正在发送到 admin@burlyqna.org. . .
发送邮件失败。
文件已到达末尾
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:237:in `rbuf_fill'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:199:in `readuntil'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:209:in `readline'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1017:in `recv_response'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1008:in `block in getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1027:in `critical'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1006:in `getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:986:in `quit'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:732:in `do_finish'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `ensure in start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/message.rb:269:in `deliver!'
philion
(Paul Philion)
2025 年3 月 9 日 19:11
17
已更新 app.yml 以使用完整电子邮件作为用户,并使用 ./launcher destroy app && ./launcher start app 重新部署。
同样的错误:http://talk.burlyqna.org/ZDg1YWE1YTA2YWU1Zjhj.txt
销毁和启动也清除了调试信息,但我假设是同一个问题:
case rv = @io.read_nonblock(BUFSIZE, tmp, exception: false)
返回 nil,这会导致 EOF 和非/错误响应。
philion
(Paul Philion)
2025 年3 月 10 日 18:24
18
经过大量测试,并在 @thoka 的大力帮助下,我提供了以下总结:
我能够使用与 container/app.yml 相同的凭据运行 SMTP 测试,这些凭据同时适用于 swaks (Swaks - Swiss Army Knife for SMTP ) 和 @thoka 提供的示例 Ruby 代码(见下文)。
这些测试一直有效。但是,尝试启动 Discourse 服务器(无法向管理员用户发送初始电子邮件)或使用 discourse-doctor 机器人会导致电子邮件失败:
==================== MAIL TEST ====================
为了进行可靠的测试,请从 http://www.mail-tester.com/ 获取一个地址
或者直接给自己发送测试消息。
邮件测试地址?(输入 'n' 跳过) [admin@burlyqna.org]:
正在发送邮件至 admin@burlyqna.org. . .
正在使用 smtp.mailfence.com:465,用户名:xxx@mailfence.com,使用明文身份验证进行测试发送至 admin@burlyqna.org。
SMTP 服务器连接成功。
正在发送至 admin@burlyqna.org. . .
发送邮件失败。
文件末尾
这似乎是协议配置失败,因为我能够使用标准的 Ruby 工具发送测试电子邮件:
require 'mail'
SMTP_SERVER = 'smtp.mailfence.com'
SMTP_PORT = 465
USERNAME = 'xyz'
PASSWORD = '...'
FROM = 'admin@burlyqna.org'
TO = 'testing@gmail.com'
SUBJECT = 'Test from Ruby'
BODY = "Hello,\n\nThis is a test email sent from Ruby over a SSL-secured connection.\n\nBest regards!"
Mail.defaults do
delivery_method :smtp, {
address: SMTP_SERVER,
port: SMTP_PORT,
user_name: USERNAME,
password: PASSWORD,
domain: "burlyqna.org",
enable_starttls_auto: :false,
authentication: :plain,
ssl: true,
}
end
begin
puts 'Sending email...'
puts "SMTP_SERVER: #{SMTP_SERVER}"
puts "SMTP_PORT: #{SMTP_PORT}"
puts "USERNAME: #{USERNAME}"
puts "PASSWORD: #{PASSWORD}"
puts "FROM: #{FROM}"
puts "TO: #{TO}"
mail = Mail.new do
to TO
from FROM
subject SUBJECT
body BODY
end
mail.deliver!
end
我 app.yml 中的当前 SMTP 设置是:
DISCOURSE_SMTP_ADDRESS: smtp.mailfence.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: xxx@mailfence.com
DISCOURSE_SMTP_PASSWORD: '...'
DISCOURSE_SMTP_FORCE_TLS: true # https://meta.discourse.org/t/cannot-send-email-problem-with-port-465/246004/8
DISCOURSE_SMTP_ENABLE_START_TLS: false # (optional, default true)
DISCOURSE_SMTP_DOMAIN: burlyqna.org # (required by some providers)
DISCOURSE_NOTIFICATION_EMAIL: noreply@talk.burlyqna.org
1 个赞
philion
(Paul Philion)
2025 年3 月 13 日 23:46
19
最终跟进:电子邮件工作正常!
我遇到的问题:
DISCOURSE_SMTP_PASSWORD 包含符号但未加引号
DISCOURSE_SMTP_FORCE_TLS:true 以实现 SSL
DISCOURSE_SMTP_ENABLE_START_TLS:false 以停止 TLS 握手
DISCOURSE_NOTIFICATION_EMAIL 设置为不存在的电子邮件地址
DISCOURSE_SMTP_ADDRESS: smtp.mailfence.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: example@mailfence.com
DISCOURSE_SMTP_PASSWORD: 'passwd'
DISCOURSE_SMTP_FORCE_TLS: true
DISCOURSE_SMTP_ENABLE_START_TLS: false
DISCOURSE_NOTIFICATION_EMAIL: admin@example.org
1 个赞
system
(system)
关闭
2025 年4 月 12 日 23:46
20
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.