メールのデータ構造
2016年1月1日:ネットワーク
前回、メールの転送におけるプロトコル「SMTP」「POP3」について解説しました。今回は、メールの内容がどのようなデータ構造になっているかについて解説します。メールを送ったり、受信する際にデータ構造は理解してないといけません。
ヘッダーと本文
メールはおおきくわけてヘッダーと本文とにわかれています。ヘッダーにはメールの転送者のアドレスやタイトルなどの情報が書かれており、本文にはメールの内容が書かれています。ヘッダーと本文は連続改行によって分離されています。
ヘッダー情報 本文 .
ですから、はじめの連続改行を見つけてやればヘッダー情報と本文を分離できるというわけですね。メールの最後はドットで終わります。
ヘッダーの構造
ヘッダーには以下のような情報が書かれています。
記号 | 意味 | 用法 |
Return-Path | 送信先がいない場合に送られるアドレス | Return-Path: メルアド |
From | 送信者のメルアド | From: <メルアド> |
Message-ID | 本メール特有の番号 | Message-ID: <番号@サーバーIP> |
To | メールの宛先 | To: <メルアド> |
Subject | メールのタイトル | Subject: タイトル |
Date | 送信日時 | Date: 日時 |
Content-Type | 本文の種類 | Content-Type: text/plain; |
Content-Transfer-Encoding | 本文送信の方法 | Content-Transfer-Encoding: 方法 |
これらの情報をヘッダーから読み取ることで情報を取り出します。例えば、メールの宛先を知りたければ、Toを見ればいいことになります。最後の2つにあるContent-TypeとContent-Transfer-Encodingは本文を解読する際に使用します。
本文の解読
ヘッダーの意味がわかったので、次に本文を解読していきます。本文の解読にはContent-Transfer-EncodingとContent-Typeが必要です。
Content-Transfer-Encoding
本文の記述法で最も単純な方法は7bit形式と呼ばれるものです。英数字をすべて表現できる7bitを用いてデータをつくります。そして、英数字のまま送信する方式です。
7bit形式だと英語をそのまま送れていいのですが、7bitもあると使用頻度の低いのを使うのでもったいないです。そこで、base64が開発されました。base64はA-Z,a-z,0-9,+,/の計64個(6bit)の英数字で送る方針です。ピッタリ64個を使うので効率よくデータを送れるだろうということです。他にも、おなじみのbinaryや8bit版もあります。
どの形式を使用しているかはContent-Transfer-Encodingに書かれています。まとめると
- 7bit
- 8bit
- base64
- binary
- quoted-printable
です。メールを受け取ったら形式を調べて、本文を英数字に翻訳します。
Content-Type
英数字の文字列を受け取っても中身が何なのかよくわかりません。英語の文章ならそのままなので問題ありませんが、日本語や画像が英数字で表現されているとわけがわかりません。そのため、一体何が書かれているのかについての情報が必要です。書かれている情報がわかれば、推測することなく変換できるからです。データの種類についてはContent-TypeにMIME形式で書かれています。例えば、普通の英数字文章なら「text/plain」ですし、jpeg画像なら「image/jpeg」です。以下に一覧をあげておきます。
タイプ | サブタイプ | 意味 |
text | plain | 普通の文章 |
html | HTML文章 | |
css | CSSの文章 | |
image | jpeg | jpeg画像 |
png | png画像 | |
gif | gif画像 | |
video | mpeg | MPEG動画 |
multipart | mixed | |
alternative |
textの場合、utf-8やiso-2022-jpなど文字形式が書かれています。この形式を用いて英語の羅列から意味ある日本語に変換します。imageは画像でjpegやpngなどの画像形式と英語の羅列から画像の各画素を復元します。
そして、multipartはtextやimageなどが混ざっている場合に使用します。メールにおいてテンプファイルがある場合に使用されます。boundaryに区切り記号が書かれているので、この区切り記号を頼りに本文を区切っていきます。例えば、区切り記号が「12345」なら「–12345」で本文がいくつかのパーツに区切られています。
区切ったパーツにはさらにContent-TypeとContent-Transfer-Encodingが書かれています。これを元に区切りパーツから文章や画像を復元していきます。
最後に
以上の解説から以下のような解析を行えば、メールの文章が読めるようになります。
- 連続改行を元にヘッダーと本文に分ける
- ヘッダーを解析する
- ヘッダーのContent-Transfer-Encodingを元に本文を英数字に変換する
- ヘッダーのContent-Typeを元に本文を文章や画像に変換する
試しにPOP3のプログラムを作ってみると理解が深まるので、おすすめします。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー