markcoley
(Mark Coley)
2022 年5 月 12 日 09:46
1
我发现了一个关于邮件列表帖子在 Discourse 上镜像时回复的有趣且晦涩的错误。
我有证据表明,如果初始电子邮件同时发送给两个邮件列表,则对一个邮件列表的回复可能会错误地归档到第二个邮件列表(具有不同的读者群)。
假设我订阅了两个邮件列表 A 和 B,我的 Gmail 地址都订阅了。它们可能有不同的读者群。列表服务器将消息的单个副本发送给这两个邮件列表上的所有人,但 To: 行显示消息已发送到列表 A 和 B,在同一封电子邮件中。这封电子邮件到达我的 Gmail 地址,然后通过过滤器将副本转发到 listA@mydiscourse.org.uk ,Gmail 会选择 To: 行中的两个列表之一。Gmail 设置为将发往 A 的帖子转发到 listA@mydiscourse.org.uk ,将发往 B 的帖子转发到 listB@mydiscourse.org.uk 。Discourse 设置了两个类别,具有这两个不同的传入镜像电子邮件地址(listA@mydiscourse.org.uk 和 listB@mydiscourse.org.uk )。
列表服务器和 Gmail 只发送一个副本的问题是分开的,不是这个错误的重点。
在此之后,发送到我的 Gmail 帐户的电子邮件副本在 Gmail 将其转发到 listA@mydiscourse.org.uk 后,会显示在与 listA@mydiscourse.org.uk 传入地址关联的类别中。
到目前为止一切顺利(除了列表服务器只发送了一封电子邮件)。
现在,一个单独的用户,他只在 B 邮件列表中,回复了该电子邮件给列表服务器。列表服务器将该消息发送给 B 邮件列表上的所有人。这封邮件到达我的 Gmail 地址,To: 行表明它是发往 B 列表的。Gmail 将其转发到 listB@mydiscourse.org.uk 。
但是 Discourse 却将其归档,就好像它是通过 listA@mydiscourse.org.uk 发送的一样!
因此,这向有权访问列表 A 的人揭示了列表 B 成员帖子的内容!
我怀疑 Discourse 忽略了电子邮件进入 Discourse 的路由,而是根据标题中的消息 ID 标志进行归档,从而绕过了传入路由。
发送到 A 和 B 的原始电子邮件,其中包含单个消息 ID,我怀疑仅基于该消息 ID 进行归档。
如果原始发件人向列表 A 和列表 B 分别撰写了两封单独的电子邮件,则不会出现此问题,因为这两封消息将拥有自己的消息 ID。
建议修复:如果一个类别正在镜像一个邮件列表,并且一条消息通过镜像地址传入,而该消息从标题来看是对 Discourse 中其他地方存在的另一篇帖子的回复,那么需要在预期的类别中创建一个新帖子(可能没有明显的父级),而不是让回复出现在与不同邮件列表关联的类别中。
RGJ
(Richard - Communiteq)
2022 年5 月 12 日 13:30
2
确实,或者:
我认为这 是 这个错误的议题。这应该在列表服务器中修复,而不是在 Discourse 中。
1 个赞
markcoley
(Mark Coley)
2022 年5 月 12 日 15:11
3
我不确定我是否把话说清楚了,因为我不明白为什么 Discourse 会把帖子放到错误的类别中。这似乎是因为它没有查看路由(应该具有优先权),而只查看 message-id。对于同时发送到两个邮件列表的单个电子邮件,将有一个 message-id,但有两个分发列表(它们是独立的),两个“To:”地址和两个“Reply-To:”地址(根据发送到哪个列表,在每条消息上显示不同的地址)。
如果这是正在发生的事情,那么当有人将一个主题从邮件列表镜像类别移到 Discourse 的其他位置,但之后通过邮件列表收到的回复仍然进来时,会发生什么?Discourse 会将这些回复添加到与邮件列表关联的类别中(即使原始帖子可能已被移走),还是所有回复都会神奇地进入主题被移到的类别?
Discourse 能否处理两个具有相同 message-id(但“To:”地址不同)的消息同时出现在两个类别中的情况?
RGJ
(Richard - Communiteq)
2022 年5 月 12 日 16:00
4
无论 Discourse 如何处理,Message-ID 都应该是唯一的。在我看来,当邮件列表服务器将消息发送到邮件列表时,它会创建一个该消息的新实例,因此它应该重写消息 ID。
此外,我不明白为什么原始消息同时适用于列表 A 和列表 B 的成员,而列表 B 成员的回复却不能向列表 A 的成员显示。如果这两个受众差异如此之大,为什么用户同时将相同的消息发送给这两个列表?
也许有一个很好的技术解决方案可以解决这个问题,也许 Discourse 可以进行更改以正确处理此问题,但我认为这是 36 年历史技术中一个非常奇怪的边缘情况。
markcoley
(Mark Coley)
2022 年5 月 12 日 16:35
5
您可以争辩说,因为消息相同,所以它只有一个消息 ID。事实上,对于所讨论的示例,原始发帖人是在 Gmail 中撰写消息(由 Gmail 分配了消息 ID),然后将其发送到同一服务器上的两个列表服务器地址。这并不罕见,例如,这可能是一份新闻稿,对经理和临床医生都适用,他们各自都在自己的邮件列表中。新闻稿中可能存在需要讨论的医疗问题,因此临床医生可能会回复(并且“回复到”地址会被设置为临床医生列表,即使“收件人”标头仍然包含两个邮件列表)。同样,经理们也可能想讨论他们自己对新闻的看法。他们会回复,并且相关的“回复到”标头会用于反映经理列表。如果某位发帖人通过“全部回复”利用了“收件人”地址,那么他们未加入的列表就会生成退信消息。
上述行为并不算特别少见,但似乎 Discourse 在用作邮件列表镜像时无法正确处理它,并且无法将分叉的回复分开,因为它们都会被关联到原始消息 ID 以及该帖子首次出现的类别。
这可能意味着,例如,经理可以看到临床医生的帖子,如果临床医生回复临床医生列表,由于 Discourse 归档消息的方式,该帖子会出现在经理列表的镜像中。
一种解决方案可以是检查传入消息的“收件人”标头中的每个地址,看它是否与“类别设置”中的邮件列表镜像地址匹配。如果匹配,则可以在每个匹配的类别中发布该消息的副本,并且可能在不同类别中有多个帖子副本。然后,如果收到任何回复,就可以像目前一样使用消息 ID,但前提是“收件人”行也与类别匹配。
markcoley
(Mark Coley)
2022 年5 月 22 日 11:16
6
一种解决方案是重写 message-id,使其反映发帖人邮件客户端创建的原始 ID,再加上一个额外的标识符,例如 Discourse 已经查找的邮件列表的 To: 地址?这意味着,如果一篇文章来自邮件列表 B,但它引用了也来自邮件列表 A 的文章中的 message-id 标头,它会被 Discourse 正确归档吗?
例如。原始电子邮件同时发送到两个邮件列表 A 和 B,具有唯一的 message-id“1234567890gmail”。
Discourse 收到两个副本,转发到通用的传入 Discourse 地址。第一条消息根据 To: 地址归档到列表 A,message-id 会被 Discourse 追加额外的字符,变成“1234567890gmailListA”。第二条消息由于看起来是重复的,因此未归档。(我认为这是当前行为)。
列表 B 上的某人使用列表 B 的 To: 地址进行回复。Discourse 收到副本,并注意到有一个“in reply to”标头包含“1234567890gmail”。Discourse 看到电子邮件是通过反映列表 B 的 To: 行传入的,会在末尾追加字符,使“in reply to”标头看起来像“1234567890gmailListB”。然后,它会将此作为新消息在新类别中归档,因为它不再与归档到列表 A 的消息相关联。
这种方法也可能适用于转移存档,因为如果用户同时将消息发送到多个列表,则在多个邮件列表中可能会找到相同的 message-id。在导入时,所有 message-id 字段(以及 in reply to)都可以追加唯一的文本,链接到命名的邮件列表,以防止在索引消息时存档之间发生某种交叉通信。