快速业务通道

用PHP实现POP3邮件的解码(三)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22

实现 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,$

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号