Multipurpose Internet Mail Extensions

enは、規格上US-ASCIIのテキストしか使用できないインターネットの電子メールでさまざまなフォーマットを扱えるようにする規格である。通常はMIMEと略される。2045}}、2046}}、2047}}、4288}}、4289}}、2049}} で規定されている。

1. 概要
-----

インターネットでメールの書式を定めている 5322}} では、英数字といくつかの記号を7 ビットで表現する「US-ASCII」と呼ばれる文字コードを利用し、1行あたり1000 バイトのテキストデータしか許していない。そのため、規格に不適合になるような長い行、US-ASCIIだけで表現できない文字や、バイナリデータ、画像、音声などの非文字データを利用することができなかった。

MIMEはこれらのデータを取り扱うために新しくいくつかのヘッダを定義し、かつUS-ASCII上でさまざまなデータタイプを表現するための符号化方式を規定している。

5322}} では1 通のメールで1つの本文しか扱うことができないが、MIMEでは本文を分割して複数のコンテンツを扱うことができるようにした。これをマルチパートと呼ぶ。MIMEヘッダには、MIMEメッセージヘッダとMIMEパートヘッダの二つがある。MIMEメッセージヘッダはメッセージ全体に適用され、MIMEパートヘッダはマルチパートメッセージの各部分に適用される。マルチパートにより、1つのメールに複数の種類のファイルを扱うことができるようになった。

また、HTTPにおけるデータの伝送に関しても、MIMEの枠組みが援用されている。

2. MIMEで導入されたヘッダ
----------------

2.1. MIME-Version
-----------------

従来の5322}}  準拠のメッセージとの区別、あるいは将来MIMEが拡張されたときにバージョンを区別するためのヘッダ。現在は1.0のみが規定されている。 Mime-Version: 1.0

2.2. Content-Type
-----------------

このメッセージ中のデータの種類を指定する。 一般的な書式は次の通り。

Content-Type: //type/////subtype//; //parameter//

//type//は大分類となるデータの種類を指定する。//subtype//にはより詳細な形式を指定する。//parameter//は追加の情報を指定するもので、複数指定できる。電子メールメッセージにおいて使われる例を以下に示す。

text/plain; charset=iso-2022-jp; format=flowed; delsp=yes
text/html; charset=UTF-8
multipart/alternative//type//毎に未知の//subtype//の扱いが規定されており、受信側は自分の扱えない//subtype//であっても最低限の取り扱いが可能となる。text の場合は text/plain、application/octet-stream、multipart の場合は multipart/mixed である。application、image、audio、videoなどは、未知の//subtype//についてapplication/octet-streamとして扱うよう規定している。

2.3. Content-Transfer-Encoding
------------------------------

MIMEではUS-ASCIIだけでなくデータのさまざまな符号化方法の指定がこのヘッダで可能になっている。 書式は以下の通り。 Content-Transfer-Encoding: //mechanism////mechanism//として、7bit、8bit、binary、quoted-printable、base64 が指定できる。一般的に利用できるのは 7bit、quoted-printable、base64 であり、8bit、binary は一定の条件を満たす場合しか利用できない。

2.3.1. 7bit
-----------

デフォルト値。7 ビットのテキストを表す。Content-Transfer-Encoding ヘッダフィールドを省略した場合は、この 7bit を指定したのと同じ意味となる。US-ASCIIやISO-2022-JPは確実に7 ビットのテキストであるため、これにあたる。

2.3.2. 8bit
-----------

8 ビットのテキストを表す。 5322}} は7 ビットのテキストを前提としており、この8bitは意図的に違反するものである。メールを転送するためのSMTPは基本的に7 ビットのテキストしか転送できないため、このエンコーディングを用いることはできない。1652}}で定義されるSMTPの拡張の8BITMIMEを用いるか、8 ビットを許容するような全く別のプロトコルを用いた場合のみ、利用が可能である。

2.3.3. binary
-------------

データがテキストではなくバイナリであることを表す。5322}} はテキストを前提としており、このbinaryは意図的に違反するものである。SMTPは基本的に行単位でデータを扱うため、行の概念すらないバイナリは転送できない。3030}}で定義されるESMTPの1つであるBINARYMIMEを用いるか、バイナリを許容するような全く別のプロトコルを用いた場合のみ、利用が可能である。

2.3.4. quoted-printable
-----------------------

US-ASCIIに存在する文字はそのまま使い、存在しない文字などを =//HH//のような形で符号化する。ここで、//HH// には文字のコードを大文字の16進数で指定する。その他、以下のような規則がある。

= 自体は =3D となる。
行末に空白がある場合、伝送の過程で失われるおそれがあるため、=20 としてこれを保存する。
エンコードの過程で行を折り返す場合、= と改行の組み合わせを挿入し、もともとあった改行と区別できるようにする。ヨーロッパ系の言語では、多くの文字がUS-ASCIIと同一で一部に独自の文字を使っているものが多い。 この場合に quoted-printable を用いると、US-ASCIIはそのままの文字を使用しているので、データがほとんど大きくならず、quoted-pritable 対応プログラムを使わなくても、大体の内容が読めるという利点がある。 しかし通常のバイナリデータや、Shift_JISやEUC-JPといった仮名漢字などの非ヨーロッパ系の文字のテキストデータに quoted-printable を適用した場合は、base64を使用した場合よりも大幅にデータが大きくなる。

2.3.5. base64
-------------

3オクテットを6 ビットずつ4つに分割し、各6 ビットの値に対してそれぞれUS-ASCIIの64 文字を割り当てる符号化方式。

この符号化によって、SMTPなどUS-ASCIIしか許されていない通信路でもバイナリデータを交換できるメリットはあるが、データ容量は約33%増加する。

3. ヘッダでの非US-ASCII 文字の扱い
-----------------------

上記のヘッダの導入によって、body部のデータタイプや符号化方式は指定できるようになったが、このままではヘッダ部は相変わらずUS-ASCIIしか利用できない。MIMEでは2047}}や2231}}によって、ヘッダ部分での非US-ASCII文字の扱いを規定している。2047}}によれば、

?//charset//?//encoding//?//encoded-text//?
-------------------------------------------

という形式により、文字コード系が//charset//、符号化方法が//encoding//で、//encoded-text//と符号化された単語を表現できる。//charset//は Content-Type:text/plain における charset パラメータで指定するのと同じ、IANAに登録された文字列を用いる。//encoding// は Q または Bであり、前者はほぼ quoted-printable と同じ符号化方法、後者は base64を用いることを表す。

2047}}では、「"」で囲まれた中でこのような符号化された単語を解釈することはできない、とされている。したがって、「"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?="」は「=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=」と解釈しなければならず、これを「日本語」と解釈することは、規格違反となる。しかし、Microsoft Outlook Expressなど、一部のMUAがこのような誤った符号化を実装してそれが普及してしまったため、それを規格違反と知っているMUAの作者も、それに対応することを余儀なくされている。
2231}}では、MIMEパラメータの値に非US-ASCII文字を指定する方法を規定している。これによれば、添付ファイル名など、MIMEパラメータの値としての「ISO-2022-JP//%1B$BF|K%5C8l%1B%28B////」を「日本語」と解釈することができる。また、5322}}に適合しない長さの文字列を短く分割して指定する方法も規定している。//

1. 脚注
-----

2. 関連項目
-------

拡張子
電子メール
SMTP 
MHTML 
S/MIME