Discourse 邮件消息的线程不正确

这为我们可能做的各种事情打开了大门,例如拒绝邮件、回复旧版本消息。但这都是想象,有些事情听起来可能不错,但未必如此 :smiley:

3 个赞

我还没看到有人提到这一点,所以请确保你处理好:

  • 如果电子邮件包含“之前的回复”部分,(执行一些操作使其特定于收件人)

我不确定您所说的“之前的回复”是什么意思,以及我需要如何使其更具收件人特异性?这与我们在此处详细介绍的保持一致的 Message-ID 的更广泛策略如何契合?

如果有人收到“先前回复”部分,您就需要完全放弃一致的消息 ID:您将多个帖子合并到一封电子邮件中!没有一个正确单一的消息 ID 能够跨越多个观点一致地识别所有内容。

编辑:实际上,我想您只需将它们连接起来即可?
topic/1234/post/12345.also-12340-12339

此外,这使得前面提到的垃圾邮件触发器更加严重:您不仅在同一消息 ID 下切换退订链接,而且在具有相同消息 ID 的不同版本中包含了实际的单词,并排除了其他单词。

由 Kane York 通过 Discourse Meta 于 2022 年 8 月 2 日 04:26 发布:

如果有人收到“之前的回复”部分,您就需要完全放弃一致的消息 ID:您将多个帖子合并到一个电子邮件中!

您能详细说明一下吗?在这种情况下,电子邮件看起来是怎样的?有例子吗?

没有一个正确的消息 ID 能够跨多个视图一致地标识所有内容。

对于大多数目的来说,选择其中一个,例如第一个,就足够了。如果这个例子仍然是一个回复。

编辑:实际上,我想您只需将它们连接起来即可?
topic/1234/post/12345.also-12340-12339

我开始认为您将对 Discourse 论坛源帖子的某种引用与消息 ID 混淆了。消息 ID 用于标识电子邮件。对于回复帖子,In-Reply-ToReferences 中的消息 ID 应该与相关前序电子邮件消息的 message-id 匹配。当有人发帖到一个主题时,通过电子邮件发送给请求电子邮件副本的每个人,该帖子的所有副本都应具有相同的消息 ID。

此外,这使得前面提到的垃圾邮件触发器更加严重:您不仅在同一个消息 ID 下更改退订链接,而且在具有相同消息 ID 的不同版本中还包含和排除了实际的单词。

如果这些是帖子底部的“管理页脚”,那也没什么问题。

我不太确定我们是否在谈论同一件事。

另外:您在这里讨论的是什么具体的垃圾邮件触发器?因为在现实世界中,经常会发送“略有不同”的电子邮件。

祝好,
Cameron Simpson cs@cskk.id.au

1 个赞

Kane 正在谈论这个选项:

用户可以选择在邮件末尾附加大量详细信息的先前回复。

我乐意暂时将此视为背景噪音,并像处理唯一的取消订阅链接一样处理它。

既然我们已经达成了共识,我当然不希望在此过程中再阻止任何进展。

(至于它看起来如何,我认为它看起来相当混乱,但有些用户喜欢它)

1 个赞

Sam Saffron 于 2022 年 8 月 2 日 05:29 通过 Discourse Meta 发布:

[quote=“Cameron Simpson, post:51, topic:233499,
username:cameron-simpson”]
你能详细说明一下吗?在这种情况下,电子邮件看起来是怎样的?有例子吗?
[/quote]

Kane 正在谈论这个选项:

用户可以选择在邮件末尾附加大量详细信息以获取之前的回复。

啊,谢谢。

我很乐意暂时将其视为背景辐射,并像处理唯一的退订链接一样处理它。

我的想法也是如此。在我看来,这符合 RFC 中“帖子/作者的原始意图”目标。附带的附加信息,但不是不同的核心信息。

此致,
Cameron Simpson cs@cskk.id.au

2 个赞

同意,我们按计划进行。我昨天开始研究这些变化,首先从我们的电子邮件接收器开始。

@cameron-simpson 仅供参考,我正在将此与我目前承担的其他职责结合起来。我下周将休假,然后在九月的头两周再次休假,所以可能需要一些时间才能看到真正的进展。请放心,我一直关注着这件事,我会确保在这里定期发布更新,非常感谢您到目前为止的参与和贡献!

1 个赞

By Martin Brennan via Discourse Meta at 02Aug2022 07:06:

@cameron-simpson 仅供参考,我正在将此与其他我目前承担的职责结合起来。我下周将休假,然后在九月的头两周再次休假,所以可能需要一些时间才能看到真正的进展。请放心,我一直关注着这件事,我会确保在这里定期发布更新,非常感谢您到目前为止的参与和贡献!

