Gmailでメーリングリストに投稿したはずのメールが受け取れない?


2011年 02月 03日

大容量で、POPやIMAPも使える、Googleが提供するWebメールシステム、Gmail。
外出先からでも、別段特別なメールアプリケーションが無くても、
ブラウザ一本、スマートフォン一本あればメールを確認できるのは確かに便利だ。

しかし、そのGmailを使っていてひとつ気になるのが、
自分が参加しているメーリングリストに投稿しても、どうやらそのメールが届かないように見えることだ。

一体これはどういうことなのか? 色々調べる中で分かったことをまとめてみよう。

Gmailの公式説明

ひとまず、該当の現象については、Gmailから公式に下記のような説明がある。

http://mail.google.com/support/bin/answer.py?hl=jp&answer=6588

OK。日本語には「余計なお世話」っていう便利な言葉があるんですよ。

というのはさておき、「すべてのメール」を探せばあるというので探してみよう。
Gmailにはメーリングリストに関する便利な検索フィルタがあって、
list:ml-example@example.com なんて検索をすると、
該当メーリングリストのメールを検索してくれる。

で、確かにそれをすれば自分がMLに投稿したメールは見つかる。
しかし、[ml-example:0123] なる件名のメールは見つからないのだ。
あとから「[ml-example:0123]の件で…」なんて参照されることを考えると、
できれば採番後のメールがあって欲しいのだが、ない。これは一体どういうことなのか。
自動でアーカイブしてくれているだけなら、見つかってしかるべきではないか?

どうも、公式説明だけでは説明しきれない何かが裏で行われているようだ。

混乱の原因

Gmailの内部実装がどうなっているのかはもちろん不明なので、
あくまで下記は私自身がGmailの挙動を見ての推測でしかないことはあらかじめ断わっておくが、
どうやらGmailはヘッダの Message-Id を元に同一メールかどうかを判定しているようだ。
そして、問題は、既に同じ Message-Id のメールを所持していると、
後から受け取った同じ Message-Id のメールは破棄されるらしいことだ。

まあ、どういうことなのかはなんとなく想像はできる。要は多分、Message-IdをKeyにしてメールを管理しているのだ。そして重複があれば上書ではなく後から来たものを破棄する。Message-Idのフィールドの意味を考えれば、別段不思議な実装でもないように思う。思うが…

するとどうなるか。自分がMLにメールを投稿すると、自分が送った「送信済みメール」と、
新たにMLから送られてくる [ml-example:0123] には同じ Message-Id が付いている。
このため、Gmailは二つのメールを同じメールだと判断し、後で受け取ったメールを破棄してしまう…。

ユーザーからは、「送信済みメール」の件名には [ml-example:0123] の採番がついていない
(いや、つけられない!)ため、確かに中身は同じであっても、別のメールのように見える。

なるほど。混乱の原因は分かった。
「自動でアーカイブされる」なんて言っているが、
実際には、「アーカイブ済みの同メールを既に持っている」なのだ。

対症療法はある。自分が送った「送信済みメール」を一旦削除し、
MLマネージャに「ml-example:0123をくれ」と要求すればいい。
採番された件名のメールをちゃんと受け取れるはずだ。

…これを運用として毎回やるのはちょっとツラい気がするが。

メーリングリストに関する類似の問題

自分からの送信でなくても、類似の問題は発生する。

例えば私は ml-example に参加しているとして、誰かが To: <私>; Cc: ml-example のようにしてメールを送信すると、
私は「直接受け取るもの」、「ml-exampleから受け取るもの」の2通を受け取ることになるハズだが、
前述挙動によりいずれかひとつしか見ることができない。

これが仮に、直接のメールを受け取り、採番された [ml-example:012] が破棄されたとすると、
後で「[ml-example:012]の件で…」と参照されても、私のメールボックスでは欠番していることになる。

オカシイと思い、MLマネージャに「[ml-example:012]をくれ」と要求しても、「送ったよ!」という応答はあるにも関わらず、
肝心の本文を受け取ることができない。理由は、既に同 Message-Id のメールを所持しており、
Gmailはそれを重複と判断して破棄するからだ。

そんな場合は、なんとか list: の検索で欠番を推測するしかなさそうだ…。

逆に、送る際には、複数のMLや、同じ人に複数届くようにCcするのは避けたほうが良いかもしれない。
しかし、記録のために誰かにToしつつもMLにもCcをする人は結構居るように思うのだが、どうだろう?

どうにかならないの?

何か、運用方法も含め、上手いやり方があるのなら是非そうしたいのだが…。

原因が正しければ、ぱっと思いつく案としては、MLマネージャがSubjectに採番結果を記載する際、Message-Id にも採番結果を含めさせるようにしたらいいんじゃないか、とかはあるが、それがルール的にOKなのかとか、別の問題はないのかとか、色々考えなきゃならないことはありそうだ。そもそも、そういう実装になっていたり、そういう設定にできるMLマネージャって、ないんだろうか。

まあ、とにもかくにも、GmailでMLを使っていて「ん?」と思った人は参考にしてほしい。