Мы заметили на нескольких форумах, использующих 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-задачу для повторной обработки существующих сообщений (вероятно, только тех, которые соответствуют ошибочно созданному пользователю) с использованием новой логики?

