首页/技术开发/内容

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

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

   $i++;

   }

   //$content=implode("\r\n",$content);

   switch ($code_type)

   {

   case "base64":

   $content=base64_decode($content);

   break;

   case "quoted-printable":

   $content=str_replace("\n","\r\n",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="" >的标签,关键是这个源文件从何来的。很多邮件的处理方法是用一个绝对的 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>邮件正文 :</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



<全文完>





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

……

相关阅读