日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

用PHP實現POP3郵件的解碼(二)

瀏覽:126日期:2023-12-28 14:16:56

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 就是用的 Base64 編碼。

另一種方法是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 表示的是用的 Base64 編碼。通過這段分析,我們來看一下這個 MIME 解碼的函數:(該函數由 PHPX.COM 站長 Sadly 提供,本人將其放入一個類中,并做了少量的修改,在此致謝)

function decode_mime($string) {

$pos = strpos($string, '=?');

if (!is_int($pos)) {

return $string;

}

$preceding = substr($string, 0, $pos); // save any preceding text

$search = substr($string, $pos+2); /* the mime header spec says this is the longest a single encoded word can be */

$d1 = strpos($search, '?');

if (!is_int($d1)) {

return $string;

}

$charset = substr($string, $pos+2, $d1); //取出字符集的定義部分

$search = substr($search, $d1+1); //字符集定義以后的部分=>$search;

$d2 = strpos($search, '?');

if (!is_int($d2)) {

return $string;

}

$encoding = substr($search, 0, $d2); ////兩個? 之間的部分編碼方式 :q 或 b 

$search = substr($search, $d2+1);

$end = strpos($search, '?='); //$d2+1 與 $end 之間是編碼了 的內容:=> $endcoded_text;

if (!is_int($end)) {

return $string;

}

$encoded_text = substr($search, 0, $end);

$rest = substr($string, (strlen($preceding . $charset . $encoding . $encoded_text)+6)); //+6 是前面去掉的 =????= 六個字符

switch ($encoding) {

case 'Q':

case 'q':

//$encoded_text = str_replace('_', '%20', $encoded_text);

//$encoded_text = str_replace('=', '%', $encoded_text);

//$decoded = urldecode($encoded_text);

$decoded=quoted_printable_decode($encoded_text);

if (strtolower($charset) == 'windows-1251') {

$decoded = convert_cyr_string($decoded, 'w', 'k');

}

break;

case 'B':

case 'b':

$decoded = base64_decode($encoded_text);

if (strtolower($charset) == 'windows-1251') {

$decoded = convert_cyr_string($decoded, 'w', 'k');

}

break;

default:

$decoded = '=?' . $charset . '?' . $encoding . '?' . $encoded_text . '?=';

break;

}

return $preceding . $decoded . $this->decode_mime($rest);

}

這個函數用了遞歸的方法來實現一段包含有如上的 Subject 段的字符的解碼。程序中已經加上了注釋。相信有點PHP 編程基礎的人都能夠看得明白。該函數也是調用的base64_decode()與quoted_printable_decode()兩個系統函數實現的解碼,但是需要對郵件源文件進行大量的字符串的分析。不過,PHP 的字符串操作可以算是所有語言里最為方便自由的。函數的最后return $preceding . $decoded . $this->decode_mime($rest); 實現遞歸解碼,因為這個函數實際上是放在后面要介紹的一個 MIME解碼的類中的,所以用了 $this->decode_mime($rest)這種形式的調用方法。

下面我們來看正文。這里關系到 MIME 的一些頭信息,我們先做一個簡單的介紹(如果讀者有興趣了解更多的內容,請參考 MIME 的官方文檔)。

MIME-Version: 1.0

表示使用的 MIME 的版本號,一般是1.0;

Content-Type: 定義了正文的類型,我們實際上是通過這個標識來知道正文內是什么類型的文件,比如:

text/plain 表示的是無格式的文本正文,text/html 表示的 Html 文檔,image/gif 表示的是 gif 格式的圖片等等。

在本文中特別要說明一下的是郵件中常用到的復合類型。multipart 類型表示正文是由多個部分組成的,后面的子類型說明的是這些部分之間的關系,郵件中用到的三個類型有,

multipart/alternative:表示正文由兩個部分組成,可以選擇其中的任意一個。主要作用是在征文同時有 text 格式和 html 格式時,可以在兩個正文中選擇一個來顯示,支持 html 格式的郵件客戶端軟件一般會顯示其 HTML 正文,而不支持的則會顯示其 Text 正文;

multipart/mixed :表示文檔的多個部分是混合的,指正文與附件的關系。如果郵件的 MIME 類型是

multipart/mixed,即表示郵件帶有附件;multipart/related :表示文檔的多個部分是相關的,一般用來描述 Html 正文與其相關的圖片。

這些復合類型又是可以嵌套使用的,比如說一個帶有附件的郵件,同時有 html 與 text 兩種格式的正文,則郵件的結構是:

Content-Type: multipart/mixed

部分一:

Content Type : multipart/alternative:

Text 正文;

Html 格式的正文 

部分二:

附件

郵件結束符;

