Cd Chen's Services

ba ba ba la~~

電子郵件編碼的技術 – UUEncode 與 MIME 編碼

由於原始的電子郵件協定 (RFC-822),只允許傳送 7 Bit 的資料,也就是 ASCII 碼為 0 ~ 127 間的文字。對於使用英文字母的地區來說,是不會有太大問題;然而,在亞洲地區,尤其使用中文的台灣來說,這可是很大的一個問題 — 因為所有的中文字,不管是使用 Big5 或是萬國碼 (Unicode),都會使用 ASCII 128 ~ 255 間的高位元的文字!! 這會造成所有以中文撰寫的電子郵件,SMTP 伺服器將無法順利的傳送這些電子郵件。除了中文的電子郵件會造成問題外,這項限制也會造成無法讓電子郵件夾帶二進位的檔案,像是圖片、影音、程式、壓縮檔、…。

為了相容於舊的電子郵件系統,並解決上述的問題,人類在電子郵件系統中,發展出電子郵件編碼的技術,以便把中文或二進位檔案之類的 8 Bit 資料,順利轉換成為 7 Bit,如此才能讓電子郵件能順利的傳送這些文字與檔案。

目前常見的電子郵件編碼技術,包含:

UUEncode

UUEncode 全名為Unix-to-Unix Encode,最早是為了解決 UNIX 系統間資料傳輸的問題。尤其在傳送大型檔案時,UNIX 的使用者習慣使用 UUEncode 技巧,先將檔案轉換成為文字檔,再切割成若干等分,以透過 FTP 或 Email 傳送這些檔案。

使用 UUEncode 進行編碼時,會將編碼後的資料,以下列的格式儲存之:

begin PERM FILENAME
DATAS
end

其中的 PERM 為 Unix 上的權限;FILENAME 則是解碼時使用的檔案名稱;而 DATAS 則是編碼後的內容。每一行 DATAS 則以 M 字母作為開頭。

以下是我使用 Outlook Express,將一封夾帶 mypic.bmp 圖檔的信件,使用 UUEncode 編碼時產生的信件資料:

MIME

MIME 全名為 “多用途網際網路郵件擴展 (Multipurpose Internet Mail Extensions)”,定義於 RFC 2045 ~ 2049 中。設計 MIME 的目的,是為了取代 UUEncode。

UUEncode 有一個致命的缺點,由於 UUEncode 中使用的字元,在通過某些郵件閘道器 (尤其 ASCII 與 EBDIC 碼的閘道器) 時,會造成傳輸的障礙;另外還有一小部分的軟體無法對所有 UUEncode 演算法進行正確的解碼,而導致電子郵件閱讀上的困擾。因此,MIME 便被用來取代 UUEncode。

使用 MIME 編碼的電子郵件檔頭 (Header),都會儲存下列的屬性,代表這是一份 MIME 的郵件:

MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="ID"

其中的 ID 則是 MIME 文件的編號。電子郵件的內容 (Body) 則會標示下列一段文字:

This is a multi-part message in MIME format.

以下是某一封使用 MIME 編碼方法的電子郵件:

值得注意的是,MIME 本身僅定義文件的編碼格式,至於如何編碼,則透過其他編碼演算法實作之。目前 MIME 定義兩種編碼的方法:

QP – Quoted-Printable

使用 QP 編碼時,僅會將 8 bit 的字元進行編碼,遇到可以直接顯示的 7Bit 字元則會略過。因此QP 編碼通常用於轉換非 ASCII 字元集的文字資料。QP 進行編碼的程序非常簡單:

  1. 先檢查是否為 ASCII 字元?? 如果是,則略過第二步驟,繼續檢查下一個字元
  2. 如果是不是 ASCII 字元,則將轉換成為 =CODE 格式,CODE 為該字元的 16 進位數值。

例如,有一段 Big5 內碼的文字:”中文 (Chinese)”,使用 QP 編碼後則為 “=A4=A4=A4=E5 (Chinese)”,其中的 =A4=A4 便是 “中” 這個字的十六進位表示法;=A4=E5 則是 “文” 的 QP 編碼。

下列是一封使用 MIME-QP 編碼的電子郵件:

Base64

由於 QP 編碼僅會處理非 ASCII 內碼的文字資料,無法對所有內容進行編碼,以致於 QP 無法處理電子郵件中的附檔。為了解決這個問題,MIME 中又提供另外一個可以對所有內容進行編碼的技術 — Base64。

Base64 是把所有資料進行編碼,不分其是否為可以顯示的字元。Base64 執行會將輸入的資料轉換成為只包含 A~Z、a~z、0~9、+、/ 這 64 個字元符號,因此命名為 Base64。

Base64 係把讀進來的資料,每 6 Bit 為一單位,以此 6Bit 的值 (十進位為 0 ~ 63),轉換成為 A-Za-z0~9+/ 中相對應的字元。若輸入的資料不滿四個字元,則填上 “=” 符號。例如,”中文” 這兩個 Big5 的文字,透過 Base64 編碼,則會轉換成為 “pKSk5Q==”,而 “English” 這幾個字元,則轉成 “rV6k5Q==”。

以下是我在 Outlook Express 中使用 MIME-Base64 對 “中文 English” 這幾個文字編碼後所得的內容:

結論

在介紹了幾個與電子郵件編碼有關的詞彙後,相信您應可以在組態電子郵件系統時,能瞭解 UUEncode、MIME-QP、MIME-Base64 這幾個編碼技術的差異,並且可以在不同的場合,選擇使用適當的方法作為郵件編碼方法。

這篇內容的 Trackback 網址:

http://www.cdchen.idv.tw/trackback/52