邮件回复与通知不兼容

我仔细阅读了此链接 Email delivery configuration checklist 及后续的邮件指南。

我研究了此链接 https://meta.discourse.org/t/how-to-setup-reply-by-email-address-now-that-it-must-be-different-from-the-notification-email/126767,以及这个 https://meta.discourse.org/t/notification-email-cannot-be-the-same-as-reply-by-email/28840。

我在论坛上使用的所有地址都可以通过邮件客户端(如 Thunderbird 或 Claws Mail)发送或接收邮件。

有四个不同的地址,只有前三个与此主题相关:

  • app.yml 中的管理地址:admin@
  • app.yml 中的通知地址:forum@
  • reply-to 地址:reply@
  • 以及邮件发布地址:questions@
  1. 通过论坛邮件列表状态收到的通知发送正常。并且 admin/email/server-settings 页面上的发送测试也通过了。

  2. 如果我设置了邮件回复功能,该功能可以正常运行,但通知功能却停止工作了。
    先前的发送测试会失败,状态显示为“501 5.5.4 You are not allowed to send from this address.”(您不允许从该地址发送。)

  3. 如果我禁用邮件回复功能,测试会再次正常通过。

谁能向我解释为什么会出现这个错误,以及如何正确地同时设置通知和“邮件回复”功能?

2 个赞

该消息来自您的邮件发送服务。它很清楚。

您需要从您的 SMTP 服务器可以使用的电子邮件地址发送。这就像它被设置为从 example.com 发送,而您现在正从 forum.example.com 发送。

4 个赞

那么为什么在一种情况下发送测试是正常的,而当我设置“通过电子邮件回复”时却是失败的呢?我需要说明的是,我没有更改通知的任何配置。

Discourse 在准备邮件时发生了什么?

1 个赞

问题确实出在 Discourse。

通过优化日志设置,我看到所发帖文确实是通过正确的地址进行身份验证的:

2026-02-25T12:54:24Z TRACE Data store
iteration operation (store.data-iterate) elapsed = 0ms
<3.14, remotePort = 47104, accountName =
“forum.cagut@domain.tld”, accountId = 31

但是它变成了

2026-02-25T12:54:24Z ^\[\[35;1mTRACE ^\[\[37;1mRaw SMTP output sent
(smtp.raw-output) listenerId = “submissions”, localPort = 465, remoteIp
= 51.178.53.14, >
<53.14, remotePort = 47104, size = 73,
contents = “MAIL
FROM:<reply.cagut+verp-8bf40c695b1f612e555cf25f3c14c9b8@domain.tld>\\r\\n”

邮件服务器对这种地址格式一无所知。

1 个赞

这个魔术数字是 Discourse 将回复与主题关联起来的方式。

您需要另一个邮件服务器(或更改此服务器以支持 + 地址)或者不使用邮件回复。

是的,我知道这是用于“通过电子邮件回复”的标识符。

因此,当“回复…”启用时,发送邮件的测试不起作用。文档中没有说明这一点,而且错误确实来自 Discourse,而不是邮件服务器,这正是您最初的回答!

此外,“from”地址如何能有这个“魔术数字”?这种地址格式用于邮件头中。
您的回答根本不是一个答案。

不应该对“From”进行这种转换。

而且,回答说我们必须放弃软件预期的功能是很奇怪的……

明天,我将进行其他研究。

1 个赞

它本身并不是对邮件头(header)的转换——当启用“通过邮件回复”时,Discourse 会发送邮件,并将信封发件人(envelope-from)设置为 reply_by_email_address 地址模式,如果邮件可回复,还会设置 reply-to: 字段。

例如,在 meta(本站)上是这样的:

notification_email: notifications@meta.discoursemail.com
reply_by_email_address: incoming+%{reply_key}@meta.discoursemail.com

这会变成:

Return-Path: <incoming+verp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@meta.discoursemail.com>
From: Person <notifications@meta.discoursemail.com>
Reply-To: Person <incoming+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@meta.discoursemail.com>

通知邮件进入 From 邮件头,而 reply_by_email_address 进入信封发件人。我们配置了传入邮件,使得任何发往 …@meta.discoursemail.com 的邮件都会被投递到 meta,从而使这个机制生效。

但是,如果您的邮件服务器不允许您使用这个信封发件人,您就会收到您报告的错误。

这个错误绝对是来自邮件服务器。Discourse 可能会向您报告它,但生成错误的还是邮件服务器。

2 个赞