反弹的电子邮件未被检测到

我正在尝试弄清楚如何让 Discourse 清理电子邮件列表,特别是弹回的电子邮件。该站点使用私有的 SMTP 服务器发送电子邮件,但回复地址设置为 Gmail 地址,以便 Discourse 进行 POP 访问。

因此,我在“收到的电子邮件”仪表板中看到了弹回的电子邮件。

但是,“弹回的电子邮件”仪表板下什么都没有。

当我查看 Discourse 错误日志时,我确实看到它检测到了弹回的电子邮件。

无法处理电子邮件:Email::Receiver::BouncedEmailError

Delivered-To: xxx.yyy@gmail.com
Received: by 2002:xxx:7022:911:xx:73:xxx:f96 with SMTP id xxx7csp1115046dlb;
Thu, 25 Jan 2024 12:03:33 -0800 (PST)
X-Google-Smtp-Source: AGHT+IEagzW8QOUgAyfOxU9wYaox/wuiL/wNqWhvftUB4uO/85r9H/55+FnfT6NrSTkLI5kfj+Vy
X-Received: by 2002:xxx:620a:4xxx:b0:xxxx:9265 with SMTP id br34-xxx8ba09265mr280168qkb.77.17062130xxx;
Thu, 25 Jan 2024 12:03:33 -0800 (PST)
Return-Path: <>
Received: from xxx.com (xxx.com. [207.xxx.xxx.xxx])
by mx.google.com with ESMTPS id bi4-xxx0b00783c84e9ef8si590747qkb.206.xxx.01.xx.12.03xxx
for xxx.yyy@gmail.com
(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
Thu, 25 Jan 2024 12:03:33 -0800 (PST)
Received-SPF: none (google.com: xxx.com does not designate permitted sender hosts) client-ip=207.xxx.xxx.xxx;
Authentication-Results: mx.google.com;
dkim=pass header.i=@xxx.co.nz header.s=alpha header.b=biFVvXep;
arc=fail (signature failed);
spf=none (google.com: xxx.com does not designate permitted sender hosts) smtp.helo=xxx.com;
dmarc=pass (p=NONE sp=REJECT dis=NONE) header.from=xxx.co.nz
Received: from xxx.co.nz (xxx.co.nz [210.xxx.xxx.5x])
by xxx.com (Postfix) with ESMTP id 4DD66xxx8E3
for xxx@zzz.com; Thu, 25 Jan 2024 20:03:28 +0000 (UTC)
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zzz.com;
s=dkim; t=1706213008;
h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
to:to:cc:mime-version:mime-version:content-type:content-type:
dkim-signature;

那么问题是:

  1. 为什么 Discourse 没有将弹回的电子邮件标记为弹回,我该如何纠正?

Discourse 使用 reply_key 将退信与已发送的电子邮件关联起来。当 Discourse 发送邮件时,它使用 reply_by_email_address 值作为 SMTP 信封发件人。

您需要确保您的 reply_by_email_address 包含一个 {reply_key},以便您的实例可以将退信与正确的已发送邮件关联起来。

例如,在 meta 上,它设置为 incoming+%{reply_key}@meta.discoursemail.com,任何发送到该地址的内容都会被传递到此实例。

1 个赞

感谢您的回复。不幸的是,我不得不关闭电子邮件回复中的 reply_key,因为我们的电子邮件中继服务器不识别 + 地址。还有其他选择吗?

1 个赞

您的电子邮件中继服务器无关紧要,只有邮箱所在的最终服务器才相关。电子邮件的本地部分对任何中间服务器都是不透明的。

根据以下内容,它不是 Gmail 吗?


我不确定我们是否有其他可靠检测退信的机制。

1 个赞

好的,为了澄清,接收退信的 SMTP 目标域服务器不识别 + 地址,因此它仅根据 To 字段将电子邮件转发到 discourse 通过 POP 接收的 Gmail 地址。这意味着如果 To 字段包含 reply_key,它就不会将该电子邮件转发到 discourse 使用的 Gmail 帐户。

所以,我不能将 reply_key 放在电子邮件地址中,可以放在其他地方吗?比如主题行、正文或其他 discourse 可以解析的地方?

如果您能寫下您實際使用的設定,即使稍微匿名化,也會有很大的幫助。

您可能還想研究一下設定 alternative_reply_by_email_addresses

我不這麼認為。

如果可能,對於您的設定,我建議如下:

  • reply_by_email_address 設定為 inbound+%{reply_key}@forum.hostname
  • 設定一個郵件伺服器來接收 forum.hostname 的郵件,並將所有郵件轉發到 the.gmail.account@gmail.com

這裡的中間郵件伺服器不需要理解加號定址,它只需要轉發該網域的所有郵件。

当然

邮件解析设置:

邮件发送设置:

  • Discourse 发送的邮件来自 discourse@xxx.com,通过为 Discourse 设置的专用域名 SMTP 服务器(使用 Discourse 域名地址)。
  • 任何回复或邮件退回时,域名 SMTP 服务器会将邮件转发到 discourse.xxxx@gmail.com。此域名 SMTP 服务器无法识别 + 地址,因此如果我在回复的电子邮件地址中包含 reply_key,它将被域名 SMTP 服务器丢弃。我只能设置规则来转发离散/唯一的入站电子邮件地址。
  • Discourse 论坛随后通过 GMail 使用 POP 访问这些转发的回复/退回的邮件并进行解析。

这有帮助吗?

我明白你的意思。由于 SMTP 服务器规则的限制,我无法为子域设置转发,只能将其配置为转发唯一的 To 电子邮件 ID。

但是,我有一个澄清——更像是在 Discourse 的工作方式上存在差异:

  1. 当用户回复电子邮件帖子时,它会正确显示——即使没有明确配置任何 {reply_key}(参见上面的屏幕截图),回复似乎也能完美运行。
  2. 但是,当电子邮件被退回时,Discourse 会将其归类为“已接收”,而不是“已退回”。
  3. 错误日志显示 Discourse 中的某些内容识别出这是一封已退回的电子邮件(请参阅我的第一个帖子错误日志)。那么,如果 Discourse 中的某些内容识别出这是一封已退回的电子邮件,为什么它没有显示在“已退回”下,而是显示在“已接收”下?

那么,为什么当用户回复帖子时,Discourse 会正确处理,但已退回的电子邮件却不会(并且错误日志和已退回电子邮件的仪表板之间似乎也存在脱节)。我是否遗漏了配置中的某些内容?

我也尝试在 Discourse 中将 reply by email address 设置为 discourse.xxx+%{reply_to}@gmail.com,但当邮件送达时,Gmail 似乎认为域名 yyy.com(Discourse SMTP 域名)试图仿冒 Gmail 域名,并将其标记为垃圾邮件。设置与发件人域名不同的回复域名似乎触发了 DMARC 和 SPF 失败。

ARC-Authentication-Results: i=1; mx.google.com;
       spf=softfail (google.com: domain of transitioning discussion.xxx+verp-b9c40db917ca04993dd3433cc9748518@gmail.com does not designate y.y.y.y as permitted sender) smtp.mailfrom=discussion.xxx+verp-b9c40db917ca04993dd3433cc9748518@gmail.com;
       dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yyy.com
Return-Path: <discussion.xxx+verp-b9c40db917ca04993dd3433cc9748518@gmail.com>

您已关闭 find related posts with key(希望您已阅读警告),因此 Discourse 使用 in-reply-to 邮件头来确定回复应引用哪个主题/帖子。

对于退回的电子邮件,它无法做到这一点——Discourse 需要知道退回的具体消息,而这些信息只能在一个地方找到——即 To: 地址(来自原始邮件的 envelope-from 地址)。

要实现这一点,当 Discourse 发送邮件时,它需要从其发件地址接收回复。Discourse 在 To: 头部查找此信息(而不是 envelope-to)。

正在伪造 gmail 域

如果您想从 gmail 地址发送邮件,则需要通过其服务器发送。但他们不喜欢这样做

看起来您尚未为 yyy.com 配置 DKIM;您应该这样做。如果配置正确,DMARC 应该会通过。

2 个赞

是的,它已配置,并且通过 yyy.com SMTP 服务器“发送”的 Discourse 邮件在 SPF、DKIM 和 DMARC 方面都没有问题(至少从管理员控制台的“发送测试邮件”页面来看)。

如果我将 yyy.com 地址设置为 reply_by_email_address,而是将 Gmail 地址设置为 gmail.com 地址,就会出现此问题。对于此设置,我是否可以采取一些措施,以便在将 reply_by_email_address 设置为 Gmail 地址时,DMARC 不会失败,同时将发件服务器保留为 yyy.com

如果它无法在“明显”的位置找到所需信息,它是否不能解析弹回邮件中的其余内容/附件以提取该信息(或者至少在设置中提供一个选项来执行此操作,并附带关于冒充的必要警告)?

DMARC 对齐失败,因为在这种情况下 reply_by_email_address 被用作 envelope-from 地址。

几乎唯一保证在退回邮件中完好无损的是地址。

也许是主题,但将此信息放在主题中并不实用。

我确实看到有些系统将原始邮件作为附件包含在内……理论上,我们可以检查退回邮件是否有附件以获取更多信息(如果存在)。

如果我理解正确的话,reply_by_email_address 应该在 Discourse 发送的邮件(来自 yyy.com)的 reply-to 字段中设置。这样,当用户回复时,他们会回复到 reply-to 邮件(gmail.com),而不是原始地址(yyy.com)。因此,在邮件回复的 envelope 中,from 地址应该是用户的电子邮件地址,而 to 地址是 gmail.com 地址。

为什么 reply_by_email_address 会被用作 from 地址?

reply_by_email_address 不用作发件人地址,而是用作信封发件人地址,特别是为了让退信正常工作。

这是一张演示每个地址如何使用的图片。地址本身是我们托管特定的,但足以作为示例。

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

通知:

可回复的消息:

2 个赞

谢谢。这非常有帮助。

所以基本上 reply_by_email_address 用于发件人标头,以便在邮件退回时能回到该电子邮件地址。如果启用了邮件回复,同一个电子邮件地址也会设置为回复标头。

所以,如果我上面的理解是正确的,那么如果 Discourse 可以为 reply-to 标头设置一个单独的设置(reply_to_email),那么就可以解决 DMARC 失败的问题。在发送时使用 yyy.com 域(取自 reply_by_email_address)作为发件人,并在启用邮件回复时使用 gmail.com 作为回复地址(取自新的 reply_to_email 设置)。如果邮件退回,它仍将退回到 reply_by_email_address,但如果用户回复,则会发送到 reply_to_email

那是 SMTP 的 envelope-from,而不是 From 标头。From 标头不用于退回。

即 ① 而不是 ②:

要通过 DMARC,SPF(结合发送 IP 验证 envelope-from)或 DKIM(验证 From 标头和邮件的校验和字段)必须对齐

听起来这个练习的重点是有一个“漂亮的”回复地址,用户可以回复?

你想要这样的东西吗?

envelope-from: outgoing+12309847801923840923502389423@yyy.com
…
From: notifications@yyy.com
To: user@contoso.com
Reply-to: my_sweet_forum+12309847801923840923502389423@gmail.com

必须像这样设置 envelope-from,否则退回将无法工作

1 个赞

是的,没错。想法是让 envelope-fromreply-to 不同。

由于 envelope-from 域和发送 IP 匹配,SPF 应该会通过,但同时回复可以发送到 GMail 进行处理,如果邮件退回,它将返回到原始域服务器,然后该服务器可以将退回的邮件转发回 GMail 收件箱。

它实际上看起来像这样:

envelope-from: outgoing@yyy.com
…
From: notifications@yyy.com
To: user@contoso.com
Reply-to: my_sweet_forum+12309847801923840923502389423@gmail.com

在我的设置中,outgoing 不会有 VERP,因为我的入站 SMTP 不支持 VERP(即退回的邮件不会有 VERP 地址),这就是为什么 reply-to 被发送到 GMail,因为它支持 VERP。这不应该像现在这样导致 DMARC 失败。