邮件发送到 SMTP 中继时出现问题

您好,
我们通过不需要用户名和密码的 SMTP 中继发送电子邮件时遇到问题。我可以使用 mailx / sendmail 向中继发送电子邮件。
以下是设置。

 DISCOURSE_SMTP_ADDRESS: xyz.example.com (已混淆)
 DISCOURSE_SMTP_PORT: 587
 DISCOURSE_SMTP_AUTHENTICATION: plain

使用 discourse_doctor 时,我收到此错误。

Net::ReadTimeout

在我看来,SMTP 消息似乎构造不当,因为我们发送了内容,但在 587 端口上没有收到任何回复。Wireshark 跟踪可以证明这一点。

您能否详细说明如何添加更详细的日志记录或额外的调试信息,以便我们进一步分析问题?常规日志对我来说没有任何信息。我找到了回溯信息,但我不是 Ruby 开发人员,无法解释它。

/usr/local/lib/ruby/3.2.0/net/protocol.rb:229:in `rbuf_fill'
/usr/local/lib/ruby/3.2.0/net/protocol.rb:199:in `readuntil'
/usr/local/lib/ruby/3.2.0/net/protocol.rb:209:in `readline'
net-smtp-0.3.3/lib/net/smtp.rb:1057:in `recv_response'
net-smtp-0.3.3/lib/net/smtp.rb:659:in `block in do_start'
net-smtp-0.3.3/lib/net/smtp.rb:1067:in `critical'
net-smtp-0.3.3/lib/net/smtp.rb:659:in `do_start'
net-smtp-0.3.3/lib/net/smtp.rb:611:in `start'
/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/message.rb:269:in `deliver!'
/usr/local/lib/ruby/3.2.0/delegate.rb:87:in `method_missing'
/var/www/discourse/lib/email/sender.rb:286:in `send'
/var/www/discourse/app/jobs/regular/user_email.rb:79:in `send_user_email'
/var/www/discourse/app/jobs/regular/user_email.rb:39:in `execute'
/var/www/discourse/plugins/chat/lib/chat/user_email_extension.rb:6:in `execute'
/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform'
rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/app/jobs/base.rb:236:in `block in perform'
/var/www/discourse/app/jobs/base.rb:232:in `each'
/var/www/discourse/app/jobs/base.rb:232:in `perform'
sidekiq-6.5.8/lib/sidekiq/processor.rb:202:in `execute_job'
sidekiq-6.5.8/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'
sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call'
sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'
sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:182:in `invoke'
sidekiq-6.5.8/lib/sidekiq/processor.rb:169:in `block in process'
sidekiq-6.5.8/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.5.8/lib/sidekiq/job_retry.rb:113:in `local'
sidekiq-6.5.8/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.5.8/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'
sidekiq-6.5.8/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
sidekiq-6.5.8/lib/sidekiq/processor.rb:263:in `stats'
sidekiq-6.5.8/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
sidekiq-6.5.8/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.5.8/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
sidekiq-6.5.8/lib/sidekiq/job_retry.rb:80:in `global'
sidekiq-6.5.8/lib/sidekiq/processor.rb:124:in `block in dispatch'
sidekiq-6.5.8/lib/sidekiq/job_logger.rb:39:in `prepare'
sidekiq-6.5.8/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.5.8/lib/sidekiq/processor.rb:168:in `process'
sidekiq-6.5.8/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.5.8/lib/sidekiq/processor.rb:68:in `run'
sidekiq-6.5.8/lib/sidekiq/component.rb:8:in `watchdog'
sidekiq-6.5.8/lib/sidekiq/component.rb:17:in `block in safe_thread'

我已经将应用程序降级到最新稳定版本,但这并未解决此问题。之前负责此问题的人员正在休假,因此我无法确定在最新更新发生之前它属于哪个版本。我还注意到,最近对邮件区域进行了代码更改。也许是那里的问题?

谢谢。

1 个赞

您的邮件引擎可能出现超时,这在最近的另一个主题中已提及。Postfix 默认似乎有 5 秒的超时限制。

我花了几天时间才让通过电子邮件回复和发帖正常工作,这需要在 Discourse 和您的邮件服务器中正确配置许多小细节,包括邮件程序设置和防火墙设置。

而且我还没有开始处理邮件程序问题,特别是如何在多个 ISP 处获得白名单。我已经成功配置了 SPF 和 DKIM。

谢谢你的回答,是的,但我正在寻找能告诉我问题所在的东西。这很棘手,因为 wireshark 跟踪显示电子邮件已发送,但没有收到响应。使用 Linux sendmail 的普通电子邮件可以正常工作。SPF 和 DKIM 也已分别设置在相应域上。我可以在 rails 控制台中重现该问题。

message = TestMailer.send_test(“ycxi@examle.com”)
Email::Sender.new(message, :test_message).send

我一点也不懂 Ruby,我会看看是否能获得比堆栈跟踪更详细的日志:

[5] pry(main)> wtf?
Exception: Net::ReadTimeout: Net::ReadTimeout

我们通过在 app.yml 文件中增加 SMTP 超时阈值来修复了一个类似的问题——参考这个主题:

app.yml 的修改方式如下:
image

修改 yaml 后,应用被重建:
sudo ./launcher destroy app && sudo ./launcher start app

更改已反映在 GUI 中: