一、為什么會(huì)有 MIME?
因?yàn)?簡(jiǎn)單郵件傳送協(xié)議 SMTP 有幾個(gè)缺點(diǎn):
- SMTP 不能傳送可執(zhí)行文件或者其他二進(jìn)制對(duì)象;
- SMTP 只能傳送7位的 ASCII 碼,許多國(guó)家非英文的文字將無(wú)法傳送;
- SMTP 服務(wù)器會(huì)拒絕超過(guò)一定長(zhǎng)度的郵件;
- 某些 SMTP 的實(shí)現(xiàn)并沒(méi)有完全按照 SMTP 的因特網(wǎng)標(biāo)準(zhǔn)。
正因如此,一些非英語(yǔ)字符消息和二進(jìn)制文件,圖像,聲音等非文字消息都不能在電子郵件中傳輸。 MIME 規(guī)定了用于表示各種各樣的數(shù)據(jù)類(lèi)型的符號(hào)化方法。
MIME 最早應(yīng)用于電子郵件系統(tǒng),但后來(lái)也應(yīng)用到瀏覽器。服務(wù)器發(fā)送的多媒體到瀏覽器,瀏覽器獲取該多媒體數(shù)據(jù)的MIME類(lèi)型,從而讓瀏覽器知道接收到的信息屬于哪種類(lèi)型。
二、所以什么是 MIME
MIME (Multipurpose Internet Mail Extensions)多用途互聯(lián)網(wǎng)郵件擴(kuò)展類(lèi)型, MIME 并沒(méi)有改動(dòng)或者取代 STMP ,它是繼續(xù)使用原來(lái)的郵件格式的情況下,增加了郵件主體的結(jié)構(gòu),并定義了傳送非 ASCII 碼的編碼規(guī)則。
意思就是,MIME 郵件可以在現(xiàn)有的電子郵件程序和協(xié)議下傳送。MIME 實(shí)際在用戶(hù)和 SMTP 之間的一層,將用戶(hù)輸入的非 ASCII 碼的內(nèi)容通過(guò)轉(zhuǎn)換為 ASCII 碼的內(nèi)容,讓 SMTP 協(xié)議得以接受,并利用 SMTP 協(xié)議對(duì)郵件進(jìn)行傳輸。收件人收到后,再通過(guò) MIME 協(xié)議對(duì) SMTP 協(xié)議的 ASCII 碼進(jìn)行解碼,呈現(xiàn)在用戶(hù)眼前的是正確的信息。
三、MIME 特點(diǎn)
MIME 主要包括以下三部分內(nèi)容:
- 5個(gè)新的郵件首部字段,加入到原來(lái)郵件的首部中;
- 定義了許多郵件內(nèi)容的格式,對(duì)多媒體電子郵件的表示方法進(jìn)行了標(biāo)準(zhǔn)化;
- 定義了傳送編碼,對(duì)任何格式內(nèi)容進(jìn)行轉(zhuǎn)換。
MIME 郵件首部
MIME 郵件首部是加入要原先 SMTP 郵件的首部字段。
MIME-Version
這個(gè)頭提供了所用MIME的版本號(hào)。這個(gè)值習(xí)慣上為1.0。
Content-Type
它定義了數(shù)據(jù)類(lèi)型和子類(lèi)型,類(lèi)型與子類(lèi)型用"/"分隔,以便數(shù)據(jù)能被適當(dāng)?shù)奶幚怼S行У念?lèi)型有:text,image,audio,video,applications,multipart和message。注意任何一個(gè)二進(jìn)制附件都應(yīng)該被叫做application/octet-stream。
Content-Transfer-Encoding
它定義了對(duì)數(shù)據(jù)所執(zhí)行的編碼方式,可以使用7bit,8bit,binary ,quoted-printable,base64和custom中的一種編碼方式。
Content-ID
郵件的唯一標(biāo)識(shí)符。
Content-Description
這是可讀字符串,說(shuō)明此郵件主體是否是圖像、音頻和視頻。
MIME 段部
MIME 段首部是出現(xiàn)在實(shí)際的 MIME 附件部分的首部,它只作用于該段中。除了 MIME-Version 字段,可以擁有以上任何頭字段。
四、內(nèi)容類(lèi)型
MIME 標(biāo)準(zhǔn)元先定義了7個(gè)基本內(nèi)容類(lèi)型和15種子類(lèi)型。但是允許客戶(hù)端和服務(wù)器之間定義專(zhuān)用的內(nèi)容類(lèi)型,但是為了避免名字沖突,專(zhuān)用類(lèi)型一般以 x-
開(kāi)始。
Content-Type | 子類(lèi)型 | 說(shuō)明 |
---|---|---|
text(文本) | plain, html, xml, css | 不同格式的文本 |
image(圖像) | gif, jpeg, tiff | 不同格式的靜止圖像 |
audio(音頻) | basic, mpeg, mp4 | 可聽(tīng)見(jiàn)的聲音 |
video(視頻) | mpeg, mp4, quicktime | 不同格式的影片 |
model(模型) | vrml | 3D 模型 |
application(應(yīng)用) | octet-stream, pdf, javascript, zip | 不同應(yīng)用程式產(chǎn)生的數(shù)據(jù) |
message(報(bào)文) | http, rfc822 | 封裝的報(bào)文 |
multipart(多部分) | mixed, alternative, parallel, digest | 多種類(lèi)型的組合 |
著重理解一下 multipart
- mixed
允許單個(gè)報(bào)文含有多個(gè)相互獨(dú)立的子報(bào)文,每個(gè)子報(bào)文擁有自己的類(lèi)型和編碼。在 mixed 后面用到 boundary=BOUNDARY
關(guān)鍵字,定義分隔各部分子報(bào)文的分隔符,在郵件用利用 --BOUNDARY
進(jìn)行分隔。
From:"hello" <hello@xxx.com>
To:<world@xxx.com>
Subject:hello world
Date:Mon,9 Oct 2006 16:51:34 +0800
MIME-Version:1.0
Content-Type:multipart/mixed;boundary=lines
--lines
Hello world
-lines
Content-Type:image/gif
Content-Transfer-Encoding: base64
... images ...
--lines
- alternative
允許單個(gè)報(bào)文含有同一數(shù)據(jù)的多種表示。例如對(duì)于同一個(gè)文本,可以用不同的編碼形式,客戶(hù)端根據(jù)自己實(shí)際選擇格式化的形式。
- parallel
允許單個(gè)報(bào)文含有可同時(shí)顯示的各個(gè)子部分,例如圖片和聲音子部分必須一起播放。
- digest
允許單個(gè)報(bào)文含有一組其他報(bào)文。
五、編碼
Content-Transfer-Encoding: [mechanism]
其中,mechanism的值可以指定為“7bit”,“8bit”,“binary”,“quoted-printable”,“base64”。