Mailman 이메일 파싱 개선

Discourse를 사용하여 공개 메일링 리스트를 미러링하는 몇몇 포럼에서 일부 게시글이 잘못된 사용자에게 귀속되는 문제를 발견했습니다:


출처: [ruby-talk:444110] exif - photo metadata - ruby-talk - Ruby Mailing List Mirror

이 경우, Discourse는 리스트 제출 주소와 일치하는 이메일 주소와 "Austin Ziegler via ruby-talk"라는 이름으로 사용자를 임시 생성(staged)했으며, 이러한 유형의 모든 게시글에 해당 정보가 표시됩니다.


출처: 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일 자동으로 닫혔습니다. 더 이상 새 답변을 작성할 수 없습니다.