我们在一些使用 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 中的电子邮件
- 使用 From 标头中的名称,去除
- 如果 X-MailFrom 存在
此外,在完成所有这些工作后,是否有可能通过一个 rake 任务来使用这个新逻辑重新处理现有的帖子(可能只处理与错误用户匹配的帖子)?