由于復合類型由多個部分組成,因此,需要一個分隔符來分隔這多個部分,這就是上面的郵件源文件中的boundary='----=_NextPart_000_0007_01C03166.5B1E9510'所描述的,對于每一個Contect type :multipart/* 的內容,都會有這么一個說明,表示多個部分之間的分隔,這個分隔符是正文中不可能出現的一串古字符的組合,在文檔中,以 '--' 加上這個boundary 來表示一個部分的開始,在文檔的結束,以'--'加boundary再在最后加上 '--' 來表示文檔的結束。由于復合類型是可以嵌套使用的,因此,郵件中可能會多個 boundary 。

還有一個最重要的 MIME 頭標簽:

Content-Transfer-Encoding: base64 它表示了這個部分文檔的編碼方式,也就是我們上面所介紹的Base64或QP(Quote-Printable)。我們只有識別了這個說明,才能用正確的解碼方式實現對其解碼。

  限于篇幅,對于 MIME 的介紹就只說到這里。下面我將給出一個解碼MIME郵件的類,并對其做簡要說明。

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品久久91| 日本欧美在线| 婷婷成人在线| 国产美女一区| 婷婷成人av| 国产在线视频欧美一区| av一区二区高清| 日本视频在线一区| 91综合网人人| 日韩中文字幕av电影| 国产欧美日韩在线观看视频| 国产精品久久观看| 91精品电影| 日韩超碰人人爽人人做人人添| 日韩有码av| 精品午夜av| 99在线精品免费视频九九视| 奇米777国产一区国产二区| 美女国产一区二区三区| 91精品啪在线观看国产18| 亚洲三级在线| 亚洲啊v在线| 亚洲精品系列| 精品丝袜在线| 欧美日本精品| 久久中文字幕av一区二区不卡| 亚洲有吗中文字幕| 黄色欧美在线| 丝袜美腿高跟呻吟高潮一区| 精品视频免费| 在线国产日韩| 日韩成人三级| 久久精品超碰| 亚洲神马久久| 欧美国产小视频| 免费视频一区三区| 久久精品日韩欧美| 日韩中文字幕区一区有砖一区| 久久精品伊人| 免费一区二区视频| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美日韩a区| 精品视频一区二区三区在线观看 | 影视先锋久久| 欧美久久天堂| 久久精品国产999大香线蕉| 欧美一区网站| 中文字幕av亚洲精品一部二部| 亚洲国产福利| 精品国产aⅴ| 国产精品一区二区99| 亚洲精品大片| 亚欧成人精品| 亚洲午夜免费| 亚洲精品免费观看| 亚洲日韩视频| 亚洲精品伦理| 日韩精品视频中文字幕| 日韩一区中文| 欧美日韩国产一区二区在线观看| 日韩综合一区二区| 日本电影久久久| 日韩国产精品久久久久久亚洲| 一二三区精品| 中文字幕亚洲在线观看| 美女少妇全过程你懂的久久| 亚洲午夜久久久久久尤物 | 免播放器亚洲一区| 首页欧美精品中文字幕| 亚洲一区二区三区高清| 亚洲综合国产| 亚洲一区二区三区久久久| 亚洲深深色噜噜狠狠爱网站| 亚洲一区二区三区久久久| 在线日韩成人| 午夜电影一区| 国产欧美一级| 国产精品.xx视频.xxtv| 精品国产亚洲日本| 国产美女高潮在线| 日韩在线视频精品| 欧美~级网站不卡| 每日更新成人在线视频| 中文字幕乱码亚洲无线精品一区| 日韩三级一区| 国产精品入口久久| 国产一区二区三区四区二区| 福利一区在线| 久久国产中文字幕| 午夜久久美女| 免费在线欧美视频| 日韩av不卡一区二区| 国产精品亚洲人成在99www| 久久精品毛片| 免费一二一二在线视频| 欧美精品九九| 日韩国产欧美视频| 久久av网站| www.com.cn成人| 精品视频91| 国产精品日韩欧美一区| 美美哒免费高清在线观看视频一区二区| 精品一区欧美| 午夜欧美视频| 亚洲午夜免费| 欧美天堂一区| 国产欧美69| 久久精品xxxxx| 美女在线视频一区| 高清在线一区| 欧美日韩一二三四| 日韩一区二区免费看| 日韩中文字幕1| 日本亚洲视频| 国产精区一区二区| 国产在线视频欧美一区| 久久蜜桃资源一区二区老牛| 欧美日韩国产亚洲一区| 蜜臀久久久久久久| 欧美日韩中文| 国产精品一区二区三区av| 美女高潮久久久| 国产精品成人一区二区不卡| 久久精品在线| 老司机精品久久| 奇米色欧美一区二区三区| 一区二区日韩免费看| 亚洲一区有码| 给我免费播放日韩视频| 亚洲欧美日韩国产一区| 免费在线欧美黄色| 黄色欧美日韩| 精品中国亚洲| 免费欧美日韩| 福利在线免费视频| 一区二区国产在线观看| 91av亚洲| 亚洲一二av| 新版的欧美在线视频| 在线观看亚洲精品福利片| 国产精品久久观看| 综合欧美亚洲| 日本综合字幕| 国产视频网站一区二区三区| 欧美成人综合| 国产精品任我爽爆在线播放| 亚洲大全视频| 国产精品极品| 国产精品嫩草99av在线| 老牛国内精品亚洲成av人片| 日韩一级网站| 97精品国产福利一区二区三区| 日韩中文字幕av电影| 97精品一区二区| 青青青国产精品| 午夜久久免费观看| 福利一区在线| 欧美日韩99| 天使萌一区二区三区免费观看| 岛国av免费在线观看| 国产日产高清欧美一区二区三区| 午夜日韩在线| 日韩一区自拍| 国产精品va视频| 亚洲三级网站| 91久久中文| 日韩久久电影| 国产亚洲一卡2卡3卡4卡新区| 亚洲专区一区| 国产99精品| 国产66精品| 国产极品模特精品一二| 日韩黄色av| 蜜乳av另类精品一区二区| 99久久亚洲精品蜜臀| 国产成人1区| 美女尤物国产一区| 青草国产精品| 亚洲乱码一区| 老司机久久99久久精品播放免费| 久久精品官网| www.com.cn成人| 麻豆精品蜜桃视频网站| 三级欧美在线一区| 红桃视频国产一区| 久久夜夜操妹子| 成人av三级| 亚洲免费福利| 高清一区二区| 丁香婷婷久久| 欧美激情五月| 国产欧美一区二区三区米奇| 亚洲精品伊人| 一区二区不卡| 男人天堂欧美日韩| 国产精品日韩久久久| 99在线|亚洲一区二区| 精品日韩视频| 蜜桃成人精品| 亚洲二区在线|