Maison développement back-end tutoriel php 用PHP实现POP3邮件的收取(二)_PHP

用PHP实现POP3邮件的收取(二)_PHP

Jun 01, 2016 pm 12:37 PM
if return 实现 邮件

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

   }

  }


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

E-mails Outlook perdus du panneau de configuration dans Windows 11 E-mails Outlook perdus du panneau de configuration dans Windows 11 Feb 29, 2024 pm 03:16 PM

L'icône de messagerie Outlook est-elle absente du panneau de configuration de Windows 11 ? Cette situation inattendue a semé la confusion et l'inquiétude chez certaines personnes qui comptent sur OutlookMail pour leurs besoins de communication. Pourquoi mes e-mails Outlook n'apparaissent-ils pas dans le Panneau de configuration ? Il peut y avoir plusieurs raisons possibles pour lesquelles il n'y a pas d'icônes de messagerie Outlook dans le Panneau de configuration : Outlook n'est pas installé correctement. L'installation des applications Office à partir du Microsoft Store n'ajoute pas l'applet Mail au Panneau de configuration. L'emplacement du fichier mlcfg32.cpl dans le Panneau de configuration est manquant. Le chemin d'accès au fichier mlcfg32.cpl dans le registre est incorrect. Le système d'exploitation n'est actuellement pas configuré pour exécuter cette application

Comment mettre en œuvre la double connexion WeChat sur les téléphones mobiles Huawei ? Comment mettre en œuvre la double connexion WeChat sur les téléphones mobiles Huawei ? Mar 24, 2024 am 11:27 AM

Comment mettre en œuvre la double connexion WeChat sur les téléphones mobiles Huawei ? Avec l’essor des réseaux sociaux, WeChat est devenu l’un des outils de communication indispensables dans la vie quotidienne des gens. Cependant, de nombreuses personnes peuvent rencontrer un problème : se connecter à plusieurs comptes WeChat en même temps sur le même téléphone mobile. Pour les utilisateurs de téléphones mobiles Huawei, il n'est pas difficile d'obtenir une double connexion WeChat. Cet article explique comment obtenir une double connexion WeChat sur les téléphones mobiles Huawei. Tout d'abord, le système EMUI fourni avec les téléphones mobiles Huawei offre une fonction très pratique : l'ouverture d'une double application. Grâce à la fonction de double ouverture de l'application, les utilisateurs peuvent simultanément

Comment écrire if en langage C pour juger plusieurs conditions Comment écrire if en langage C pour juger plusieurs conditions Mar 25, 2024 pm 03:24 PM

En langage C, l'instruction if est généralement utilisée pour exécuter un bloc de code spécifique basé sur une seule condition. Cependant, plusieurs conditions peuvent être combinées pour effectuer une détermination à l'aide d'opérateurs logiques tels que &&, || et !. Y compris l'utilisation d'un ET logique (&&) pour juger plusieurs conditions, l'utilisation d'un OU logique (||) pour juger au moins une condition, l'utilisation d'un NON logique (!) pour juger de la négation d'une seule condition, ainsi que l'imbrication d'instructions if et l'utilisation de parenthèses. pour clarifier la priorité.

Le publipostage Word imprime une page blanche Le publipostage Word imprime une page blanche Feb 19, 2024 pm 04:51 PM

Si vous constatez que des pages vierges apparaissent lors de l'impression d'un document de publipostage à l'aide de Word, cet article vous aidera. Le publipostage est une fonctionnalité pratique qui vous permet de créer facilement des documents personnalisés et de les envoyer à plusieurs destinataires. Dans Microsoft Word, la fonctionnalité de fusion et publipostage est très appréciée car elle permet aux utilisateurs de gagner du temps en copiant manuellement le même contenu pour chaque destinataire. Afin d'imprimer le document de publipostage, vous pouvez accéder à l'onglet Mailings. Mais certains utilisateurs de Word ont signalé que lorsqu'ils essayaient d'imprimer un document de publipostage, l'imprimante imprimait une page vierge ou n'imprimait pas du tout. Cela peut être dû à un formatage ou à des paramètres d'imprimante incorrects. Essayez de vérifier les paramètres du document et de l'imprimante et assurez-vous de prévisualiser le document avant de l'imprimer pour vous assurer que le contenu est correct. si

