[PHP]マルチパートメールの構造

Pocket

マルチパートメールは、一般的に ヘッダ、プレーンテキスト、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:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です