Y-110's Wiki


携帯:デコメール:MIMEフォーマットの違い

このページをdel.icio.usに追加 このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ このページをYahoo!ブックマークに追加このページを含むYahoo!ブックマーク

_ 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 で動作確認しました.

ダウンロード:[fileMail_mime_Decomail.php]

_ 参考

作ろうiモードコンテンツ:インターネット経由でデコメールを送るには

 
添付ファイル: fileMail_mime_Decomail.php 3156件 [詳細]
 
Link: FrontPage(1373d) 携帯:デコメール(1702d)
Last-modified: 2006-12-09 (土) 03:22:33 (1329d)