複数の添付ファイル付き電子メールの中身を調べてみた

複数の添付ファイル付き電子メールの中身を調べてみた

Q1, MIME(Multipurpose Internet Mail Extension)とは、何か?
A1, もともと、電子メールはASCII文字のみを送受信するための仕組みだった。
以下の様な機能を追加するための拡張がMIMEです。
1, 日本語JISなど他の文字コード
2, 添付ファイル(テキスト・画像・zip)も、一緒に送りたい

Q2, 具体的には、どうやっているの?
A2, メールのヘッダとボディを修正します。

文字列のみのメールヘッダは、単純に1行だけ
From: 送り元メールアドレス(自己申告なので嘘がつける)
後は本文をダラダラと書くだけ~。

添付ファイル有りの場合は、以下のように大量の記述が必要!

From: 送り元メールアドレス(自己申告なので嘘がつける)
MIME-Version: 1.0(ずっと1.0しかない)
Content-Type: multipart/mixed; boundary=”__Boundary__”(本文と添付ファイルなどの境界線となる文字列を定義)
Content-Transfer-Encoding: 7bit(エンコード形式。本文は7bit, 添付ファイルはbase64)
–__Boundary__–(メール本文開始)
Content-Type: text/plain; charset=UTF-8(本文のMIME形式)
Content-Transfer-Encoding: 7bit

メール本文1行目
メール本文2行目

–__Boundary__–(添付ファイルその1のエンティティ)
Content-Type: image/jpeg; name=”=?UTF-8?B?5re75LuY44Gd44Gu77yRLnR4dA==?=”(添付ファイルのMIMEとファイル名)
Content-Transfer-Encoding: base64(添付ファイルなのでbase64でエンコード)
Content-Disposition: attachment; filename=”=?UTF-8?B?5re75LuY44Gd44Gu77yRLnR4dA==?=”(受信相手が保存する時のファイル名を指定)

5re75LuY44Gd44Gu77yR(これがbase64エンコードされたファイルの中身。復号化すると「添付ファイルその1」)

–__Boundary__–(2個目の添付ファイル)
Content-Type: application/octet-stream; name=”=?UTF-8?B?5re75LuY44Gd44Gu77ySLnR4dA==?=”
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=”=?UTF-8?B?5re75LuY44Gd44Gu77ySLnR4dA==?=”

5re75LuY44Gd44Gu77ySCg==

–__Boundary__–(ここで終了すれば添付ファイル付きメールデータは完了。3個目以降の添付ファイルを追加するならひたすら繰り返す)

メール構造の専門用語
1, マルチパート
1通のメールに複数のデータ(本文と添付ファイル)を格納するためのMIME拡張です。

2, バウンダリー
マルチパートでデータ同士(エンティティ)を区切るための境界線(boundary)です。
通常は–__Boundary__–

3, エンティティ
マルチパートで各データ(本文と添付ファイル)の事です。

4, Content-Type
Content-Typeとは、エンティティの種類を表します。本文ならtext/plainかtext/html
添付ファイルなら、色々な種類があります(カテゴリ/詳細)
image/gif(GIF画像)
image/jpeg(JPEG画像)
image/png(PNG画像)
video/mpeg(MPEG動画)
application/octet-stream(任意のバイナリデータ)
application/pdf(PDF文書)

5, base64
電子メールでは文字しか送信できないので、バイナリ→文字に変換します。その変換形式