首页/技术开发/内容

用PHP完成POP3邮件的解码(3)

技术开发2024-06-04 阅读()
\"]",$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,"\r\n");

   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]."\r\n";

   $i++;

   } // comm 是编码的说明部分

   if (eregi('name=[\"]([^\"]*)[\"]',$comm,$reg))

   $name=$reg[1];

   if (eregi("Content-Disposition:(.*);",$comm,$reg))

   $disp=$reg[1];

   if (eregi("charset=[\"(北联网教程,专业提供视频软件下载)

第1页  第2页  第3页  第4页  第5页  第6页  第7页  第8页  第9页 

……

相关阅读