discourse-doctor中的邮件测试失败

我正在尝试使用 ./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 个赞

对于 TLS,您应该使用端口 587 吗?

我建议在以下位置之后添加 puts error.backtrace(或类似内容):

然后重新运行 discourse-doctor

1 个赞

这是我们的自动回复器给出的建议,我认为尝试设置 smtp 域名可能值得一试。

1 个赞

托马斯,

支持论坛上有很多关于 465 的讨论。根据我的阅读,看起来 Discourse 对 SMTP 上的 SSL 和 TLS 做了很多假设,并且有一些环境变量可以控制详细的行为。

然而,鉴于这些论坛中报告的错误和相关问题的数量,我强烈感觉这些设置文档不全且难以使用。而且看到类似的问题可以追溯到 2017 年,这个问题已经存在很多年了。

搜索“端口 465”或“Net::ReadTimeout smtp”可以发现一长串类似的问题。

我会试试的。谢谢!

托马斯,

我正在尝试在 Docker 构建中查找此文件,但找不到。我看到它被包装在一个容器中,但我克隆的是 discourse/discourse_docker 而不是 discourse/discourse

当我尝试使用 launcher enter app 进入应用程序时,无法编辑该文件或安装 vi。

我找不到任何文档或标志来启用 ./discourse-doctor 的调试日志。

失败方式相同:无法发送电子邮件,./discourse-doctor 报告相同的错误。

已根据建议更新了 app.yml,重新构建了应用(无邮件),尝试运行 ./discourse-doctor 并收到相同的错误消息。

./launcher enter  app
sudo apt update && sudo apt install neovim -y

应该会有帮助。

谢谢!当我想不起 sudo apt install vi 而是 neovim 时,我感觉自己老了。我现在必须记住它叫 neovim

鉴于建议的堆栈跟踪转储更改,我提供: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'

似乎是对方中断了连接。

顺便说一下:http://talk.burlyqna.org/NjdhMDAwYTk4NmM3MmM1.txt 已不再可用

1 个赞

重建时是否会保留那些日志文件?

我更新了密码以移除符号,等待了 SMTP 身份验证传播延迟(足够长的时间可以吃午餐),并使用 swaks 确认了正确的凭据可以正确发送电子邮件,然后……

仍然是同样的错误。

我注意到重建会移除堆栈跟踪转储,所以我将把它加回来并尝试 ./launcher destroy app && ./launcher start app

1 个赞

已安装调试跟踪,运行了 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!'

您是否尝试过使用您的完整电子邮件地址作为登录名?

已更新 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 和非/错误响应。

经过大量测试,并在 @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 个赞

最终跟进:电子邮件工作正常!

我遇到的问题:

  • 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 个赞

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