マルチパートメールは、一般的に
ヘッダ、プレーンテキスト、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() を使えばデコードできます。