抱歉,下面的一些语气可能有些过激。我之所以显得有点恼火,是因为我确实有点恼火。
Michael Brown 通过 Discourse Meta 于 2022 年 7 月 27 日 14:06 发表:
抱歉,我现在才看到,这里有一些想法,其中一些已经解决……
这里的问题是,Discourse 发送出去的 是 一条与传入消息不同的消息。它具有不同的元数据(为此目的,收件人/发件人/回复地址/取消订阅/等)和不同的正文(我猜是为每个用户自定义的?邮件列表模式下不这样吗?)。
到底什么是消息?根据 5322:
消息由头部字段组成,可选地后跟消息正文。
“Message-ID:”字段提供了一个唯一的邮件标识符,该标识符引用特定邮件的特定版本。
[我的重点]“特定版本”让我觉得重新发送具有不同 Message-ID 的传入消息是不合适的。不过,如果你将视角从 Discourse 的“论坛软件”转变为 Discourse 的“邮件列表软件”,那么这样做似乎有点道理,所以我明白你的意思。
嗯,不幸的是,这取决于对字面意思的过度解读,也许是解读了不存在的上下文。
_每_封电子邮件在被邮件系统传递时,其头部都会被修改。即使没有其他修改,Received: 头部在每一步都会被添加,并且多个系统会添加各种指示垃圾邮件过滤结果和签名的头部。这些都不会触发 message-id 的修改,实际上这样做会让 message-id 完全失效。
关于内容,如前所述,几乎所有的邮件列表都会在正文中添加内容,通常是一个带有列表管理页面链接或取消订阅链接的页脚。这些也_不会_触发 message-id 的更改。
事实上,几乎没有任何转发消息的操作会改变 message-id。因为这会破坏最终用户客户端的线程和重复检测。
我看到你继续引用了我正要引用的内容 ![]()
5322 还说:
在许多情况下,消息会被“修改”,但这些修改并不构成该消息的新实例,因此消息不会获得新的消息标识符。例如,当消息被引入传输系统时,它们通常会加上额外的头部字段,如跟踪字段(在 3.6.7 节中描述)和重发字段(在 3.6.6 节中描述)。添加这些头部字段不会改变消息的身份,因此保留了原始的“Message-ID:”字段。在所有情况下,决定“Message-ID:”字段是否更改的是消息发送者希望传达的含义(即,这是同一条消息还是不同的消息),而不是消息中出现的任何特定语法差异。
我猜这归结于,当 Discourse 发送出去时,消息的发送者是否改变了?
我认为你在这里误读了。让我强调一下:
在所有情况下,决定“Message-ID:”字段是否更改的是消息发送者希望传达的含义(即,这是同一条消息还是不同的消息)
_发送者_是作者,而不是像 Discourse 这样的 MTA。
如果我通过电子邮件发布到 Discourse,我希望我的消息以其原始状态(语义上讲)到达读者。任何像取消订阅链接这样的附加信息都不会改变我在消息中所说的内容的语义。
这仍然是_同一条消息_。
也许我们应该使用 Resent-Message-ID 和相关字段?
绝对不行。它们是供_用户_重新提交消息的。例如,如果我将一条消息转发给其他人。它们不是为邮件中继(如列表和 Discourse)设计的。
它一直都在,从 822 开始。但正如你后来所说,是的,它已经被更新了。
哎哟。我以为当时只有 USENET。我收回我的话。
5322 还直接谈到了 Discourse 和 Github 的使用方式:
“In-Reply-To:”字段可用于标识新消息所回复的消息,而“References:”字段可用于标识对话的“线程”。
可能有点不恰当,可能是由于缺少合适的“线程标识符”头部。但这可能不是 RFC 作者的意图……它没有处理带有“References”但没有“In-Reply-To”的消息。
对我来说,这两个字段涵盖了相同的信息:
References显示了线性(通常)的线程,一直追溯到原始发帖人。In-Reply-To显示了父级,并隐含了与前面消息一起追溯到原始发帖人的相同线程。
这其中的棘手之处在于,我们不是发送_一封_电子邮件,而是发送 N 封——每位收件人一封——这样他们的个人元数据(取消订阅等)就可以是正确的。
这并不棘手。消息的语义是相同的,定制是次要的且在语义上无关紧要。它们_不_需要新的或不同的 message-id。
而且是的,我在测试中确实看到了强烈的迹象表明垃圾邮件的判定将与 Message-ID 相关联。如果后来再次看到(同一用户或不同用户),它将更有可能被标记为垃圾邮件。
你能举出一些这样的例子吗?因为 message-id 允许在最终用户的端进行去重。并且请记住,许多“反垃圾邮件”措施是错误的垃圾。我曾有多少东西因为完全荒谬的原因被拒绝为潜在垃圾邮件……为了绕过错误的垃圾邮件错误过滤而破坏电子邮件是一个糟糕的选择。
至今我从不抄送有 GMail 地址的人,因为 GMail 的垃圾邮件过滤认识我并会丢弃邮件。如果我只发送给列表,他们就能收到。如果我抄送他们的 GMail 地址,它(a)会将其标记为垃圾邮件,然后(b)_也_会将邮件列表消息标记为垃圾邮件(相同的 message-id!)。最终用户看不到我的消息。这个逻辑完全是荒谬且无法修复的。
说实话,这里的好处完全是为了在某些邮件客户端中正确地对电子邮件进行线程化,而牺牲了可送达性。
叹气。对_所有_电子邮件客户端都是如此。而人们在 Pythonland 地区不愿意使用 Discourse 的一个主要原因是电子邮件方面的线程是坏的。_许多_人根本不使用论坛,因为每个论坛都要求他们_访问_它。电子邮件会发送给他们,他们可以使用_他们_喜欢的阅读器和_他们_喜欢的编辑器,线程化可以让人们清楚地看到讨论的流程。当它起作用的时候。
当前的
topic/#{topic_id}/#{post_id}.s#{sender_user_id}r#{receiver_user_id}至少让它对用户在他们的邮箱中保持一致。假设
我最大的担忧是可送达性——当主要提供商没有任何可见性时,电子邮件的送达已经足够困难了。
我想看看证据。世界各地的邮件列表都能正确地做到这一点。Discourse 绝对且客观地破坏了这一点。我正在努力解决这个问题。
让我重申这里的两个基本问题:
- 原始发帖人的
In-Reply-To和References引用了一个虚构的“前 OP” “topic” message-id,所以没有电子邮件用户拥有一个以(OP)为起点的线程——_所有_邮件,包括 OP,看起来都像是跟帖。 - 通过 Discourse 收到的电子邮件和直接收到的电子邮件(例如通过 CC)具有不同的 message-ids,尽管它们在语义上是同一条消息;这破坏了线程和去重。
但我确实看到了一个强有力的论据,即让 Discourse 在邮件列表模式下表现得更像邮件列表软件。@martin 我认为我们在邮件列表模式下不自定义邮件正文吗?你认为在邮件列表模式下采取更严格的方法来保留和重用 Message-IDs 是否有意义?
Pythonland 的一些人发现“邮件列表模式”过于信息量过大。他们希望收到针对特定主题的电子邮件,而不是所有邮件。message-id 的处理方式应该对_所有_电子邮件端都_相同。
我是 discuss.python.org 上的“邮件列表模式”用户。但我在这里(discourse.org)打开了它,然后_立即又关掉了它。我在这里需要针对性模式。