日期:2011-02-01  浏览次数:20511 次

用PHP实现POP3收取邮件的类
(作者:陈俊清 2000年10月18日 11:56)

  现在让我们来用PHP实现一个通过POP3协议收取信件的类吧,这个类中所用到的一些sock操作的函数,不另做特殊说明,请参考php的有关资料。通过这个实例,相信你也会和我一样,感觉到PHP中对于sock操作的灵活、方便和功能的强大。

  首先,我们来说明一下这个类中需要用到的一些内部成员变量:(这些变量应该都是对外封闭的,可是由于php对类的成员变量没有private与publice之类的分别,只好就这么直接定义了。这是PHP的一个令人遗憾的地方。)

  

  1.成员变量说明

  class pop3

  {

      var $hostname=""; // POP主机名

      var $port=110; // 主机的POP3端口,一般是110号端口

   var $timeout=5;  // 连接主机的最大超时时间 

      var $connection=0; // 保存与主机的连接

      var $state="DISCONNECTED"; // 保存当前的状态 

      var $debug=0;  // 做为标识,是否在调试状态,是的话,输出调试信息

   var $err_str='';  // 如果出错,这里保存错误信息

   var $err_no;   //如果出错,这里保存错误号码

   var $resp; // 临时保存服务器的响应信息

   var $apop; // 指示需要使用加密方式进行密码验证,一般服务器不需要

   var $messages; // 邮件数

   var $size; //各邮件的总大小

   var $mail_list; // 一个数组,保存各个邮件的大小及其在邮件服务器上序号

  

   var $head=array(); // 邮件头的内容,数组

   var $body=array(); // 邮件体的内容,数组;

  

  2.当然,这其中的有些变量,仅通过这样一个简单的说明并不能完全了解如何使用,下面我就逐个来说明这个类实现中的一些主要方法:

  Function pop3($server="192.100.100.1",$port=110,$time_out=5)

  {$this->hostname=$server;

   $this->port=$port;

   $this->timeout=$time_out;

   return true;

  }

  熟悉面向对象编程的朋友一看就会知道,这是这个类的构造函数,在初始化这个类时,可以给出这几个最基本的参数:pop3服务器的地址,端口号,及连接服务器时的最大超时时间。一般来说,只需要给出POP3服务器的地址就行了。

  Function open()

  {

  if($this->hostname=="")

    {$this->err_str="无效的主机名!!";

   return false;

   }

  

  if ($this->debug) echo "正在打开 $this->hostname,$this->port,&$err_no, &$err_str, $this->timeout<BR>";

  if (!$this->connection=fsockopen($this->hostname,$this->port,&$err_no, &$err_str, $this->timeout))

   {

   $this->err_str="连接到POP服务器失败,错误信息:".$err_str."错误号:".$err_no;

   return false;

   }

   else

   {

   $this->getresp();

   if($this->debug)        

      $this->outdebug($this->resp);

   if (substr($this->resp,0,3)!="+OK")

   {$this->err_str="服务器返回无效的信息:".$this->resp."请检查POP服务器是否正确";

   return false;

   }

   $this->state="AUTHORIZATION";

   return true;

   }

  }

  该方法不需要任何参数就可建立与POP3服务器的sock连接。该方法又用到了另一个类中的方法$this->getresp();下面是这个方法的声明:

  Function getresp()

   {

   for($this->resp="";;)

     {

         if(feof($this->connection))

               return false;

           $this->resp.=fgets($this->connection,100);

           $length=strlen($this->resp);

           if($length>=2 && substr($this->resp,$length-2,2)=="\r\n")

           {

            $this->resp=strtok($this->resp,"\r\n");

   return true;

           }

          }

      }

  这个方法取得服务器端的返回信息并进行简单的处理:去掉最后的回车换行符,将返回信息保存在resp这个内部变量中。这个方法在后面的多个操作中都将用到。另外,还有个小方法也在后面的多个操作中用到:

  Function outdebug($message)

  {

   echo htmlspecialchars($message)."<br>\n";

  }

  它的作用就是把调试信息$message显示出来,并把一些特殊字符进行转换以及在行尾加上<br>标签,这样是为了使其输出的调试信息便于阅读和分析。

  建立起与服务器的sock连接之后,就要给服务器发送相关的命令了(请参见上面的与服务器对话的过程)从上面对 POP对话的分析可以看到,每次都是发送一条命令,然后服务器给予一定的回应,如果命令的执行是对的,回应一般是以+OK开头,后面是一些描述信息,所以,我们可以做一个通过发送命令的方法:

  Function command($command,$return_lenth=1,$return_code='+')

  {

   if ($this->connection==0)

   {

   $thi