※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

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を使っていて「ん?」と思った人は参考にしてほしい。