开源软件网
当前位置:文章首页 >> PHP Zend >> 用PHP实现POP3邮件的收取

用PHP实现POP3邮件的收取 (1)
2008-04-22 22:53:03  作者:佚名  来源:PHPCHINA  浏览次数:0  网友评论0  文字大小:【】【】【】 评分等级:5

POP协议简介

  本文简要说明了通过POP3协议收取邮件、MIME邮件的解码的原理;针对收取和MIME解码,提供了两个实用的PHP类,并提供了使用的样例。分为邮件收取、MIME解码两个部分。这里我们先向您介绍邮件的收取,解码部分会在以后的文章中为各位详细的介绍,敬请关注。

  现在Internet上最大的应用应该是非Email莫属了,我们每天都习惯于每天通过Email进行交流,各大网站也几乎都推出了自己的基于WEB的免费邮件系统。在本文里,笔者将介绍一些Email实现的一些原理。同时我们假设你对于PHP的编程有一定的基础,对于TCP/IP协议也有一定的了解。

POP 协议简介
  POP的全称是 Post Office Protoco ,即邮局协议,用于电子邮件的接收,现在常 用的是第三版 ,简称为 POP3。通过POP协议,客户机登录到服务器上后,可以对自己的邮件进行删除,或是下载到本地,下载后,电子邮件客户软件就可以在本地对邮件进行修改、删除等。另外一种用于接收信件的邮件是 IMAP 协议,现在发展很快,在本文中,我们暂不讨论。

  POP服务器一般使用的是TCP的110号端口,如果你用的是Foxmail的话,在其收邮件的时候,你可以看到其信息提示窗口有这么一些命令:

  “正在连接到 62.123.23.123:110";

  "USER BOSS_CH";

  "PASS..............";

  下面让我们来看一段 与 POP3 服务器对话的实录:

  telenet pop.china.com 110

  +OK AIMC POP service (mail2.china.com) is ready.

  USER boss_ch

  +OK Please enter password for user <boss_ch>.

  PASS ******

  +OK boss_ch has 1 messages (750 octets)

  STAT

  +OK 1 750

  LIST

  +OK 1 messages (750 octets)

  1 750

  RETR 1

  +OK 750 octets

  Received: from smtp2.ptt.js.cn([202.102.24.37]) by china.com(JetMail 2.5.3.0)

  with SMTP id jm4839cc4227; Sat, 23 Sep 2000 05:31:21 -0000

  Received: from chenjunqing ([61.155.120.6]) by smtp2.ptt.js.cn

  (Netscape Messaging Server 4.15) with SMTP id G1BRHJ03.V07 for

  <boss_ch@china.com>; Sat, 23 Sep 2000 13:34:31 +0800

  Date: Sat, 23 Sep 2000 13:34:18 +0800

  From: =?ISO-8859-1?Q?=B3=C2=BF=A1=C7=E5?= <Boss_ch@netease.com>

  To: boss_ch@china.com <boss_ch@china.com>

  Subject: =?ISO-8859-1?Q?=D3=CA=BC=FE=CA=BE=C0=FD?=

  X-mailer: FoxMail 3.1 [cn]

  Mime-Version: 1.0

  Content-Type: text/plain; charset="GB2312"

  Content-Transfer-Encoding: 8bit

  Message-ID: <G1BRHJ03.V07@smtp2.ptt.js.cn>

  您好!

    这是一个邮件的小示例

  QUIT

  +OK Pop server at <mail2.china.com> signing off.

  以下对几个常用的POP3命令作一个简单的介绍 :

  命令    参数    状态    描述

  ------------------------------------------

  USER    username  认可    此命令与下面的pass命令若成功,将导致状态转换

  PASS    password  认可

  APOP    Name,Digest 认可    Digest是MD5消息摘要

  ------------------------------------------

  STAT    None    处理    请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数

  UIDL    [Msg#]   处理    返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的

  LIST    [Msg#]   处理    返回邮件数量和每个邮件的大小

  RETR    [Msg#]   处理    返回由参数标识的邮件的全部文本

  DELE    [Msg#]   处理    服务器将由参数标识的邮件标记为删除,由quit命令执行

  RSET    None    处理    服务器将重置所有标记为删除的邮件,用于撤消DELE命令

  TOP    [Msg#]    处理    服务器将返回由参数标识的邮件前n行内容,n必须是正整数

  NOOP    None    处理    服务器返回一个肯定的响应,不做任何操作。

  ------------------------------------------

  QUIT    None    更新 退出
PHP实现POP3收取邮件的类

  现在让我们来用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;

   }

  }

  该方法不需要任何


本文引用地址:http://www.open-soft.com.cn/article/2008/0422/article_94.html

[1] [2] [3]
责任编辑:hauver

发表评论】 【加入收藏】 【告诉好友】 【打印本页】 【关闭窗口】 【返回顶部
相关评论 0条评论  发表/查看更多评论 
发表评论  【返回顶部】【关闭窗口】 
评分: 1 2 3 4 5

    
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
 
FleaPHP -- 中国人自己的... [2008-07-18]
[注意]PHP功能齐全的发送... [2008-04-22]
[推荐]如何用PHP发电子邮... [2008-04-22]
PHP+MYSQL动态网页编程纠... [2008-04-21]
[注意]Apache+PHP+MySQL详细配... [2008-04-21]
[推荐]Linux上安装Oracle、... [2008-04-21]
利用Yahoo! Search API开发... [2008-04-21]
[推荐]五种常见的 PHP 设... [2008-04-21]
[推荐]五种常见的 PHP 设... [2008-04-21]
FleaPHP -- 中国人自己的... [2008-04-12]