Go to the first, previous, next, last section, table of contents.


MIME ってなぁに?

今までのメール、正確には RFC822 メールは、本文にテキストしか格納できない 規格でした。MIME は RFC822 を拡張した多目的メールです。

MIME は、ヘッダに

MIME-Version: 1.0

というフィールドを持ちます。このフィールドがない場合は、RFC822メールです。 MIME では、データの型を示す Content-Type: と符号化方式を示す Content-Transfer-Encoding: が重要なフィールドです。以下ではこれらのフィー ルドや MIME の特徴について説明します。

データの型指定

MIME では、Content-Type:(以下 CT:)というフィールドにデータの型を指定でき ます。以下は、本文が US-ASCII である MIME の例です。

MIME-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Subject: hello
From: Kazu

Hi all,

CT: が省略された場合は、text/plain; charset=us-ascii として取り扱われま す。また、CT: text/plain のときに、charset が省略されると US-ASCII と解 釈されます。

このように MIME では、CT: がテキストの場合は、charset で文字コードを指定 できます。日本語には ISO 2022 JP を使います。

MIME では、本文に複数のデータを格納できます。これをマルチパートといいま す。マルチパートのそれぞれのパートは、コンテントヘッダとコンテントボディ から構成されています。CT: はヘッダだけでなく、コンテントヘッダ中にも現れ ます。逆に、ヘッダは特殊なコンテントヘッダだと考えても構いません。

詳しくは、See section マルチパート を参照して下さい。

以下に重要な CT: を示します。

`Text/Plain'
テキスト
`Message/Rfc822'
MIME を含むメール。ヘッダと本文という構造がある。
`Multipart/Mixed'
マルチパート
`Application/Postscript'
PostScript
`application/octet-stream'
バイトストリーム。バイナリファイルと思ってよい。
`Image/Gif'
GIF
`Image/Jpeg'
JPEG
`Audio/Basic'
AU 形式の音声ファイル
`Video/Mpeg'
MPEG
`Message/External-Body'
メールの外部に実体がある

安全な符号化

以前からバイナリを配送するために uuencode という符号化プログラムが使われ ていました。uuencode は、8ビット3文字を6ビット4文字に変換しますが、変換 後にたくさんの記号が現れます。これらの記号はメールのヘッダで特殊な意味を 持つものが含まれており、ヘッダの拡張のためには利用できません。

また、空白文字も使われているのも厄介です。なぜなら、BITNET のファイルシ ステムには、行末に空白がありえないのです。もし、uuencode で符号化したと きに、行末にたまたま空白が現れたとしましょう。これを BITNET のメールゲー トウェイが受け取ると、当然行末の空白を削ってしまいます。よって、受信者は 元のバイナリファイルを復元できません。

そこで、MIME では本文用に 2 つの符号化方式を定めました。

Base64 符号化方式
"0-9A-Za-z/+" の64文字を用いて、8ビット3文字を6ビット4文字に変換する。も ともとは PEM で考え出された。
Quoted-Printable 符号化方式
表示不可能な文字を "=" に続けて16進表記する。

各コンテントヘッダ中の Content-Transfer-Encoding:(CTE:)で符号化方式を指 定します。取りうる値は以下の通りです。

7bit
無変換。7ビットの行から構成される。
8bit
無変換。8ビットの行から構成される。
binary
無変換。8ビットのデータ・ストリーム。
base64
Base64 で符号化した。7ビットの行から構成される。
quoted-printable
Quoted-Printable で符号化した。7ビットの行から構成される。

CTE: が省略された場合は `7bit' して扱われます。

ISO 2022 JP は7ビットの文字コードですから、CTE: は 7bit です。つまり、 CTE: は省略して構いません。もちろん、base64 や quoted-printable で符号化 しても構いませんが、フォルダにあるメールを more などで直接読めなくなるの で、お勧めではありません。

マルチパート

CT: が Multipart である場合、そのコンテントボディには複数のデータが格納 されることを意味します。データの境界は boundary に指定された文字列で区切 られます。以下に例を示します。

Message-Id: <13060.789566615@is.aist-nara.ac.jp>
From: Kazuhiko Yamamoto =?ISO-2022-JP?B?GyRCOzNLXE9CSScbKEI=?=
        <kazu@is.aist-nara.ac.jp>
Subject: =?ISO-2022-JP?B?GyRCPC8kTjMoGyhC?=
To: m-sakura@ccs.mt.nec.co.jp
Mime-Version: 1.0
Content-Type: Multipart/Mixed;	boundary=simple

--simple
Content-Type: Text/Plain; charset=us-ascii

奈良名物「鹿」の絵を送ります。
 
--かず
    
--simple
Content-Type: Image/Gif
Content-Transfer-Encoding: base64
Content-Description: "Deer on the Nara park"
    
R0lGODdhFwG8ANUAABETDCoYDC8lFi4dJxcnKTMwLkUUC04uG2opEkgeJ04yMWg4Ly1FLVJG
NWdSMywyTks1Tmc3RjdRVjNcalRMUG9UU1xbY051eG9pcIcxEp5bM8d1NI1VSJhrVrRwUpR0
cKZ1dcN9WXuHOWmHc7WJN6yLbcyEWNCZdDZjjml0i5t7im+TmGeRonWly5aLlrCLlK+arJmn
pbettMabktWumM+zsrnCrtTLua21ycq6x6/J3NbQ1+bk29na5dzp8+7w8ywAAAAAFwG8AAAG
/8CLcPhYtVgNyirWasZYEgDhIWGxRiXWcTIATHS/Hs6K2+1wt59azYtdJnBhKrVaWYcp7==
    
--simple--

この例では、"simple" という文字列で区切られています。boundary に指定され た文字列には、先頭に "--" が付きます。最後の区切りには、後ろにも "--" が 付きます。

各パートは、コンテントヘッダとコンテントボディから構成されます。両者は、 ヘッダと本文のように空行で区切られます。逆にいうと、ヘッダと本文は、それ ぞれ特殊なコンテントヘッダとコンテントボディです。

テキスト以外を MIME で送信する場合は、必ずマルチパートを利用するようにし ましょう。たとえば、本文にいきなり audio/basic を格納できますが、そんな メールを受け取ったらびっくりします。パート1に説明のテキスト、パート2に audio/basic を入れた方が親切でしょう。

マルチパートは、入れ子構造にできます。つまり、マルチパートのマルチパート なども作成できます。

ちなみに境界ですが、前後の改行まで含みます。上記の例では、 "CRLF--simpleCRLF" が区切りです。

ヘッダの拡張

ヘッダはメールの配送に関わる情報を格納しているため、配送プログラムが誤動 作するような文字列を入れるべきではありません。MIME では、ヘッダに以下の ような形式で非 ASCII を安全な文字列を符号化し挿入します。

=?<charset>?<encoding>?<encoded-string>?=

指定できる <charset> は CT: text/plain の charset と同じです。<encoding> には、`B'`Q' 符号化方式があり、前者は Base64 符号化方式、 後者は Quoted-Printable 符号化方式の亜種を意味します。

ISO 2022 JP には、`B' 符号化方式が奨励されていますが、`Q' 符号 化方式でも構いません。しかし、`Q' 符号化方式に対応しているインター フェイスはあまりないようです(もちろん Mew は対応していますが)。

たとえば、「山本和彦」をこの形式で符号化すると

=?ISO-2022-JP?B?GyRCOzNLXE9CSScbKEI=?=

となります。


Go to the first, previous, next, last section, table of contents.