2008/02/18

Gmail でメーリングリストのメールが弾かれる件を自己環境だけでもとりあえず対処してみた

自分の環境を全てGmail 化したら、仕事の進め方そのものが少し変わってきました。
以前の自分のメールの扱い方から比べると、Gmail 化したことで改善された部分が大きいので、もはやGmail から戻れないという段階です。
そんな便利なGmail ですが、気になっている難点がありました。

Gmail ではMessage-ID をユニークなメッセージのID として使用するようなのですが、その挙動が厳密すぎるために既存のメーリングリストシステムとは相性が良く無いみたいです。

つまり、Gmail からML へメールを送ると、そのメールは送信時点で、あるMessage-ID を持ったメールとしてアーカイブされてしまうため、MLシステムを通った際にsubject を[info:00123] のように書き換えるような運用をしている場合、そのメールが自分には配送されない、ということになる(みたいな)のです。

Subject を書き換える処理をしていなくても実は同じことが起きているのですが、書き換える処理をしている場合、その書き換えられた方のメールが自分宛に届かない、ということです。見た目の問題としてですが。

ちなみにMessage-ID をユニークなメールのキーとして使うのは、ある意味では当然ですが、例えばBecky なんかでは重複したMessage-ID のメールを取り扱えます。

欧米ではあまりMLのサブジェクトの書き換えはしない、と聞いたことがあるのでそのせいなのかもしれませんが、この問題は認知されているようなのにGmail 側では対処される気配がない(というかやる気が無い?あるいは、やらない、というポリシーの問題の気もしますが・・。)模様で困っていました。

ヒューマンフレンドリーな[info:00123] のような仕組みは、ユーザーにとってもわかりやすい仕組みなので、なんとか直したい、この問題を解決しないことには事務所をGoogle Apps に移行できない、と密かに嘆いていたのですが、ふいに気が向いてMLのシステム側で対処することにしました。

ML にはMailman を使っていたので、Subject 書換の際に、Message-ID を書き換えてしまう、という安直な方法ですが・・。

以下が、書き換えたdiff です。

====================
$ diff -u mailman-2.1.9/Mailman/Handlers/CookHeaders.py.org mailman-2.1.9/Mailman/Handlers/CookHeaders.py
--- mailman-2.1.9/Mailman/Handlers/CookHeaders.py.org 2006-02-17 11:42:35.000000000 +0900
+++ mailman-2.1.9/Mailman/Handlers/CookHeaders.py 2008-02-18 02:11:43.000000000 +0900
@@ -237,6 +237,10 @@
prefix = mlist.subject_prefix.strip()
if not prefix:
return
+ # overwrite message-id.
+ msg['X-Original-Message-ID'] = msg.get('message-id', '')
+ del msg['message-id']
+ msg['Message-ID'] = Utils.unique_message_id(mlist)
subject = msg.get('subject', '')
# Try to figure out what the continuation_ws is for the header
if isinstance(subject, Header):
====================

ほんの3 行書き換えただけですが、きちんと動いています。
Mailman がdaemon として動作しているということをうっかり忘れていて、リスタートするのを忘れていて、書き換えたのにうまく動かない、なんてことをしてしまい、きちんと動くまでに時間を浪費してしまいましたが・・。

ただ気になるのはこの処理をしたことでループ検知などに悪影響が出ないかということです・・。

ちょっとずれる感じもしますが、
http://mail.python.org/pipermail/mailman-developers/2003-October/015981.html
でもMessage-ID の書き換えについて議論しているようで気になったのですが、結局実装されずじまい、みたいなことでしょうか。
そもそもSubject を書き換えてるのだからMessage-ID を書き換えないのがおかしい挙動なんだ、という気もしないではないので、この修正のほうがむしろ正しい挙動に近づくのでは?、なんてことまで考えたりもしましたが、RFC の厳密な解釈など詳しく無いので判断がつきません・・。
目の前のシステムがうまく動けば個人的には問題が無いのですが、もしも分かる方がいらっしゃったら教えていただきたいところです・・。

2 件のコメント:

匿名 さんのコメント...

本日会社のメールシステムをgoogle appsに変更した結果、MLがまさに送信者に配信sれない現象となりました。

こちらのページを見て、mailmanに変更を加えて無事に動作しました。
助かりました。ありがとうございます。

kt さんのコメント...

redhat とかcentos などのパッケージを使っているとアップデートのたびに手動でこれを作業する必要が出て来るのでご注意ください。
出来ればmailman 本体がオプション設定でこういう機能を提供してくれれば良いのですが・・。
結局、自分の場合はgmail 移行後に、だいぶ経ってからですが、ML 自体の必然性をだんだん感じなくなり、ML の運用そのものをやめてしまいました。