メールのデータ構造

前回、メールの転送におけるプロトコル「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が書かれています。これを元に区切りパーツから文章や画像を復元していきます。

最後に

以上の解説から以下のような解析を行えば、メールの文章が読めるようになります。

  1. 連続改行を元にヘッダーと本文に分ける
  2. ヘッダーを解析する
  3. ヘッダーのContent-Transfer-Encodingを元に本文を英数字に変換する
  4. ヘッダーのContent-Typeを元に本文を文章や画像に変換する

試しにPOP3のプログラムを作ってみると理解が深まるので、おすすめします。

著者:安井 真人(やすい まさと)