延长SMTP超时

Discourse 是否有办法延长其等待 SMTP 服务器返回电子邮件已提交确认信号的超时时间间隔?或者,是否有办法将 Discourse 配置为不需要此确认信号?

我遇到了 Discourse 生成重复电子邮件的问题。Discourse 在提交电子邮件进行发送时收到 Net::Timeout 错误。我的电子邮件提供商实际上已成功发送了电子邮件,但 Discourse 并不知道这一点,因此会继续重新发送电子邮件。这种情况会无限重复。

我们最近添加了 SMTP 超时自定义功能,但这与实际的 SMTP 连接有关:

听起来您的问题是在连接建立之后,问题出在发送事务超时?

2 个赞

是的,据我所知。连接已建立,电子邮件已提交,但之后会报告 Net::Timeout 错误。

使用 discourse_doctor 脚本,我可以看到在事务成功时返回的消息 ID 以及在事务失败时出现的 Net::Timeout 错误。

此问题在更新到 Discourse 2.9.0.beta5 后出现。我推测 Discourse 在该更新中对该错误变得不那么宽容了。

我在 mail 和 net/smtp ruby gems 中找不到任何相关的更改。也许是您的 SMTP 服务器行为异常?您是否有可能迁移到另一个服务器?

1 个赞

谢谢您的检查。我同意,我的电子邮件提供商似乎是问题的根源,因为它在电子邮件提交后响应不够迅速。我只能推测问题与负载有关,因为有些日子我不会遇到这个问题。

更换电子邮件提供商由于多种原因是一个重大挑战。寻找一种配置 Discourse 来解决此问题的方法是最有吸引力的解决方案。

将邮件提供商迁移到新的似乎是此问题的唯一解决方案,但这需要我重新配置整个域的邮件提供商,这是一项我想避免的任务。

是否可以更改 Discourse 处理传出邮件的代码,使其忽略邮件提交失败,就像过去那样?我不是 Rails 开发者,所以我不知道从哪里开始。我不想破坏我接收未来 Discourse 更新的能力。

您是基于什么得出以上陈述的?每个域/子域实际上只能针对一套基础架构接收邮件,但有多个服务可以代表其转发邮件。

或者,您也可以启动一个专用于您的实例的新子域,这甚至不需要重建即可进行配置。

我过去曾尝试过一次,但配置错误,无法解决,因此我不愿更改任何内容。我也希望 Discourse 电子邮件能从我的公司域名发送,但既然行不通了,我将再次尝试按您建议的那样,为传出电子邮件使用子域名。

我使用 RackSpace Cloud 创建了一个电子邮件子域,并确认可以使用 Apple Mail 和 curl 从我的 Mac 发送邮件。我也确认可以使用 curl 从我的服务器发送邮件。但是,我收到了 discourse-doctor 的这个错误:

Testing sending to support@latenightsw.com using secure.emailsrvr.com:465, username:username with plain auth.
======================================== ERROR ========================================
                                    UNEXPECTED ERROR

Net::ReadTimeout

====================================== SOLUTION =======================================
This is not a common error. No recommended solution exists!

Please report the exact error message above to https://meta.discourse.org/
(And a solution, if you find one!)

我的 app.yml 文件包含以下设置:

  DISCOURSE_SMTP_ADDRESS: secure.emailsrvr.com         # (mandatory)
  DISCOURSE_SMTP_PORT: 465                             # (optional)
  DISCOURSE_SMTP_USER_NAME: username      # (optional)
  DISCOURSE_SMTP_PASSWORD: password               # (optional, WARNING the char '#' in pw can cause problems!)

  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)

这与此处记录的配置相匹配:https://docs.rackspace.com/support/how-to/rackspace-email-and-hosted-exchange-settings

我曾尝试将 DISCOURSE_SMTP_ENABLE_START_TLS 设置为 false。关于 Net::ReadTimeout 错误的其它帖子建议尝试这些设置,但这没有任何区别:

  DISCOURSE_SMTP_AUTHENTICATION: "login"
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

如何诊断此故障?

@Falco 如何对我的 Discourse 配置进行此更改?我找不到任何关于我可以在 app.yml 文件中添加的设置的文档。