MIME筆記

阮一峰發表於2008-06-22

最近對網際網路的一些技術細節很感興趣,打算做一系列的筆記。

=================

MIME筆記

1.

MIME的全稱是"Multipurpose Internet Mail Extensions",中譯為"多用途網際網路郵件擴充套件",指的是一系列的電子郵件技術規範,主要包括RFC 2045、RFC 2046、RFC 2047、RFC 4288、RFC 4289和RFC 2077。

顧名思義,MIME是對傳統電子郵件的一個擴充套件,現在已經成為電子郵件實際上的標準。

2.

傳統的電子郵件是1982年定下技術規範的,檔案是RFC 822。

它的一個重要特點,就是規定電子郵件只能使用ASCII字元。這導致了三個結果:1)非英語字元都不能在電子郵件中使用;2)電子郵件中不能插入二進位制檔案(如圖片);3)電子郵件不能有附件。

這實際上無法接受的,因此到了1992年,工程師們決定擴充套件電子郵件的技術規範,提出一系列補充規範,這就是MIME的由來。

3.

下面是一封傳統的電子郵件。

From: "Tommy Lee" <[email protected]>
To: "Jack Zhang" <[email protected]>
Subject: Test
Date: Wed, 17 May 2000 19:08:29 -0400
Message-ID: <[email protected]>

Hello World.

從上面可以看出,這封信的發信人地址是[email protected],收信人地址是[email protected],郵件主題是Test,傳送時間是2000年5月17日,郵件內容是"Hello World."。

在結構上,這封信分為三個部分:首先是信件頭,然後是一個空行,最後是信件內容。收信人的客戶端軟體只會顯示最後一部分,要檢視全信,必須使用"檢視原始郵件"功能。

4.

MIME對傳統電子郵件的擴充套件,表現在它在信件頭部分新增了幾條語句,主要有三條。

第一條是:

MIME-Version: 1.0

這條語句是必須的,而且1.0這個版本值是不變的,即使MIME本身已經升級了好幾次。

有了這條語句,收信端就知道這封信使用了MIME規範。

5.

第二條語句是:

Content-Type: text/plain; charset="ISO-8859-1"

這一行是極端重要的,它表明傳遞的資訊型別和採用的編碼。

Content-Type表明資訊型別,預設值為" text/plain"。它包含了主要型別(primary type)和次要型別(subtype)兩個部分,兩者之間用"/"分割。主要型別有9種,分別是application、audio、example、image、message、model、multipart、text、video。

每一種主要型別下面又有許多種次要型別,常見的有:

text/plain:純文字,副檔名.txt
text/html:HTML文字,副檔名.htm和.html
image/jpeg:jpeg格式的圖片,副檔名.jpg
image/gif:GIF格式的圖片,副檔名.gif
audio/x-wave:WAVE格式的音訊,副檔名.wav
audio/mpeg:MP3格式的音訊,副檔名.mp3
video/mpeg:MPEG格式的影片,副檔名.mpg
application/zip:PK-ZIP格式的壓縮檔案,副檔名.zip

詳細的Content-Type列表,可以檢視這裡這裡

如果資訊的主要型別是"text",那麼還必須指明編碼型別"charset",預設值是ASCII,其他可能值有"ISO-8859-1"、"UTF-8"、"GB2312"等等。

整個Content-Type這一行,不僅使用在電子郵件,後來也被移植到了HTTP協議中,所以現在只要是在網上傳播的HTTP資訊,都帶有Content-Type頭,以表明資訊型別。

6.

前面已經說過,電子郵件的傳統格式不支援非ASCII編碼和二進位制資料。因此MIME規定了第三條語句:

Content-transfer-encoding: base64

這條語句指明瞭編碼轉換的方式。Content-transfer-encoding的值有5種----"7bit"、"8bit"、"binary"、"quoted-printable"和"base64"----其中"7bit"是預設值,即不用轉化的ASCII字元。真正常用是"quoted-printable"和"base64"兩種,它們的詳細用法,我在明天的筆記中會詳細介紹。

7.

下面是一封我收到的郵件的原始碼:

Date: Wed, 18 Jun 2008 18:07:51 +0800 (CST)
From: xxx <[email protected]>
To: [email protected]
Message-ID: <[email protected]m>
Subject: =?gbk?B?xOO6ww==?=
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary=&quot;----=_Part_287491_22998031.1213783671982&quot;

------=_Part_287491_22998031.1213783671982
Content-Type: text/plain; charset=gbk
Content-Transfer-Encoding: base64

IAq4+b7dsr+209PQudi55raoo6yyu7XD1Nq12Le9yM66zs341b7Jz7nSz+DTprXEtqvO96Osx+vE
49TaxOO1xLKpv83W0AogIArW0Ln6yr2x6tPvIC0gyO7Su7fltcTN+MLnyNXWvgoKtcS12jEy1cXN
vMasyb6z/aOst/HU8s7Sw8fXt76/xOO1xM/gudjU8MjOoaPQu9C7us/X96OhtMvNvMas1Nq4vbz+
wO/D5g==
------=_Part_287491_22998031.1213783671982
Content-Type: text/html; charset=gbk
Content-Transfer-Encoding: quoted-printable

<DIV>&amp;nbsp;</DIV>
<DIV>=B8=F9=BE=DD=B2=BF=B6=D3=D3=D0=B9=D8=B9=E6=B6=A8=A3=AC=B2=BB=B5=C3=D4=
=DA=B5=D8=B7=BD=C8=CE=BA=CE=CD=F8=D5=BE=C9=CF=B9=D2=CF=E0=D3=A6=B5=C4=B6=AB=
=CE=F7=A3=AC=C7=EB=C4=E3=D4=DA=C4=E3=B5=C4=B2=A9=BF=CD=D6=D0</DIV>
<DIV>&amp;nbsp;
......

可以看到這封信的MIME語句是:

MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_Part_287491_22998031.1213783671982"

"Content-Type: multipart/alternative;"表明這封信的內容,是純文字和HTML文字的混合。另兩個可能的值是multipart/mixed和multipart/related,分別表示"信件內容中有二進位制內容"和"信件帶有附件"。

"boundary="----=_Part_287491_22998031.1213783671982"
"表明不同信件內容的分割線是"----=_Part_287491_22998031.1213783671982",它通常是一個很長的隨機字串。

信件內容部分又有兩個子信件頭:

Content-Type: text/plain; charset=gbk
Content-Transfer-Encoding: base64

Content-Type: text/html; charset=gbk
Content-Transfer-Encoding: quoted-printable

它們表明,第一個部分是gbk編碼的純文字,編碼轉換格式是base64。第二個部分是gbk編碼的HTML文字,編碼轉化格式是quoted-printable。

[延伸閱讀]

1. wikipedia的MIME條目

2. MIME FAQ

3. MIME郵件面面觀

(完)