谢谢,
Cameron Simpson cs@cskk.id.au

@cameron-simpson 我在旅行回来后重新开始处理这件事,我想就不同的 ReferencesIn-Reply-To 场景获得一些进一步的澄清。

场景 1: 在 Discourse 中创建帖子,但不是直接回复另一个帖子,我们是否只使用主题 OP 的 Message-ID,并将其存储在新列 outbound_message_id 中,用于 ReferencesIn-Reply-To

场景 2: 当一个帖子一次回复多个其他帖子时(这可以通过引用发生),我们使用哪个帖子作为 In-Reply-To?我们是都用于 References,还是只用于选择的 In-Reply-To 的那个?我们是否在 References 中包含 OP 帖子的 Message-ID

场景 3: 与上面类似,但我们只考虑我们正在回复的单个帖子。如果我们回复帖子 B,而帖子 B 本身又是对帖子 A 的回复,那么 In-Reply-To 是否只指向帖子 B,然后 References 是否按 帖子 A, 帖子 B 的顺序排列(当然,始终通过帖子上 outbound_message_id 引用 Message-ID)?我们是继续沿着回复链向上查找,还是只在 References 中停止于第一个父帖子?

这主要取决于我们如何解释 RFC 中的这段引述,并且主要影响 References——它们是否仅限于直接回复(通过引用或其他方式),还是也始终包含 OP?

注意:一些实现会解析“References:”字段来显示“讨论线索”。这些实现假定每个新消息都是对单个父项的回复,因此它们可以通过“References:”字段向后查找以找到那里列出的每个消息的父项。因此,不鼓励尝试为具有多个父项的回复构建“References:”字段;本文档未定义如何执行此操作。

谢谢 Cameron,我将暂时按照我 认为 正确的方式进行,并根据您的回复进行调整。

马丁·布伦南 (Martin Brennan) 于 2022 年 8 月 19 日 03:48 通过 Discourse Meta 发布:

@cameron-simpson 我从旅行回来后,又开始处理这件事了,我想就不同的 ReferencesIn-Reply-To 场景获得一些进一步的澄清。

场景 1: 在 Discourse 中创建帖子,但不是直接回复另一个帖子,我们是否只使用主题 OP 的 Message-ID,并将其存储在新列 outbound_message_id 中,用于 ReferencesIn-Reply-To

我可能在术语上有些问题。对于新主题的 OP,我期望没有 ReferencesIn-Reply-To,因为它是 OP。

对于现有主题中的帖子,但不是引用特定先前帖子(我认为这正是你所描述的),ReferencesIn-Reply-To 中仅包含 OP 的 Message-ID,正如你所描述的那样。

场景 2: 当一个帖子同时回复多个其他帖子时(这可以通过引用发生),我们使用哪个帖子作为 In-Reply-To

[再次阅读 RFC 5322…]

  • In-Reply-To 应包含它所回复的每个帖子的 Message-ID
  • References 应为父帖子的 References,并附加父帖子的 Message-ID

所以 In-Reply-To 只回溯到线程中的一个消息。多个父帖子意味着多个 message-id,但它们应该是直接父帖子的 message-id。

References 用于追溯从 OP 到此帖子父帖子的整个回复链。因此,它被计算为到父帖子的线程,加上父帖子的 message-id。

(*) 当有多个父帖子时:RFC 说,因为客户端(电子邮件阅读器)通常期望 References 追溯从 OP 到帖子的单个回复线程,所以 RFC 明确不鼓励合并所有父帖子的 References。相反,你应该只选择一个。我个人倾向于选择第一个被引用的父帖子,但这显然是一个策略决定:选择你认为最有用的。

场景 3: 与上述类似,但我们只回复一个帖子。如果我们回复帖子 B,而帖子 B 又回复帖子 A,那么 In-Reply-To 是否只指向帖子 B,然后 References 是否按 帖子 A, 帖子 B 的顺序排列(当然,总是通过帖子上 outbound_message_id 引用 Message-ID)?我们是继续向上追溯回复链,还是只在 References 中停止于第一个父帖子?

In-Reply-To 只回溯一层。所以在这种情况下,它只包含父帖子的 Message-ID

References 是从 OP 到此消息的链条。

这主要取决于我们如何解释 RFC 中的这段引用,并且主要影响 References——它们是否只局限于通过引用或其他方式进行的直接回复,或者它们是否也始终包含 OP。

