Улучшение парсинга электронной почты в 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-Post или X-BeenThere.
  2. Адрес отправителя письма может находиться в любом из следующих заголовков: From, Reply-To, X-MailFrom или X-Original-From. Переберите их и верните первый, который не совпадает с адресом электронной почты рассылки.
3 лайка

Это работает отлично! :+1:
Я использовал rake emails:fix_mailman_users, чтобы исправить все сообщения, которые были приписаны неверному пользователю на https://rubytalk.org/

2 лайка

Эта тема была автоматически закрыта через 2 дня после последнего ответа. Новые ответы больше не принимаются.