您好,
我们刚刚将自托管的 Discourse 实例从一台服务器迁移到了另一台。所有设置(包括“通过电子邮件回复”和“允许通过电子邮件发布新帖子”)都已从旧系统迁移到新系统。我们使用 discourse/mail-receiver 设置来处理电子邮件部分。
在旧系统中,“回复地址”和“新邮件”功能都运行良好,但在新服务器上我们遇到了问题:回复地址功能不再起作用。
- 作为未知用户,当我向为此目的配置的电子邮件地址发送邮件时,可以看到邮件进入系统。系统会创建一个临时的新用户,消息也会被发布。太棒了!
- 作为团队用户,我可以回复该邮件,消息也能正确送达。很好!
- 但是,再次回复该邮件(本应在 Discourse 中生成回复)却失败了。当邮件到达 mail-receiver 时,它尝试通过 API 投递,但失败并出现以下日志错误:
(出于隐私原因,我已修改了用户名和域名)
<22>Sep 13 09:45:15 postfix/qmgr[81]: AF8665CA560: from=<test-user@outside-org.nl>, size=9233, nrcpt=1 (queue active)
<23>Sep 13 09:45:15 receive-mail[144]: Recipient: 6ffb2772c3b09bf60fc2705753fb32ce@forum.acme.org
<19>Sep 13 09:45:15 receive-mail[144]: Failed to POST the e-mail to https://forum.acme.org/admin/email/handle_mail: 400
<22>Sep 13 09:45:15 postfix/pipe[143]: AF8665CA560: to=<6ffb2772c3b09bf60fc2705753fb32ce@forum.acme.org>, relay=discourse, delay=1126, delays=1126/0.01/0/0.21, dsn=4.3.0, status=deferred (temporary failure)
如前所述,整个来回流程在旧设置中运行完美。新设置与旧设置完全相同(local_discourse/app 和 local_discourse/mail-receiver)。
- 有人能告诉我为什么 handle_mail API 会在回复邮件时返回 400 错误吗?
- 是否可以让日志记录更加详细,以便我能深入排查问题?
RGJ
(Richard - Communiteq)
2
您应该可以在“管理”>“邮件”>“已拒绝”中找到更多信息。
不,抱歉,它甚至没有显示为“已拒绝”。我想这是因为触发了 400 错误请求。
我想知道“新邮件”和“回复邮件”之间的区别。我认为唯一相关的区别在于收件人。但两者都通过相同的处理程序(mail-receiver),并被发布到同一个 API:https://forum.acme.org/admin/email/handle_mail。
pfaffman
(Jay Pfaffman)
5
您也迁移了这个设置吗?您是否相应地更新了 MX 记录?
您是否更改了论坛的主机名?
问题不在 MX 部分。日志显示邮件确实已到达邮件接收器,但一旦将其提交至 API,就会收到 400 错误(表示请求无效)。
不过,在设置上确实存在一个差异:我在其前面部署了一个反向代理(nginx),以实现“临时离线”功能,并可能让同一台主机上托管其他网站。尽管如此,我仍然不明白为什么会出问题,因为新话题的提交毫无障碍。不过,我还是打算看看如果把反向代理移除会发生什么……
更新
真糟糕!我将 Discourse 的安装从 nginx 反向代理之后移开(基本上是用正确的设置重新构建 app 并关闭 nginx),但这完全没有解决问题!
现在,我真的束手无策。这到底是怎么回事?
总结如下:
- 我们之前的 Discourse 安装(app 和邮件接收器)可以接受新话题和回复
- 迁移到新服务器后(所有配置完全相同),新话题仍然可以接受,但回复却被以 400 错误请求(Bad Request)退回。
我发现了导致这一问题的根源。
在使用多个邮件客户端进行测试时,我发现使用桌面客户端(Thunderbird)发送邮件会触发“400 Bad Request”错误,而使用网页客户端时,回复则能正常发送。
进一步调查后发现,Thunderbird 在回复时不知何故切换到了 Western (Windows-1252) 编码,而网页客户端则坚持使用 UTF-8。在强制 Thunderbird 使用 UTF-8 后,邮件也成功发送了。
Thunderbird,邮件发送失败
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit
网页邮件
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Thunderbird,邮件发送成功
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
我认为邮件接收方需要进行编码检查和清理,但我并非 Ruby 开发者,因此将这部分代码交由开发人员处理 