マルチパートメールは、一般的に ヘッダ、プレーンテキスト、HTML、添付ファイルで構成されています。
マルチパートかどうかはヘッダの Content-Type を確認します。
シングルパートの場合
Content-Type: text/plain; charset="iso-2022-jp"
マルチパートの場合
Content-Type: multipart/mixed; boundary="----ABCDEFG" Content-Transfer-Encoding: 7bit Content-Type: multipart/alternative; boundary="----HIJKLMN"
「Content-Type: multipart/~」となっていればマルチパートです。
この場合、boundary の値が区切り文字になっているので、
そこでパートを分けることができます。
boundary の値はあくまで例なので実際は環境によって異なります。
「multipart/alternative」は通常プレーンテキストとHTMLの
表示切り替えの際に用いられます。
基本的にはこのパートがメールの本文となります。
----HIJKLMN Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit Hello, World ----HIJKLMN Content-Type: text/html; charset="iso-2022-jp" Content-Transfer-Encoding: quoted-printable <HTML><HEAD><META http-equiv=3D"Content-Type" content=3D"text/html; charset= =3Diso-2022-jp"> </HEAD> <BODY> <P>Hello, World</P> </BODY> </HTML> ----HIJKLMN
multipart/alternative の boundary で区切られた
上の部分がテキスト、下が HTML です。
所々「=3D」のようになっているのは「quoted-printable」で
エンコードされている影響です。
本文が日本語の時はほとんど読めない状態になっているはずです。
これをデコードするには quoted_printable_decode() を使います。
HTML本文中に画像が用いられていた場合、
<IMG src="cid:03@123456.123456">
のようになります。
「cid」は「Content-ID」のことです。
メールのソースを探すと、次のようなパートがあるはずです。
----ABCDEFG Content-Type: IMAGE/GIF; name="sample.gif" Content-Transfer-Encoding: base64 Content-ID: <03@123456.123456> Content-Disposition: inline; filename="sample.gif" (エンコードされた画像データの文字列) ----ABCDEFG
Content-ID の部分が先ほどの値と一致しているので、
これがその画像であるということになります。
Content-Disposition が「inline」なので、本文中で
使うためのファイルであるという意味です。
添付されている場合は「attachment」になります。
画像はエンコードされた文字列の部分をデコードすると
画像になります。
この場合は Content-Transfer-Encoding: base64 なので
base64_decode() を使えばデコードできます。
Similar Posts:
- [PHP]携帯サイト向けに文字コードを一括変換する
- [PHP]GDで作った画像をファイル化せずに直接<img>タグで表示する
- [PHP]Twigテンプレートの実践的な構成と作り方
- [PHP]背景の明るさを基準に見やすい文字色を組み合わせる(YUV輝度)
- [PHP]DOM, XPathを使ったスクレイピング(HTMLのタグ内容取得)
- [JS, jQuery]ページ内に他のページをiframeのように埋め込む
- [PHP]料金表のようなものをテキストだけで表現する
- PHP で XML を読み書きする (DOM)