search
HomeBackend DevelopmentPHP Tutorial用PHP实现POP3邮件的收取(二)_PHP

POP3

用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
";

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

  }

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

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

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

  {

   if ($this->connection==0)

   {

   $this->err_str="没有连接到任何服务器,请检查网络连接";

   return false;

   }

   if ($this->debug)

   $this->outdebug(">>> $command");

   if (!fputs($this->connection,"$command\r\n"))

   {

   $this->err_str="无法发送命令".$command;

   return false;

   }

   else

   {

   $this->getresp();

   if($this->debug)

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

   if (substr($this->resp,0,$return_lenth)!=$return_code)

   {

   $this->err_str=$command." 命令服务器返回无效:".$this->resp;

   return false;

   }

    else

   return true;

    }

  }

  这个方法可以接受三个参数: $command--> 发送给服务器的命令; $return_lenth,$return_code ,指定从服务器的返回中取多长的值做为命令返回的标识以及这个标识的正确值是什么。对于一般的pop操作来说,如果服务器的返回第一个字符为"+",则可以认为命令是正确执行了。也可以用前面提到过的三个字符"+OK"做为判断的标识。

  下面介绍的几个方法则可以按照前述收取信件的对话去理解,因为有关的内容已经在前面做了说明,因此下面的方法不做详细的说明,请参考其中的注释:

  Function Login($user,$password) //发送用户名及密码,登录到服务器

  {

  if($this->state!="AUTHORIZATION")

   {

   $this->err_str="还没有连接到服务器或状态不对";

   return false;

   }

  if (!$this->apop) //服务器是否采用APOP用户认证

   {

   if (!$this->command("USER $user",3,"+OK")) return false;

   if (!$this->command("PASS $password",3,"+OK")) return false;

   }

  else

   {

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

   if (!$this->command("APOP $user ".md5($this->greeting.$password),3,"+OK")) return false;

   }

  $this->state="TRANSACTION"; // 用户认证通过,进入传送模式

  return true;

  }

  

  Function stat() // 对应着stat命令,取得总的邮件数与总的大小

  {

  if($this->state!="TRANSACTION")

   {

   $this->err_str="还没有连接到服务器或没有成功登录";

   return false;

   }

  if (!$this->command("STAT",3,"+OK"))

   return false;

   else

   {

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

   $this->messages=strtok(" "); // 取得邮件总数

   $this->size=strtok(" "); //取得总的字节大小

   return true;

   }

  }

  Function listmail($mess=null,$uni_id=null) //对应的是LIST命令,取得每个邮件的大小及序号。一般来说用到的是List命令,如果指定了$uni_id ,则使用UIDL命令,返回的是每个邮件的标识符,事实上,这个标识符一般是没有什么用的。取得的各个邮件的大小返回到类的内部变量mail_list这个二维数组里。

  {

  if($this->state!="TRANSACTION")

   {

   $this->err_str="还没有连接到服务器或没有成功登录";

   return false;

   }

  if ($uni_id)

   $command="UIDL ";

   else

   $command="LIST ";

  if ($mess)

   $command.=$mess;

  

  if (!$this->command($command,3,"+OK"))

   {

   //echo $this->err_str;

   return false;

   }

   else

   {

   $i=0;

   $this->mail_list=array();

   $this->getresp();

   while ($this->resp!=".")

   { $i++;

   if ($this->debug)

   {

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

   }

   if ($uni_id)

   {

   $this->mail_list[$i][num]=strtok($this->resp," ");

   $this->mail_list[$i][size]=strtok(" ");

   }

   else

   {

   $this->mail_list[$i]["num"]=intval(strtok($this->resp," "));

   $this->mail_list[$i]["size"]=intval(strtok(" "));

   }

   $this->getresp();

   }

   return true;

   }

  }

  function getmail($num=1,$line=-1) // 取得邮件的内容,$num是邮件的序号,$line是指定共取得正文的多少行。有些时候,如邮件比较大而我们只想先查看邮件的主题时是必须指定行数的。默认值$line=-1,即取回所有的邮件内容,取得的内容存放到内部变量$head,$body两个数组里,数组里的每一个元素对应的是邮件源代码的一行。

  {

  if($this->state!="TRANSACTION")

   {

   $this->err_str="不能收取信件,还没有连接到服务器或没有成功登录";

   return false;

   }

  if ($line
   $command="RETR $num";

  else

   $command="TOP $num $line";

  

  if (!$this->command("$command",3,"+OK"))

   return false;

   else

   {

   $this->getresp();

   $is_head=true;

   while ($this->resp!=".") // . 号是邮件结束的标识

   {

   if ($this->debug)

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

   if (substr($this->resp,0,1)==".")

   $this->resp=substr($this->resp,1,strlen($this->resp)-1);

   if (trim($this->resp)=="") // 邮件头与正文部分的是一个空行

   $is_head=false;

   if ($is_head)

   $this->head[]=$this->resp;

   else

   $this->body[]=$this->resp;

   $this->getresp();

   }

   return true;

   }

  

  } // end function

  

  function dele($num) // 删除指定序号的邮件,$num 是服务器上的邮件序号

  {

   if($this->state!="TRANSACTION")

   {

   $this->err_str="不能删除远程信件,还没有连接到服务器或没有成功登录";

   return false;

   }

   if (!$num)

   {

   $this->err_str="删除的参数不对";

   return false;

   }

   if ($this->command("DELE $num ",3,"+OK"))

   return true;

   else

   return false;

  }

  通过以上几个方法,我们已经可以实现邮件的查看、收取、删除的操作,不过别忘了最后要退出,并关闭与服务器的连接,调用下面的这个方法:

  Function Close()

  {

  if($this->connection!=0)

   {

   if($this->state=="TRANSACTION")

   $this->command("QUIT",3,"+OK");

   fclose($this->connection);

     $this->connection=0;

   $this->state="DISCONNECTED";

   }

  }


Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
PHP异步发送邮件:避免长时间等待邮件发送完成。PHP异步发送邮件:避免长时间等待邮件发送完成。Sep 19, 2023 am 09:10 AM

PHP异步发送邮件:避免长时间等待邮件发送完成。导言:在Web开发中,发送邮件是常见的功能之一。但是,由于邮件发送需要与服务器进行通信,往往会导致用户在等待邮件发送完成的过程中出现长时间的等待。为了解决这个问题,我们可以使用PHP异步发送邮件的方式来优化用户体验。本文将介绍如何通过具体的代码示例实现PHP异步发送邮件,并避免长时间的等待。一、理解异步发送邮件

告别 Windows 11 中的远程邮件槽协议告别 Windows 11 中的远程邮件槽协议Apr 14, 2023 pm 10:28 PM

我们最近一直在谈论微软计划添加到其最新操作系统Windows11中的许多功能。但是,不要以为微软只会添加什么也不收回。事实上,这家软件巨头开始删除相当多的旧功能。在宣布计划在Windows12发布之前停用MSDT功能后,雷德蒙德开发人员带来了更多的坏消息。我们实际上是在谈论远程邮件槽旧版工具。当我们说您实际上想知道这一点时,请相信我们。Microsoft已开始在内部版本25314中弃用此功能我们相信您还记得,就在几天前,微软在其新的金丝雀频道发布了内部版本25314。上述版本包含许多新功能

如何修复 Outlook 电子邮件卡在发件箱问题如何修复 Outlook 电子邮件卡在发件箱问题May 01, 2023 am 10:01 AM

最近,许多用户报告了Outlook邮件卡在发件箱中的问题。即使多次尝试发送电子邮件,问题也没有得到解决。当您看到此问题并检查您的发件箱文件夹时,该消息将卡在那里。电子邮件卡在Outlook发件箱中的可能原因是:电子邮件中的附件超过了大小限制,这会减慢发送过程。邮件服务器的Outlook帐户身份验证问题Outlook或邮件服务器脱机Outlook中的发送/接收设置不正确。其他一些软件正在使用Outlook数据文件。防病毒软件会扫描传出的电子邮件。如果这个问题一直困扰着您并且您无法发送电子邮

公共预览版即将推出,其中包括 Windows 11 和 Windows 10 的最新 Outlook 应用。公共预览版即将推出,其中包括 Windows 11 和 Windows 10 的最新 Outlook 应用。May 09, 2023 am 08:07 AM

作为更新Windows11原生应用程序的一部分,微软计划发布新的Outlook。该应用程序是从头开始制作的,现在正在为预览版做准备,这可能会在微软的Windows11混合活动期间宣布。该项目被称为“ProjectMonarch”,这个新的Outlook已经开发了一年多。这是网络应用程序的重新启动,旨在统一所有现有的Windows电子邮件客户端,例如邮件和日历以及桌面版Outlook。通过OutlookOne,微软希望帮助用户跨不同的桌面平台管理他们的电子邮件。有很多方法可以访问

PHP邮件追踪功能:了解用户对邮件的行为和反馈。PHP邮件追踪功能:了解用户对邮件的行为和反馈。Sep 19, 2023 am 08:51 AM

PHP邮件追踪功能:了解用户对邮件的行为和反馈在现代社会中,电子邮件已经成为人们日常生活和工作中必不可少的一部分。对于企业来说,发送邮件是与客户进行沟通、推广产品或服务的重要方式之一。然而,一封邮件被发送出去后,我们如何知道它是否被收到、被读取,或者用户对邮件内容有何反应?这时,邮件追踪功能就显得尤为重要了。邮件追踪功能可以帮助我们了解用户对邮件的行为和反馈

PHP和PHPMAILER:如何实现邮件发送的自动过滤功能?PHP和PHPMAILER:如何实现邮件发送的自动过滤功能?Jul 21, 2023 am 09:25 AM

PHP和PHPMAILER:如何实现邮件发送的自动过滤功能?在现代社会中,电子邮件已成为人们交流的重要方式之一。然而,随着电子邮件的流行和广泛使用,垃圾邮件的数量也呈现出爆炸式增长的趋势。垃圾邮件不仅会浪费用户的时间和网络资源,还可能带来病毒和钓鱼行为。因此,在开发邮件发送功能时,加入自动过滤垃圾邮件的功能变得至关重要。本文将介绍如何使用PHP和PHPMai

如何在 iPhone 和 iPad 上的邮件应用中将 Gmail 设置为删除而不是存档如何在 iPhone 和 iPad 上的邮件应用中将 Gmail 设置为删除而不是存档Apr 13, 2023 pm 02:34 PM

您是否注意到,当您尝试在 iOS 上删除 Gmail 中的邮件时,您只会看到存档选项?继续阅读以了解如何在 iPhone 上删除 Gmail,而不是在邮件应用中存档。更改使用iPhone 和 iPad上的邮件应用程序归档 Gmail 电子邮件的默认选项的设置完全隐藏在设置中,但一旦你知道去哪里,它就可以快速更改。请记住,本教程适用于通过 iPhone 和 iPad 上的 Apple 邮件应用程序使用 Gmail 的用户。另一种选择是在 iPhone/iPad 上使用 Gmail 应用程序。您甚至

修复:Windows 11、10 中邮件和日历应用程序的错误代码 0x80070490修复:Windows 11、10 中邮件和日历应用程序的错误代码 0x80070490Apr 13, 2023 pm 09:13 PM

一些 Windows 用户在尝试将 Gmail 或任何其他电子邮件帐户添加到 Windows PC 上的邮件应用程序时报告了错误消息“出现问题,我们很抱歉,但我们无法做到这一点”以及错误代码0x80070490 在屏幕上。即使经过多次尝试,客户也无法将任何电子邮件帐户添加到他们的邮件应用程序中。用户非常不满意,并且不确定如何从这里转移。在邮件应用程序中添加电子邮件帐户时出现此错误的可能原因可能是系统数据文件损坏、邮件应用程序的一些内部问题、过时的邮件应用程序等。在分析了上述可能导致此错误的原因后

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.