應用層與 HTTP

多用途網際網路郵件延伸(MIME)

/ mime /

原始的電子郵件只能承載純英文文字——嚴格說是 7 位元的 ASCII 字母。沒有圖片、沒有 PDF、沒有中文字、也不能在訊息上附一首歌。MIME 就是那個巧妙的包裝,讓這一切都能穿過一個只為文字而建的系統。它的做法是把任何種類的二進位資料編碼成安全的文字字元,並標明它真正是什麼,於是一張照片能搭在純文字電子郵件裡,並在另一端被重組回一張照片。

MIME 做兩件事。第一,它用一個媒體類型(media type,也叫 MIME type)替內容貼標籤,寫成 type/subtype:text/plain、text/html、image/jpeg、application/pdf、application/json。這個標籤告訴接收方該如何解讀這些位元組——當文字顯示、當網頁渲染、或當 PDF 打開。第二,對於不是純文字的資料,MIME 把它編碼成 ASCII,最常用的是 Base64,用僅有的安全字母、數字與少數符號來表示任意位元組。一封電子郵件也可以是多部分(multipart)的——一則 multipart/mixed 訊息可以把比方說一段 text/plain 便箋加上一個 image/jpeg 附件捆在一起,每一部分各帶自己的類型標頭,以一個邊界標記(boundary)分隔。

MIME 的觸角遠遠超出電子郵件。完全相同的媒體類型系統,也替網頁上的內容貼標籤:HTTP 的「Content-Type: text/html」或「Content-Type: image/png」標頭就是一個 MIME 類型,告訴你的瀏覽器這些位元組是一個頁面、一張圖片,還是一個下載檔。所以 MIME 默默地撐起了兩件事:附件如何在電子郵件系統中存活,以及瀏覽器如何知道它剛收到了什麼。誠實的代價是體積:Base64 編碼會把二進位資料膨脹約三分之一,因為它得花額外的字元來保持文字安全——這是刻意以效率換取對舊有純文字基礎設施相容性的取捨。

你用電子郵件寄一張照片。你的郵件 App 組出一則 multipart/mixed 訊息:第一部分是 text/plain(「附上照片!」),第二部分是以 Base64 編碼的 image/jpeg(照片變成了一長串字母)。接收的 App 讀那些類型標籤,把 Base64 解碼回原本的位元組,於是同時把一段便箋和一張影像呈現給你。

MIME 替內容貼標籤(type/subtype)並把二進位編碼成文字,於是非文字也能熬過只容文字的通道。

MIME 類型是一個被宣告的標籤,而非經查證的事實——伺服器可以把實際是 HTML 的東西宣稱為 text/plain。瀏覽器過去會去猜(「MIME 嗅探」),引發了安全漏洞,所以如今它們被要求信任所宣告的類型。

又称
Multipurpose Internet Mail Extensionsmedia typecontent type多用途網際網路郵件延伸