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

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

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

瀏覽:25日期:2023-12-28 16:10:21

實現 MIME 解碼的類

該類實現解碼的方法是 decode($head=null,$body=null,$content_num=-1),為了處理上的方便,要求輸入的是兩個字符數組,在我們的上篇中,所用到的POP類所收取得到的就是兩個這樣的數組,一個是郵件頭內容,一個是郵件的正文內容。限于篇幅,不對其做詳細的說明,其實現思想跟本文上篇中所介紹的POP類類似。請參考其中的注釋。

該類中用到了大量的正則表達式的操作,對此不熟悉的讀者,請參考正則表達式的有關資料。

class decode_mail{var $from_name;var $to_name;var $mail_time;var $from_mail;var $to_mail;var $reply_to;var $cc_to;var $subject;

// 解碼后的郵件頭部分的信息:var $body;

// 解碼后得到的正文數據,為一個數組。var $body_type; // 正文類型var $tem_num=0;var $get_content_num=0;var $body_temp=array();var $body_code_type;var $boundary;

// 以上是一些方法中用到的一些全局性的臨時變量,由于 PHP不能做到良好的封裝,所以只能放在這里定義var $err_str; // 錯誤信息var $debug=0; // 調試標記var $month_num=array('Jan'=>1,'Feb'=>2,'Mar'=>3,'Apr'=>4,'May'=>5,'Jun'=>6,'Jul'=>7,'Aug'=>8,'Sep'=>9,'Oct'=>10,'Nov'=>11,'Dec'=>12); // 把英文月份轉換成數字表示的月份

function decode($head=null,$body=null,$content_num=-1) // 調用的主方法,$head 與 $body 是兩個數組,$content_num 表示的是當正文有多個部分的時候,只取出指定部分的內容以提高效率,默認為 -1 ,表示解碼全部內容,如果解碼成功,該 方法返回 true{ if (!$head and !$body) { $this->err_str='沒有指定郵件的頭與內容!!'; return false; }if (gettype($head)=='array') { $have_decode=true; $this->decode_head($head); }if (gettype($body)=='array') { $this->get_content_num=$content_num; $this->body_temp=$body; $have_decode=true; $this->decode_body(); unset($this->body_temp); }if (!$have_decode) { $this->err_str='傳遞的參數不對,用法:new decode_mail(head,body) 兩個參數都是數組'; return false; }}function decode_head($head) // 郵件頭內容 的解碼,取出郵件頭中有意義的內容{ $i=0; $this->from_name=$this->to_name=$this->mail_time=$this->from_mail=$this-> to_mail=$this->reply_to=$this->cc_to=$this->subject=''; $this->body_type=$Sthis->boundary=$this->body_code_type=''; while ($head[$i]) { if (strpos($head[$i],'=?')) $head[$i]=$this->decode_mime($head[$i]);  //如果有編碼的內容,則進行解碼,解碼函數是上文所介紹的 decode_mime() $pos=strpos($head[$i],':'); $summ=substr($head[$i],0,$pos); $content=substr($head[$i],$pos+1);  //將郵件頭信息的標識與內容分開 if ($this->debug) echo $summ.':----:'.$content.'<BR>'; switch (strtoupper($summ)) { case 'FROM': // 發件人地址及姓名(可能沒有姓名,只有地址信息) if ($left_tag_pos=strpos($content,'<')) { $mail_lenth=strrpos($content,'>')-$left_tag_pos-1; $this->from_name=substr($content,0,$left_tag_pos); $this->from_mail=substr($content,$left_tag_pos+1,$mail_lenth); if (trim($this->from_name)=='') $this->from_name=$this->from_mail; else if (ereg('['|']([^'']+)['|']',$this->from_name,$reg)) $this->from_name=$reg[1]; } else { $this->from_name=$content; $this->from_mail=$content; //沒有發件人的郵件地址 } break; case 'TO': //收件人地址及姓名(可能 沒有姓名) if ($left_tag_pos=strpos($content,'<')) { $mail_lenth=strrpos($content,'>')-$left_tag_pos-1; $this->to_name=substr($content,0,$left_tag_pos); $this->to_mail=substr($content,$left_tag_pos+1,$mail_lenth); if (trim($this->to_name)=='') $this->to_name=$this->to_mail; else if (ereg('['|']([^'']+)['|']',$this->to_name,$reg)) $this->to_name=$reg[1]; } else { $this->to_name=$content; $this->to_mail=$content; //沒有分開收件人的郵件地址 } break;

case 'DATE' : //發送日期,為了處理方便,這里返回的是一個 Unix 時間戳,可以用 date('Y-m-d',$this->mail_time) 來得到一般格式的日期

$content=trim($content); $day=strtok($content,' '); $day=substr($day,0,strlen($day)-1); $date=strtok(' '); $month=$this->month_num[strtok(' ')]; $year=strtok(' '); $time=strtok(' '); $time=split(':',$time); $this->mail_time=mktime($time[0],$time[1],$time[2],$month,$date,$year); break; case 'SUBJECT':  //郵件主題 $this->subject=$content; break; case 'REPLY_TO': // 回復地址(可能沒有) if (ereg('<([^>]+)>',$content,$reg)) $this->reply_to=$reg[1]; else $this->reply_to=$content; break; case 'CONTENT-TYPE': // 整個郵件的 Content類型, eregi('([^;]*);',$content,$reg); $this->body_type=trim($reg[1]); if (eregi('multipart',$content)) // 如果是 multipart 類型,取得 分隔符 { while (!eregi('boundary='(.*)'',$head[$i],$reg) and $head[$i]) $i++; $this->boundary=$reg[1]; } else //對于一般的正文類型,直接取得其編碼方法 { while (!eregi('charset=['|'](.*)['|']',$head[$i],$reg)) $i++; $this->body_char_set=$reg[1]; while (!eregi('Content-Transfer-Encoding:(.*)',$head[$i],$reg)) $i++; $this->body_code_type=trim($reg[1]); } break; case 'CC': //抄送到。。 if (ereg('<([^>]+)>',$content,$reg)) $this->cc_to=$reg[1]; else $this->cc_to=$content; default: break; } // end switch $i++; } // end while if (trim($this->reply_to)=='')  //如果沒有指定回復地址,則回復地址為發送人地址 $this->reply_to=$this->from_mail;}// end function define

function decode_body() //正文的解碼,其中用到了不少郵件頭解碼所得來的信息{$i=0;if (!eregi('multipart',$this->body_type)) // 如果不是復合類型,可以直接解碼 { $tem_body=implode($this->body_temp,'rn'); switch (strtolower($this->body_code_type)) // body_code_type ,正文的編碼方式,由郵件頭信息中取得 {case 'base64': $tem_body=base64_decode($tem_body); break;

case 'quoted-printable': $tem_body=quoted_printable_decode($tem_body); break; ; }

