ようこそゲストさん

CPA-LABテクニカル

2008/05/19(月) デコメ。auのContent-IDの制約。@はひとつだけ。

デコメはどうやって、画像を特定するのか

通常のhtmlメールで例えばgif画像を指定するには、次のようにする。
<img src="http://example.com/hoge/images/filename.gif">
このファイル名でどの画像ファイルを表示するか、一意に特定される。

では、デコメはどう指定するか。
デコメは、通常のhtmlメールと異なり、メールに画像データも含まれて送られてくる。
添付ファイルと同じように送られてくるのだ。
しかし、その特定の方法は、ファイル名ではなく、cidで行われる。
すなわち、
<img src="cid:コンテンツID">
と指定する。

コンテンツIDは、メールに添付された画像ファイルのヘッダーに例えば次のように書いてある。
今、コンテンツIDを 01@086409.335009@_____P905i@docomo.ne.jp とすると、
 --mimemk00
Content-Type: image/gif;
 name="filename.gif"
Content-Transfer-Encoding: base64
Content-ID: <01@086409.335009@_____P905i@docomo.ne.jp>

base64エンコードされた画像データ
という感じ。

これで、cid同士が一致するものが、携帯のブラウザによって本文中で展開されて表示される。

これはデコメだけの特徴でなく、インラインHTML(MHTML)は、皆、このような構造で、cidを通じ一意に特定されている。

インラインhtmlメールでは、ファイル名も指定されていることが多いけれども、インラインhtml上では、なんの意味もない。*1

cid のよくあるタイプ

docomoのデコメでは、上記の例のように
01@086409.335009@_____P905i@docomo.ne.jp
と、@ アットマークが3つついている。
他のインラインhtmlメールを作成するソフトもそういうのが多いようである。

ちなみに、 cid はrfcにより、世界中でダブりがないことが求められている*2

auの制限

しかし、auにおいては、@ が2つ以上の複数だと、うまくcidを識別できず、デコメも正しく表示されない。
(ただし、W43Hでの実機での話であり、他の機種はわからない)

というわけで、PHP日本語高機能メールライブラリQdmail では、au の仕様のために、@ はひとつだけにして送付しているわけです。
けっこう芸が細かいでしょ*3

これ、かなりはまったんだよなあ。auさん、かんべんしてよ。

追記:さらに @ がない場合は、auはダメ

ぶりっぺさんから情報提供いただきました(2008/6/1)

auは、@が2つだとダメだし、@がないのもダメ。
つまり、1個だけは必ず@をつけて、複数の@はないようにする実装が必要ということです。

ちなみに、Qdmail は、そのような実装になっていますです。

*1 : インラインhtmlを展開できないブラウザのために、ファイル名は付いているのがよい。

*2 : 皆が本当にそういう実装にしてるかどうかは知らない

*3 : 自画自賛

1: 看護学生@元PG 2009年09月01日(火) 深夜0時01分

大変勉強になりました。デコメって全然興味なかったんですが、試しに作ってPCのメールに送ってみたらHTMLになってたんで興味を持ちました。埋め込み画像のURLって、どうなってるんだろう?表示する度にWebサーバに取りに行くんじゃ通信も大変だよなあ、どうするんだろと思って、CIDで検索したらたどり着きました。ありがとうございました。


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/0135/tb/