RBoy
(RBoy)
1
我正在尝试弄清楚如何让 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;
那么问题是:
- 为什么 Discourse 没有将弹回的电子邮件标记为弹回,我该如何纠正?
Discourse 使用 reply_key 将退信与已发送的电子邮件关联起来。当 Discourse 发送邮件时,它使用 reply_by_email_address 值作为 SMTP 信封发件人。
您需要确保您的 reply_by_email_address 包含一个 {reply_key},以便您的实例可以将退信与正确的已发送邮件关联起来。
例如,在 meta 上,它设置为 incoming+%{reply_key}@meta.discoursemail.com,任何发送到该地址的内容都会被传递到此实例。
1 个赞
RBoy
(RBoy)
3
感谢您的回复。不幸的是,我不得不关闭电子邮件回复中的 reply_key,因为我们的电子邮件中继服务器不识别 + 地址。还有其他选择吗?
1 个赞
您的电子邮件中继服务器无关紧要,只有邮箱所在的最终服务器才相关。电子邮件的本地部分对任何中间服务器都是不透明的。
根据以下内容,它不是 Gmail 吗?
我不确定我们是否有其他可靠检测退信的机制。
1 个赞
RBoy
(RBoy)
5
好的,为了澄清,接收退信的 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
這裡的中間郵件伺服器不需要理解加號定址,它只需要轉發該網域的所有郵件。
RBoy
(RBoy)
10
我明白你的意思。由于 SMTP 服务器规则的限制,我无法为子域设置转发,只能将其配置为转发唯一的 To 电子邮件 ID。
但是,我有一个澄清——更像是在 Discourse 的工作方式上存在差异:
- 当用户回复电子邮件帖子时,它会正确显示——即使没有明确配置任何
{reply_key}(参见上面的屏幕截图),回复似乎也能完美运行。
- 但是,当电子邮件被退回时,Discourse 会将其归类为“已接收”,而不是“已退回”。
- 错误日志显示 Discourse 中的某些内容识别出这是一封已退回的电子邮件(请参阅我的第一个帖子错误日志)。那么,如果 Discourse 中的某些内容识别出这是一封已退回的电子邮件,为什么它没有显示在“已退回”下,而是显示在“已接收”下?
那么,为什么当用户回复帖子时,Discourse 会正确处理,但已退回的电子邮件却不会(并且错误日志和已退回电子邮件的仪表板之间似乎也存在脱节)。我是否遗漏了配置中的某些内容?
RBoy
(RBoy)
11
我也尝试在 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 个赞
RBoy
(RBoy)
13
是的,它已配置,并且通过 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 地址。
几乎唯一保证在退回邮件中完好无损的是地址。
也许是主题,但将此信息放在主题中并不实用。
我确实看到有些系统将原始邮件作为附件包含在内……理论上,我们可以检查退回邮件是否有附件以获取更多信息(如果存在)。
RBoy
(RBoy)
15
如果我理解正确的话,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 个赞
RBoy
(RBoy)
17
谢谢。这非常有帮助。
所以基本上 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 个赞
RBoy
(RBoy)
19
是的,没错。想法是让 envelope-from 和 reply-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 失败。