Comment implémenter la fonction de clonage WeChat sur les téléphones mobiles Huawei Comment implémenter la fonction de clonage WeChat sur les téléphones mobiles Huawei Mar 24, 2024 pm 06:03 PM

Comment mettre en œuvre la fonction de clonage WeChat sur les téléphones mobiles Huawei Avec la popularité des logiciels sociaux et l'importance croissante accordée à la confidentialité et à la sécurité, la fonction de clonage WeChat est progressivement devenue le centre d'attention. La fonction de clonage WeChat peut aider les utilisateurs à se connecter simultanément à plusieurs comptes WeChat sur le même téléphone mobile, ce qui facilite la gestion et l'utilisation. Il n'est pas difficile de mettre en œuvre la fonction de clonage WeChat sur les téléphones mobiles Huawei. Il vous suffit de suivre les étapes suivantes. Étape 1 : Assurez-vous que la version du système de téléphonie mobile et la version de WeChat répondent aux exigences. Tout d'abord, assurez-vous que la version de votre système de téléphonie mobile Huawei a été mise à jour vers la dernière version, ainsi que l'application WeChat.

Guide de programmation PHP : méthodes pour implémenter la séquence de Fibonacci Guide de programmation PHP : méthodes pour implémenter la séquence de Fibonacci Mar 20, 2024 pm 04:54 PM

Le langage de programmation PHP est un outil puissant pour le développement Web, capable de prendre en charge une variété de logiques et d'algorithmes de programmation différents. Parmi eux, l’implémentation de la séquence de Fibonacci est un problème de programmation courant et classique. Dans cet article, nous présenterons comment utiliser le langage de programmation PHP pour implémenter la séquence de Fibonacci et joindrons des exemples de code spécifiques. La suite de Fibonacci est une suite mathématique définie comme suit : le premier et le deuxième élément de la suite valent 1, et à partir du troisième élément, la valeur de chaque élément est égale à la somme des deux éléments précédents. Les premiers éléments de la séquence

Découvrez comment Golang offre des possibilités de développement de jeux Découvrez comment Golang offre des possibilités de développement de jeux Mar 16, 2024 pm 12:57 PM

Dans le domaine actuel du développement logiciel, Golang (langage Go), en tant que langage de programmation efficace, concis et hautement simultané, est de plus en plus favorisé par les développeurs. Sa riche bibliothèque de normes et ses fonctionnalités de concurrence efficaces en font un choix de premier plan dans le domaine du développement de jeux. Cet article explorera comment utiliser Golang pour le développement de jeux et démontrera ses puissantes possibilités à travers des exemples de code spécifiques. 1. Avantages de Golang dans le développement de jeux. En tant que langage typé statiquement, Golang est utilisé dans la construction de systèmes de jeux à grande échelle.

Guide de mise en œuvre des exigences du jeu PHP Guide de mise en œuvre des exigences du jeu PHP Mar 11, 2024 am 08:45 AM

Guide d'implémentation des exigences du jeu PHP Avec la popularité et le développement d'Internet, le marché des jeux Web devient de plus en plus populaire. De nombreux développeurs espèrent utiliser le langage PHP pour développer leurs propres jeux Web, et la mise en œuvre des exigences du jeu constitue une étape clé. Cet article explique comment utiliser le langage PHP pour implémenter les exigences courantes du jeu et fournit des exemples de code spécifiques. 1. Créer des personnages de jeu Dans les jeux Web, les personnages de jeu sont un élément très important. Nous devons définir les attributs du personnage du jeu, tels que le nom, le niveau, la valeur de l'expérience, etc., et fournir des méthodes pour les exploiter.

See all articles