它们应该始终从 OP 开始。如果所有前面的帖子都这样做了,你只需将父帖子的 message-id 添加到父帖子的 References 中,就可以免费获得整个链条。

如果你正在处理一个“旧”消息,你可以追溯回树的顶部。或者你可以决定每次都这样做。或者你可以说,从现在开始,我们只需要从父帖子获取 References(如果它存在)。我认为这取决于你决定在数据库中存储什么。

我认为,只要你的目标是让 In-Reply-To 指向直接父级,而 References 指向 OP,你就应该没问题了。

祝好,
卡梅伦·辛普森 (Cameron Simpson) cs@cskk.id.au

2 个赞

是的,这正是我所描述的,感谢您的说明。

谢谢,所以基本上答案就是——选择一个被引用的帖子作为父帖子(无论是第一个引用的还是最近创建的帖子,只要选定一个即可),将其用于 In-Reply-To,并将其及其所有父帖子一直追溯到 OP 用于 References

明白了,有道理。

我认为这澄清了一切,您的回答正是我所期望的,我想在开始手动测试之前进行确认。感谢您快速回复 :+1:

1 个赞

@cameron-simpson 我认为我已经按照描述完成了这项工作,我设置了 mutt,并且事情似乎在正确地进行线程化(尽管我不确定为什么主题行在线程中被省略了,也不知道如何将其设置为在线程中内联查看我自己的已发送回复):

这是 Thunderbird 表示相同线程的方式(实际上我意识到 Thunderbird 也不会内联显示我的回复):

以下是 Gmail 中的样子:

标头如下,帖子 ID 从 91 开始,所以帖子 1 == 帖子 ID 91。

帖子/电子邮件 1

(由于这是第一封电子邮件,因此没有“References”或“In-Reply-To”)

From: Martin Brennan via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+3706c086cd36c6e37550c24f4e25c9b8@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/91@discoursehosted.martin-brennan.com>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for

帖子/电子邮件 2

From: Bizarro Martin via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+9ea955b74a04dc85f5504ad245636824@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/92@discoursehosted.martin-brennan.com>
In-Reply-To: <discourse/post/91@discoursehosted.martin-brennan.com>
References: <discourse/post/91@discoursehosted.martin-brennan.com>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for

帖子/电子邮件 3

From: Martin Brennan via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+410877b7f868b59945f3e3ea16570fc4@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/93@discoursehosted.martin-brennan.com>
In-Reply-To: <discourse/post/91@discoursehosted.martin-brennan.com>
References: <discourse/post/91@discoursehosted.martin-brennan.com>

帖子/电子邮件 4

回复帖子 2 和帖子 3,但我们使用帖子 3 作为引用的父级,因为我们只需要选择一个。

Date: Mon, 22 Aug 2022 04:05:45 +0000
From: Bizarro Martin via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+0a63eba3765f58e709a2ca538ca2b926@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/94@discoursehosted.martin-brennan.com>
In-Reply-To: <discourse/post/93@discoursehosted.martin-brennan.com>
References: <discourse/post/91@discoursehosted.martin-brennan.com>
 <discourse/post/93@discoursehosted.martin-brennan.com>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for

帖子/电子邮件 5

这直接回复了帖子 4,而帖子 4 又直接回复了帖子 3。

Date: Mon, 22 Aug 2022 05:05:06 +0000
From: Martin Brennan via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+d66f675a0ce64fcaa2ba6b91e3112b05@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/95@discoursehosted.martin-brennan.com>
In-Reply-To: <discourse/post/94@discoursehosted.martin-brennan.com>
References: <discourse/post/91@discoursehosted.martin-brennan.com>
 <discourse/post/93@discoursehosted.martin-brennan.com>
 <discourse/post/94@discoursehosted.martin-brennan.com>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for

帖子/电子邮件 6

回复我通过电子邮件发送的回复,请注意我保留了 Thunderbird 生成的(奇怪的)Message-ID 12d1ec8f-859c-2339-2c7d-9cb3310756a2@discourse.org

Date: Mon, 22 Aug 2022 05:16:31 +0000
From: Martin Brennan via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+fb424977c7bd0c8146bdd7302dc35933@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/97@discoursehosted.martin-brennan.com>
In-Reply-To: <12d1ec8f-859c-2339-2c7d-9cb3310756a2@discourse.org>
References: <discourse/post/91@discoursehosted.martin-brennan.com>
 <discourse/post/93@discoursehosted.martin-brennan.com>
 <discourse/post/94@discoursehosted.martin-brennan.com>
 <discourse/post/95@discoursehosted.martin-brennan.com>
 <12d1ec8f-859c-2339-2c7d-9cb3310756a2@discourse.org>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for
 2022-08-22

