用PHP實現POP3郵件的解碼(二)
來源:互聯網
上載者:User
MIME 編碼方式簡介
(作者:陳俊清 2000年10月24日 15:09)
MIME 編碼方式簡介
Subject: =?gb2312?B?xOO6w6Oh?=
這裡是郵件的主題,可是因為編碼了,我們看不出是什麼內容,其原來的文本是:“你好!”我們先看看 MIME 編碼的兩種方法。
對郵件進行編碼最初的原因是因為 Internet 上的很多網關不能正確傳輸8 bit 內碼的字元,比如漢字等。編碼的原理就是把 8 bit 的內容轉換成 7 bit 的形式以能正確傳輸,在接收方收到之後,再將其還原成 8 bit 的內容。
MIME 是“多用途網際郵件擴充協議”的縮寫,在 MIME 協議之前,郵件的編碼曾經有過 UUENCODE 等編碼方式 ,但是由於 MIME 協議演算法簡單,並且易於擴充,現在已經成為郵件編碼方式的主流,不僅是用來傳輸 8 bit 的字元,也可以用來傳送二進位的檔案 ,如郵件附件中的映像、音頻等資訊,而且擴充了很多基於MIME 的應用。從編碼方式來說,MIME 定義了兩種編碼方法Base64與QP(Quote-Printable) :
Base 64 是一種通用的方法,其原理很簡單,就是把三個Byte的資料用 4 個Byte表示,這樣,這四個Byte 中,實際用到的都只有前面6 bit,這樣就不存在只能傳輸 7bit 的字元的問題了。Base 64的縮寫一般是“B”,像這封信中的Subject 就是用的 Base 64 編碼。
另一種方法是QP(Quote-Printable) 方法,通常縮寫為“Q”方法,其原理是把一個 8 bit 的字元用兩個16進位數值表示,然後在前面加“=”。所以我們看到經過QP編碼後的檔案通常是這個樣子:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1。
在 PHP 裡,系統有兩個函數可以很方便地實現解碼:base64_decode()與quoted_printable_decode(),前者可用於base64 編碼的解碼,後者是用於 QP 編碼方法的解碼。
現在我們再來看看Subject: =?gb2312?B?xOO6w6Oh?= 這一主題的內容,這不是一段完整的編碼,只有部分是編碼了的,這個部分用 =? ?= 兩個標記括起來,=? 後面說明的是這段文字的字元集是 GB2312 ,然後一個 ? 後面的一個 B 表示的是用的 Base 64 編碼。通過這段分析,我們來看一下這個 MIME 解碼的函數:(該函數由 PHPX.COM 站長 Sadly 提供,本人將其放入一個類中,並做了少量的修改,在此致謝)
function decode_mime($string) {
$pos = strpos($string, '=?');
if (!is_int($pos)) {
return $string;
}