电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

MIME 編碼方式簡介

Subject: =?gb2312?B?xOO6w6Oh?=

這里是郵件的主題,可是因為編碼了,我們看不出是什么內(nèi)容,其原來的文本是:“你好!”我們先看看 MIME 編碼的兩種方法。

對郵件進行編碼最初的原因是因為 Internet 上的很多網(wǎng)關(guān)不能正確傳輸8 bit 內(nèi)碼的字符,比如漢字等。編碼的原理就是把 8 bit 的內(nèi)容轉(zhuǎn)換成 7 bit 的形式以能正確傳輸,在接收方收到之后,再將其還原成 8 bit 的內(nèi)容。

MIME 是“多用途網(wǎng)際郵件擴充協(xié)議”的縮寫,在 MIME 協(xié)議之前,郵件的編碼曾經(jīng)有過 UUENCODE 等編碼方式 ,但是由于 MIME 協(xié)議算法簡單,并且易于擴展,現(xiàn)在已經(jīng)成為郵件編碼方式的主流,不僅是用來傳輸 8 bit 的字符,也可以用來傳送二進制的文件 ,如郵件附件中的圖像、音頻等信息,而且擴展了很多基于MIME 的應(yīng)用。從編碼方式來說,MIME 定義了兩種編碼方法Base64與QP(Quote-Printable) :

Base 64 是一種通用的方法,其原理很簡單,就是把三個Byte的數(shù)據(jù)用 4 個Byte表示,這樣,這四個Byte 中,實際用到的都只有前面6 bit,這樣就不存在只能傳輸 7bit 的字符的問題了。Base 64的縮寫一般是“B”,像這封信中的Subject 就是用的 Base64 編碼。

另一種方法是QP(Quote-Printable) 方法,通常縮寫為“Q”方法,其原理是把一個 8 bit 的字符用兩個16進制數(shù)值表示,然后在前面加“=”。所以我們看到經(jīng)過QP編碼后的文件通常是這個樣子:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1。

在 PHP 里,系統(tǒng)有兩個函數(shù)可以很方便地實現(xiàn)解碼:base64_decode()與quoted_printable_decode(),前者可用于base64 編碼的解碼,后者是用于 QP 編碼方法的解碼。

現(xiàn)在我們再來看看Subject: =?gb2312?B?xOO6w6Oh?= 這一主題的內(nèi)容,這不是一段完整的編碼,只有部分是編碼了的,這個部分用 =? ?= 兩個標(biāo)記括起來,=? 后面說明的是這段文字的字符集是 GB2312 ,然后一個 ? 后面的一個 B 表示的是用的 Base64 編碼。通過這段分析,我們來看一下這個 MIME 解碼的函數(shù):(該函數(shù)由 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 之間是編碼了 的內(nèi)容:=> $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);

}

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

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

MIME-Version: 1.0

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

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

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

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

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

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

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

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

Content-Type: multipart/mixed

部分一:

Content Type : multipart/alternative:

Text 正文;

Html 格式的正文 

部分二:

附件

郵件結(jié)束符;

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

還有一個最重要的 MIME 頭標(biāo)簽:

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

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

標(biāo)簽: PHP
主站蜘蛛池模板: 济南电缆桥架|山东桥架-济南航丰实业有限公司| 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 北京浩云律师事务所-企业法律顾问_破产清算等公司法律服务 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | 金属雕花板_厂家直销_价格低-山东慧诚建筑材料有限公司 | lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 阻垢剂,反渗透阻垢剂,缓蚀阻垢剂-山东普尼奥水处理科技有限公司 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | 智能案卷柜_卷宗柜_钥匙柜_文件流转柜_装备柜_浙江福源智能科技有限公司 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 散热器厂家_暖气片_米德尔顿散热器 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | hc22_hc22价格_hc22哈氏合金—东锜特殊钢 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 | 3A别墅漆/3A环保漆_广东美涂士建材股份有限公司【官网】 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 陕西鹏展科技有限公司| 示波器高压差分探头-国产电流探头厂家-南京桑润斯电子科技有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 |