$this->tem_num=0; $this->body=array(); $this->body[$this->tem_num][content_id]=''; $this->body[$this->tem_num][type]=$this->body_type; switch (strtolower($this->body_type))

{ case 'text/html': $this->body[$this->tem_num][name]='超文本正文'; break; case 'text/plain': $this->body[$this->tem_num][name]='文本正文'; break; default: $this->body[$this->tem_num][name]='未知正文'; } $this->body[$this->tem_num][size]=strlen($tem_body); $this->body[$this->tem_num][content]=$tem_body; unset($tem_body); } else // 如果是復合類型的 { $this->body=array(); $this->tem_num=0; $this->decode_mult($this->body_type,$this->boundary,0);//調用復合類型的解碼方法 }}

function decode_mult($type,$boundary,$begin_row) // 該方法用遞歸的方法實現 復合類型郵件正文的解碼,郵件源文件取自于 body_temp 數組,調用時給出該復合類型的類型、分隔符及 在 body_temp 數組中的開始指針

{$i=$begin_row;$lines=count($this->body_temp);while ($i<$lines) // 這是一個部分的結束標識; { while (!eregi($boundary,$this->body_temp[$i]))//找到一個開始標識 $i++; if (eregi($boundary.'--',$this->body_temp[$i])) { return $i; }

while (!eregi('Content-Type:([^;]*);',$this->body_temp[$i],$reg ) and $this->body_temp[$i]) $i++; $sub_type=trim($reg[1]); // 取得這一個部分的 類型是milt or text .... if (eregi('multipart',$sub_type))// 該子部分又是有多個部分的; { while (!eregi('boundary='([^']*)'',$this->body_temp[$i],$reg) and $this->body_temp[$i]) $i++; $sub_boundary=$reg[1];// 子部分的分隔符; $i++; $last_row=$this->decode_mult($sub_type,$sub_boundary,$i); $i=$last_row; } else { $comm=''; while (trim($this->body_temp[$i])!='') { if (strpos($this->body_temp[$i],'=?')) $this->body_temp[$i]=$this->decode_mime($this->body_temp[$i]); if (eregi('Content-Transfer-Encoding:(.*)',$this->body_temp[$i],$reg)) $code_type=strtolower(trim($reg[1])); // 編碼方式 $comm.=$this->body_temp[$i].'rn'; $i++; } // comm 是編碼的說明部分

if (eregi('name=[']([^']*)[']',$comm,$reg)) $name=$reg[1];

if (eregi('Content-Disposition:(.*);',$comm,$reg)) $disp=$reg[1];

if (eregi('charset=['|'](.*)['|']',$comm,$reg)) $char_set=$reg[1];

if (eregi('Content-ID:[ ]*<(.*)>',$comm,$reg)) // 圖片的標識符。 $content_id=$reg[1];

$this->body[$this->tem_num][type]=$sub_type; $this->body[$this->tem_num][content_id]=$content_id; $this->body[$this->tem_num][char_set]=$char_set; if ($name) $this->body[$this->tem_num][name]=$name; else switch (strtolower($sub_type)) { case 'text/html': $this->body[$this->tem_num][name]='超文本正文'; break;

case 'text/plain': $this->body[$this->tem_num][name]='文本正文'; break;

default: $this->body[$this->tem_num][name]='未知正文'; }   // 下一行開始取回正文 if ($this->get_content_num==-1 or $this->get_content_num==$this->tem_num) // 判斷這個部分是否是需要的。-1 表示全部 { $content=''; while (!ereg($boundary,$this->body_temp[$i])) { //$content[]=$this->body_temp[$i]; $content.=$this->body_temp[$i].'rn'; $i++; }

//$content=implode('rn',$content); switch ($code_type) { case 'base64': $content=base64_decode($content); break;

case 'quoted-printable': $content=str_replace('n','rn',quoted_printable_decode($content)); break; }

$this->body[$this->tem_num][size]=strlen($content); $this->body[$this->tem_num][content]=$content; } else { while (!ereg($boundary,$this->body_temp[$i])) $i++; } $this->tem_num++; } // end else} // end while;} // end function define

