Y-110's Wiki
携帯:デコメール:MIMEフォーマットの違い
_ MIMEフォーマットの違い
通常のHTMLメールとデコメールのMIMEフォーマットは異なる.
まず, どのように異なるのかを見た上で, PHPによるデコメール対応の方法を考える.
_ 通常HTMLのMIMEフォーマット
- 画像無しの場合
multipart/alternative ├ text/plain └ text/html
- インライン画像のみある場合
multipart/alternative ├ text/plain └ multipart/related ├ text/html └ image/xxx (*n) ※n はインライン画像数
- 添付画像のみある場合
multipart/mixed ├ multipart/alternative │ ├ text/plain │ └ text/html └ image/xxx (*n) ※n は添付画像数
- インライン画像と添付画像の両方がある場合
multipart/mixed ├ mulpart/alternative │ └ multipart/related │ ├ text/html │ └ image/xxx (*m) ※m はインライン画像数 │ └ image/xxx (*n) ※n は添付画像数
_ デコメールのMIMEフォーマット
- 画像無しの場合
multipart/mixed └ multipart/alternative ├ text/plain └ text/html
作ろうiモードコンテンツのページには, 添付ファイル無しのMIMEフォーマットは,
multipart/alternative ├ text/plain └ text/htmlで定義されているのだが, デコメール対応端末からデコメールを送信すると, multipart/mixed から始まる MIMEフォーマットで送信される.
- インライン画像のみある場合
multipart/related ├ multipart/alternative │ ├ text/plain │ └ text/html └ image/xxx (*n) ※n はインライン画像数
- 添付画像のみある場合
multipart/mixed ├ multipart/alternative │ ├ text/plain │ └ text/html └ image/xxx (*n) ※n は添付画像数
- インライン画像と添付画像の両方がある場合
multipart/related ├ multipart/alternative │ ├ text/plain │ └ text/html └ image/xxx (*n) ※n はインライン画像と添付画像をあわせた数
インライン画像にはHTML内で画像を識別する Content-Id ヘッダが付加されている.
_ MIMEフォーマットの違いについて
まとめると, 以下の様になる.
- 通常HTMLメール
- 添付画像無し ・・・ multipart/alternative
- 添付画像あり ・・・ multipart/mixed
- デコメール
- インライン画像無し ・・・ multipart/mixed
- インライン画像あり ・・・ multipart/related
また, インライン画像・添付画像のヘッダは, 通常HTMLメールとデコメールとでは異なり, デコメールには Content-Disposition ヘッダが存在しない.
- 通常HTMLメールのインライン画像
Content-Type: image/gif; name="avatar.gif" Content-Disposition: inline; filename="avatar.gif" Content-Id: <20051130230337.5F61.dummy@example.com> Content-Transfer-Encoding: base64
- デコメールのインライン画像
Content-Type: image/gif; name="image.gif" Content-Transfer-Encoding: base64 Content-ID: <01@700101.090000@____N900iS@docomo.ne.jp>
_ デコメールのパース
インライン画像有/無 × 添付画像有/無 の組み合わせ 4通りのMIMEフォーマットパターンをそれぞれパースするようにプログラムを組めばよい.
インライン画像付きの場合のMIMEフォーマットが通常HTMLメールとは異なるため, 注意が必要.
PEAR Mail_mimeDecode を使えば, デコメール判定や, デコメールからのテキストや画像の切り出し等がわりと楽に行える.
_ デコメールの作成
デコメールの作成は, 作成するデコメールの形式に対応する4通りのMIMEフォーマットのどれかでメールボディを作成すればよい.
PEAR Mail_mime は 添付ファイル付きメールや HTMLメールを簡単に作成できるので デコメールの作成にも利用したのだが, デコメールと通常のHTMLメールの MIMEフォーマットの形式の違いにより, そのままでは利用できない.
そこで, Mail_mime を継承して, デコメールのMIMEフォーマットで作成するような Mail_mime_Decomailクラスを作成した.
下記2つの関数をオーバライドして実装すればよい.
- Mail_mime::_addHTMLImagePart
- Mail_meim::get
Mail_mime::_addHTMLImagePart は, インライン画像の Content-Type ヘッダに name属性を付けないようになっている.
name属性が無いと, デコメールでインライン画像が表示されないため, 以下の様に実装する.
Content-Disposition ヘッダは要らない.
function &_addHtmlImagePart(&$obj, $value)
{
// image/xxx; name=xxx の様に name=xxx を付けないと画像が表示されない
$params['content_type'] = $value['c_type']. ";\r\n name=\"${value['name']}\"";
$params['encoding'] = 'base64';
$params['cid'] = $value['cid'];
$obj->addSubpart($value['body'], $params);
}
Mail_mime::get では通常HTMLメールの MIMEフォーマットでメールボディを組み立てているため, デコメールの MIMEフォーマットで組み立てるように実装する.
具体的には, Mail_mime::{_addRelatedPart,_addAlternativePart} の呼び出し順序を変更すればよい.
_ Mail_mime_Decomail.php
デコメール用の MIMEフォーマットでメールボディを作成するクラス.
使用するには, PEAR Mail_mime が必要.
Mail_mime を継承しており, メソッドをオーバライドしているだけなので, Mail_mime と同じインターフェースで利用可能.
Mail_mime のバージョンは 1.3.1 で動作確認しました.
ダウンロード:[
Mail_mime_Decomail.php]