我现在可以给你发一封私人消息,以便在我的测试站点上为你设置一个帐户,然后我们可以进行一些电子邮件/回复的往返,看看这是否符合你的预期?

6 个赞

Martin Brennan 于 2022 年 8 月 22 日 05:36 通过 Discourse Meta 发布:

@cameron-simpson 我认为我已经按照描述设置好了,我设置了
mutt,并且似乎可以正确地进行线程处理(尽管我不确定为什么主题行在线程中被省略了,也不知道如何设置才能在线程中内联显示我自己的已发送回复):

在我看来,这看起来不错。

回复(除非主题发生变化)会被省略,这样更容易看到下一个线程的开始。如果你愿意,也可以折叠线程。

要看到你自己的回复,需要在该文件夹中保留一份回复的副本。$record 设置控制着这一点。
The Mutt E-Mail Client

而这正是我在 Thunderbird 中看到的相同线程(实际上我意识到 Thunderbird 也不会内联显示我的回复):

在我看来,这也很不错。

这就是 Gmail 中的样子:

这个……相当不紧凑 :slight_smile:

标头在下方,帖子 ID 从 91 开始,所以帖子 1 == 帖子 ID 91。
[…]

根据你对消息关系的描述,这些标头似乎都是正确的。

我注意到 Discourse 使用 Reply-To 带有独特的 ID,
可能是为了根据目标电子邮件地址将电子邮件回复缝合在一起。这显然是有效的。如果 Discourse 是从回复的 In-Reply-To 标头派生出来的,你就可以使用更稳定的地址了 :slight_smile:

我现在可以给你发一封私人消息,以便在我的
测试站点上为你设置一个帐户,然后我们可以进行一些电子邮件/回复的往来,看看这是否符合你的预期?

当然!

祝好,
Cameron Simpson cs@cskk.id.au

2 个赞

这实际上用于确定我们是发送到类别还是主题,并且不像 Message-IDs 等用于 In-Reply-To 和 References 那样被大量使用。

谢谢,我将从我的网站发送私人消息和电子邮件邀请。

我们已经来回沟通了不少,现在似乎一切都按预期运行了,这是 Thunderbird 中线程的一个示例:

@cameron-simpson 您是否同意我现在将其合并到 Discourse 核心?再次感谢您的测试。

1 个赞

我想更仔细地回顾一下“参考文献”——我以为我在一条消息中看到了一些奇怪的地方,我通过电子邮件进行了多次回复,但似乎没有被识别出来?我今晚会试着看看。

1 个赞

是的,我现在看到了你最新的帖子。你在 Discourse 中回复 2 个帖子时期望得到什么?我不确定我们是否支持解析引文并将其作为来自传入电子邮件的回复归因于多个帖子。感谢你进一步查看 References。如果你有自己的 Discourse 实例并想测试它,或者只是对逻辑感到好奇,代码就在 feature/the-phantom-email-thread 这个分支中,请参阅 https://github.com/discourse/discourse/pull/17996。它仍然需要一些清理工作。

编辑:找到了回复问题,正在测试论坛上回复。

1 个赞

By Martin Brennan via Discourse Meta at 23Aug2022 06:16:

Ah yes I see that latest post you made now. What are you expecting
within Discourse when you do a reply to 2 posts? I am not sure we
support parsing out quotes and attributing them to multiple posts as
replies from incoming emails.

我没预料到会这样。我希望 Discourse 能查看 In-Reply-To 邮件 ID,将它们与匹配的帖子关联起来,并从中推导出“多重回复”。

话虽如此,我甚至不知道如何在网页上进行多重回复(至少在邮件中,使用 mutt 很容易)。我也不知道你们是如何在数据库中表示父帖子的。你们肯定不是解析邮件正文本身吧?

Thanks for taking a further look at References too. If you had your

own Discourse instance and wanted to test this or were just curious of
the logic the code is in this branch
feature/the-phantom-email-thread, see
https://github.com/discourse/discourse/pull/17996 . It still needs a
little clean up too.

谢谢,我会看看的。我需要坐下来画一张我们测试讨论的图,并对照它检查各种头部信息;我今天太分心了。

Cheers,
Cameron Simpson cs@cskk.id.au

我在这里添加了一些注释,但我的大脑快要宕机了。特别是 add_identification_field_headers 上的注释可能有些误导——这是当这个新的实验模式未启用时的备用/原始代码吗?add_experimental_identification_field_headers 上的注释更有意义。

1 个赞