改进 Mailman 邮件解析

我们在一些使用 Discourse 来镜像公共邮件列表的论坛上注意到,一些帖子被错误地归属给用户:


来自:[ruby-talk:444110] exif - photo metadata - ruby-talk - Ruby Mailing List Mirror

在这种情况下,Discourse 首先创建了一个名为“Austin Ziegler via ruby-talk”的用户,其电子邮件地址与列表提交地址匹配,而这正是显示在每个类似帖子上的信息。


来自:https://community.nanog.org/t/txt-att-net-outage/56955/4

在这种情况下,Discourse 首先创建了一个名为“Mailman”的用户,其电子邮件地址与列表提交地址匹配。

经调查,我们的邮件解析有时不正确。原因是,为了符合 DMARC 标准,Mailman有时会将其自身添加到 From 标头,并将原始发件人放入 reply-to:

To: Ryan Davis via ruby-talk
X-MailFrom: tom@tomsdomain.com
X-Mailman-Version: 3.3.3
Reply-To: Ruby users <ruby-talk@ml.ruby-lang.org>
From: Tom Reilly via ruby-talk <ruby-talk@ml.ruby-lang.org>
Cc: Tom Reilly <tom@tomsdomain.com>
To: Jared Mauch <jared@jaredsdomain.com>
X-BeenThere: nanog@nanog.org
X-Mailman-Version: 2.1.39
From: Owen DeLong via NANOG <nanog@nanog.org>
Reply-To: Owen DeLong <owen@owensdomain.com>
Cc: nanog <nanog@nanog.org>

但当不需要更改时,它会保持不变:

To: Jon Lewis <jlewis@jonsdomain.org>
X-BeenThere: nanog@nanog.org
X-Mailman-Version: 2.1.39
From: William Herrin <bill@billsdomain.us>
Cc: nanog@nanog.org

看来这里有很多不同的行为选项,因此我们希望提出一个算法来正确解析 Mailman 在所有情况下发出的内容。

可能还有其他选项,例如 Mailman 可以将未更改的消息直接发布到 Discourse 实例,但这些设置更复杂,并且可能并非对所有人可用。

这是其中一个算法的开头:

  • 如果 mailman-version < 3
    • 如果以下任一条件成立:
      • From 地址匹配 List-Id
      • From 地址匹配 List-Post
      • From 地址匹配 X-BeenThere
    • 则使用 Reply-To 作为 From
  • 如果 mailman-version >= 3
    • 如果 X-MailFrom 存在
      • 使用 From 标头中的名称,去除 /via .*/
      • 使用 X-MailFrom 中的电子邮件

此外,在完成所有这些工作后,是否有可能通过一个 rake 任务来使用这个新逻辑重新处理现有的帖子(可能只处理与错误用户匹配的帖子)?

4 个赞

要点是,我提出了一种适用于所有(我所见过的)版本的算法。

  1. List-PostX-BeenThere 标头中获取邮件列表电子邮件地址
  2. 发件人的邮件将在以下任何标头中:FromReply-ToX-MailFromX-Original-From。因此,遍历这些标头,并返回第一个与邮件列表电子邮件地址不匹配的。
3 个赞

这似乎效果很好! :+1:
我使用了 rake emails:fix_mailman_users 来修复 https://rubytalk.org/ 上所有被错误归属给错误用户的帖子。

2 个赞

该主题在上次回复后 2 天自动关闭。不再允许新回复。