MailmanとGmail

メーリングリストであるMailmanで自分自身がGmailのアカウントを使っているとき、メーリングリストにこのアドレスから送信するとGoogleは配信されたメールを破棄しちゃう。なんか有名な話らしい。Gmailから送信したことがなかったから知らなかった。
一昨日の日曜日に、あっちの大学のメールサービスがKDDだったのがGoogleに変更になったのだ。メールアドレスは以前のままなのだが、実際はGmailのアカウントなのだ。大学のアカウント(実際はGmailのアカウント)からMailmanを使ってメールを配信すると、他のメンバーに配信されるのは問題がない。当然ながら、自分自身もメーリングリストの1メンバーなので(メンバーでなければメーリングリストを使えないからな)自分自身に配信されるはずなのだが、上記のようにGmailは送信者がGmailのアカウントだと送信者に配信されるときに破棄しちゃうのだ。

推定される理由は、Gmailでメーリングリストに投稿したはずのメールが受け取れない?に書いてある。要するにメールを送信すると送信簿にのこるわけで、これと同じメールがメーリスからおくられてきても、すでに同じMessage IDのメールがあるから破棄されちゃうのだ。
mailmanの日本語情報

Gmail では、一度システムを通過した Message-ID を持つメールは2度目以 降破棄されてしまうため、Bcc で自分宛のコピーを確保しておかないとメッ セージのスレッド表示がおかしくなる。また Bcc していても Subject Prefix の結果を見ることができない。Mailman を通過する際に Message-ID を新規に振ることで Gmail で表示されるようにする。 mm_cfg.py において、USE_MAILMAN_MESSAGE_ID を Yes にしておくことで、 この機能を有効にすることができる。(デフォルトでは No)

つまりmailman が送付する Message ID を独自にすれば、送信簿にあるMessage ID と異るので、mailman からのメールを破棄せず受け取ることになるというえわけだ。
そこで /usr/local/mailman/Mailman にある mm_cfg.pyに、
USE_MAILMAN_MESSAGE_ID = Yes
を1行加筆した。だめだ。もちろんmailman は

/usr/local/mailmanで ./bin/mailmanctl restart として再起動したのだが。この説明は2.1.14+j7 なので使っているのが2.1.15 の日本語版でないバージョンだからのようだ。

送信簿に記録は残るのだが、配信されたのかいまいち確認できていないと不安だ。 SMTPサーバの問題でもないからsmtp.gmail.com でなく他のSMTPサーバを使ってもだめだ。しょうがない、とりあえず、管理しているメーリングリストに管理用のメールアドレスも加えておくことにするか。なんかなさけないけど、すぐにできるのはこんなことしかない。
[ 追記 ] 2016.6.29
在米ポスドクさんがコメントしてくれたように、/usr/local/mailman/Mailman/Handlers の CookHeaders.py を書き換えてみた。

上記の/usr/local/mailman/Mailmanのmm_cfg.pyに以下の1文を加筆したUSE_MAILMAN_MESSAGE_ID = Yes
はコメントアウトしてだ。

オリジナルの235行目以降は;

def prefix_subject(mlist, msg, msgdata):
    # Add the subject prefix unless the message is a digest or is being fast
    # tracked (e.g. internally crafted, delivered to a single user such as the
    # list admin).
    prefix = mlist.subject_prefix.strip()
    if not prefix:
        return
    subject = msg.get('subject', '')

となっている。241行目と 242行目の間に
# overwrite message-id.
msg[‘X-Original-Message-ID’] = msg.get(‘message-id’, ”)
del msg[‘message-id’]
msg[‘Message-ID’] = Utils.unique_message_id(mlist)
を挿入するのだ。すなわち

def prefix_subject(mlist, msg, msgdata):
    # Add the subject prefix unless the message is a digest or is being fast
    # tracked (e.g. internally crafted, delivered to a single user such as the
    # list admin).
    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', '')

だめだった。全て元に戻した。メーリスがうごかない。ここに挿入していいいのかも定かでないからな。
解決策がまだないので、ユーザレベルでの対応をお願いするしかない。
(1)配信されたと信じて何もしない。
(2)Bccで自分宛てに送信する。
(3)スマホのメアドも登録しておく。
Bccを設定してみると、送信済みにあるメールと、Bcc で配信されるメールと、メーリスで配信されるメールのMessage_IDは同じなんだよね。だからMesage_IDが同じだからという説明はおかしい。GmailはBccで来たメールもMesage_IDが同じだから受信しないのでは?。でもBccを受け取れるんだよね。

「MailmanとGmail」への7件のフィードバック

  1. メッセージIDが同じメールがあると、先の物(送信したメール)が優先されて、MLから配信されてきたメールは受信トレイに入らない仕様のようですね。
    私の所属ラボもGmailでMLを使っていますが、やはり自分から出したメールは見れません。
    ウェブ上を探してみると、ちらほら対策らしきものが見つかりますね。私には理解できないのですが、メッセージIDを書き替えちゃうという方法がありました。うまくいきますかどうか。
    http://piano2nd.smb.net/~kuji/pukiwiki-1.4.7/index.php?Gmail対策?

  2. あ、既に書いてあった。
    ちゃんと読んでいませんでした。失礼しました。
    「メールヘッダのmassage-idを強制的に書き変えてやればいいらしいという情報があるが、できていない。」

  3. コメントありがとうございます。日本語版ならいいんでしょうね。
    バージョンを変更するのをためらっています。

  4. USE_MAILMAN_MESSAGE_ID ですが、mailman 本家の ML で討議されすったもんだのあげく、不採用になったようです。
    だから、英語版(というか本家のオリジナル)には現在、インプリメントされていないのかもしれません(未確認)。
    これを提案したのが日本語 mailman に多大な貢献をなさった、故・菊池様(を中心としたメンバー)と伝え聞いています。
    という、歴史的経緯のため日本語版にだけ残っているのかもしれません。ご参考まで

  5. おまけですが、手元の日本語版 mailman では、USE_MAILMAN_MESSAGE_ID の処理をする部分は
    CookHeaders.py の
    def prefix_subject(mlist, msg, msgdata):
    ではなく、
    def process(mlist, msg, msgdata):
    で行われています。
    https://mm.poem.co.jp/mailman-jp/src/mailman-2.1.23%2bj3.tgz
    をダウンロードし展開し、その CookHeaders.py と現在ご使用中のそれと diff してみると、もしかすると幸せになれるかもw(勿論、自己責任でお願いします。)

  6. 情報ありがとうございます。
    今はちと他に優先させることがあるので、それが終わったら検討してみます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です