function decode_mime($string) {//decode_mime 已在上文中給出,這里略過。}} // end class define

在這里要特別說明一點的是html正文里所用圖片的解碼。發送html格式的正文時,都會碰到圖片如何傳送的問題。圖片在 html 文檔里是一個<img src='http://m.b3g6.com/bcjs/21103.html' >的標簽,關鍵是這個源文件從何來的。很多郵件的處理方法是用一個絕對的 url 標識,就是在郵件的html正文里用<img src= http://www.ccidnet.com/image/22.gif >之類的標簽,這樣,在閱讀郵件時,郵件閱讀器(通常是用內嵌的瀏覽器)會自動從網上下載圖片,但是如果郵件收下來之后,與 Internet 的連接斷了,圖片也就不能正常顯示。

所以更好的方法是把圖片放在郵件中一起發送出去。在 MIME 編碼里,描述圖片與正文的關系,除了上面所提到的multipart/related MIME頭信息之外,還用到了一個 Content-ID: 的屬性來使圖片與 html 正文之間建立關系。html 文檔中的圖片在編碼時,其MIME頭中加入一個 Content-ID:122223443556dsdf@ntsever 之類的屬性,122223443556dsdf@ntsever是一個唯一的標識,在 html 文檔里,<img>標簽被修改成<img src='cid: 122223443556dsdf@ntsever'>,在解碼的時候,實際上,還需要把 html 正文中的這些<img src>標簽進行修改,使之指向解碼后的圖片的具體路徑。但是考慮到具體的解碼程序中對圖片會有不同的處理,所以在這個解碼的類中,沒有對 hmtl 正文中的<img>標簽進行修改。所以在實際使用這個類時,對于有圖片的 html 正文,還需要一定的處理。正文中的圖片,可以用臨時文件來保存,也可以用數據庫來保存。

現在我們已經介紹了POP3 收取郵件并進行 MIME 解碼的原理。下面給出一個使用這兩個類的一段小程序:

<?include('pop3.inc.php');include('mime.inc.php');$host='pop.china.com';$user='boss_ch';$pass='mypassword';$rec=new pop3($host,110,2);$decoder=new decode_mail();

if (!$rec->open()) die($rec->err_str);

if (!$rec->login($user,$pass)) die($rec->err_str);

if (!$rec->stat()) die($rec->err_str);echo '共有'.$rec->messages.'封信件,共'.$rec->size.'字節大小<br>';

if ($rec->messages>0) { if (!$rec->listmail()) die($rec->err_str); echo '以下是信件內容:<br>'; for ($i=1;$i<=count($rec->mail_list);$i++) { echo '信件'.$rec->mail_list[$i][num].',大?。?.$rec->mail_list[$i][size].'<BR>'; $rec->getmail($rec->mail_list[$i][num]); $decoder->decode($rec->head,$rec->body); echo '<h3>郵件頭的內容:</h3><br>'; echo $decoder->from_name.'('.$decoder->from_mail.') 于'.date('Y-m-d H:i:s',$decoder->mail_time).' 發給'.$decoder->to_name.'('.$decoder->to_mail.')'; echo 'n<br>抄送:';

if ($decoder->cc_to) echo $decoder->cc_to;else echo '無'; echo 'n<br>主題:'.$decoder->subject;

echo 'n<br>回復到:'.$decoder->reply_to;   echo '<h3>郵件正文?。?lt;/h3><BR>'; echo '正文類型:'.$decoder->body_type; echo '<br>正文各內容:'; for ($j=0;$j<count($decoder->body);$j++) { echo 'n<br>類型:'.$decoder->body[$j][type]; echo 'n<br>名稱:'.$decoder->body[$j][name]; echo 'n<br>大小:'.$decoder->body[$j][size]; echo 'n<br>content_id:'.$decoder->body[$j][content_id]; echo 'n<br>正文字符集'.$decoder->body[$j][char_set]; echo '<pre>'; echo '正文內容:'.$decoder->body[$j][content]; echo '</pre>'; }$rec->dele($i); }}

$rec->close();?>

如有想要取得完整源代碼的朋友,請與本人聯系: boss_ch@netease.com

<全文完>

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久蜜桃av| 欧美a级一区二区| 中文一区一区三区免费在线观 | av不卡免费看| 国产综合欧美| 99精品综合| 黄色网一区二区| 国产精品三p一区二区| 日韩精品一区二区三区中文| 伊人精品视频| 亚洲在线国产日韩欧美| 欧美在线影院| 在线精品视频在线观看高清| 久久精品五月| 日韩va欧美va亚洲va久久| 水野朝阳av一区二区三区| 麻豆9191精品国产| 日韩中文字幕不卡| 欧美日韩一二三四| 国产精品av一区二区| 香蕉久久99| 欧美午夜不卡| 亚洲婷婷免费| 蜜桃精品在线| 欧美日韩国产传媒| 蜜桃久久av| 日韩欧美中文字幕在线视频| 日韩高清电影免费| 国产精品观看| 电影91久久久| 日韩在线二区| 日韩国产一区| 色欧美自拍视频| 精品一区二区三区在线观看视频| 国产精品丝袜在线播放| 另类综合日韩欧美亚洲| 欧美天堂视频| 国产精品嫩草99av在线| 亚欧洲精品视频在线观看| 日韩精品电影一区亚洲| 国产精品久久久免费| 国精品产品一区| 日韩一区二区中文| 亚洲免费黄色| 欧美日韩一区自拍| 色综合狠狠操| 午夜在线精品| 国产精品中文字幕亚洲欧美| 亚洲深深色噜噜狠狠爱网站| 欧美伊人影院| 高清久久精品| 亚洲精品一二三区区别| 蜜桃视频在线观看一区| 国产精品分类| 国产在线欧美| 日韩av不卡在线观看| 日韩av在线播放网址| 日韩午夜高潮| 麻豆一区二区99久久久久| 久久久久午夜电影| 日韩精品免费一区二区夜夜嗨| 精品国产三区在线| 久久久久蜜桃| 午夜性色一区二区三区免费视频| 麻豆精品视频在线| 亚洲经典在线| 黄色欧美在线| 亚洲一区av| 最近高清中文在线字幕在线观看1| 日韩精品第一区| 中文字幕日韩亚洲| 日韩欧美激情| 日韩理论片av| 亚洲精品一级二级| 日韩精品视频一区二区三区| 日韩免费福利视频| 日韩超碰人人爽人人做人人添| 精品国产亚洲一区二区在线观看| 日韩欧美二区| 国产午夜久久av| 一区二区自拍| 国产精品扒开腿做爽爽爽软件| 91久久中文| 国产传媒在线观看| 日韩1区2区日韩1区2区| 欧美.日韩.国产.一区.二区 | 一区二区日韩免费看| 日韩免费在线| 国产精品一区二区99| 99成人在线视频| 久久av资源| 国产精品久久亚洲不卡| 久久精品国产68国产精品亚洲| 欧美在线看片| 丝瓜av网站精品一区二区| 在线观看精品| 国产成人精品免费视| 日本免费在线视频不卡一不卡二| 欧美粗暴jizz性欧美20| 老司机免费视频一区二区| 在线观看视频免费一区二区三区| 免费高潮视频95在线观看网站| 日本欧美一区| 欧美在线综合| 日韩视频一区| 欧美午夜精品一区二区三区电影| 日韩精品成人在线观看| 丝袜美腿高跟呻吟高潮一区| 激情久久久久久久| 日韩黄色大片网站| 精品视频自拍| 欧美激情福利| 欧美在线看片| 亚洲精品亚洲人成在线观看| 亚洲婷婷丁香| 中文一区一区三区免费在线观 | 欧美日一区二区| 国产精品流白浆在线观看| 国产欧美日韩| 国产欧美精品| 欧美片网站免费| 石原莉奈在线亚洲二区| 成人av二区| 国产在线不卡| 激情视频一区二区三区| 亚洲最新无码中文字幕久久 | 欧美日韩国产免费观看| 亚洲高清久久| 国产一区亚洲| 亚洲在线免费| 男女男精品网站| 亚洲精品国产精品粉嫩| 蜜桃视频一区二区三区在线观看| 视频一区国产视频| 视频在线观看一区| 蜜桃tv一区二区三区| av高清不卡| 免费不卡中文字幕在线| 午夜国产欧美理论在线播放 | 精品美女在线视频| 国产一区一一区高清不卡| 成人国产精品一区二区免费麻豆| 国产一区二区三区日韩精品| 精品美女在线视频| 久久天堂av| 亚洲国产一区二区三区在线播放| 亚洲一级高清| 午夜亚洲精品| aa国产精品| 麻豆精品视频在线观看| 高清一区二区三区av| 久久久久一区| 久久国产精品毛片| 欧美精品国产白浆久久久久| 国产精品毛片久久久| 国产一区二区色噜噜| 电影天堂国产精品| 夜久久久久久| 日本伊人午夜精品| 日韩综合精品| 男人的天堂亚洲一区| 欧美精品福利| 天堂av在线| 欧美日韩国产探花| 日韩欧美中文字幕一区二区三区| 国产精品成人一区二区网站软件| 日韩美女一区二区三区在线观看| 夜夜精品视频| 国产精品115| 黄色av一区| 69堂免费精品视频在线播放| 狠狠久久伊人| 国产农村妇女精品一区二区| 日韩精选在线| 日韩一区二区三区免费播放| 亚洲天堂日韩在线| 久久在线免费| 欧美片第1页综合| 日韩精品永久网址| 一区二区精品| 肉色欧美久久久久久久免费看| 亚洲最新av| 国产网站在线| 日本强好片久久久久久aaa| 日韩欧美自拍| 欧美天堂一区二区| 五月婷婷亚洲| 欧美偷窥清纯综合图区| 日韩亚洲一区在线| 中文字幕成人| 亚洲欧美成人综合| 久久久久免费| 综合色一区二区| 天堂√中文最新版在线| 亚洲激情av| 国产 日韩 欧美 综合 一区| 亚洲精品精选| 久久精品国产www456c0m| 欧美亚洲自偷自偷| 在线亚洲成人|