POP3协议类收取邮件

此测试代码需要到服务器邮箱开通pop协议,获取客户端授权密码(详见163内部获取):

<?php//此处查看链接状态header("Content-type:text/html;charset=utf-8");var_dump(fsockopen('tls://pop.163.com',995,$error,$errorstr,8));print_r($error);$host="tls://pop.163.com"; //‘tls://’为ssl协议加密,端口走加密端口$user="XXXXXX@163.com"; //邮箱$pass="password"; //密码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(); // 邮件体的内容,数组; function pop3($server="192.100.100.1",$port=110,$time_out=5){$this->hostname=$server;$this->port=$port;$this->timeout=$time_out;return true;}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; } } 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){$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;}elsereturn 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{ 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")){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<0) $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"; } }}//参数1:为链接地址,参数2:为端口号,参数3为过载时间
$rec=new pop3($host,995,2); if (!$rec->open()) die($rec->err_str); echo "open "; if (!$rec->login($user,$pass)) die($rec->err_str); echo "login"; 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(1);echo "邮件头的内容:<br>"; for ($i=0;$i<count($rec->head);$i++) echo htmlspecialchars($rec->head[$i])."<br>\n"; echo "邮件正文 :<BR>"; for ($i=0;$i<count($rec->body);$i++) echo htmlspecialchars($rec->body[$i])."<br>\n"; } $rec->close();?>

PHP使用POP3协议类收取邮件相关推荐

  1. java smtp.126.com_Java Mail---SMTP、POP3协议-DOS下手动收发邮件演示过程

    转载请注明出处: http://blog.csdn.net/qq_26525215 本文源自 E-Mail协议简介: 邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器我接收邮件的服务器. 发送 ...

  2. SMTP协议及POP3协议-邮件发送和接收原理(转)

    本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...

  3. java smtp pop3_手工体验smtp和pop3协议 邮件实现详解(二)

    上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍.我们知道电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行传递必须 ...

  4. java pop3 接收邮件_JavaMail使用POP3协议接收并解析电子邮件

    JavaMail使用POP3协议接收并解析电子邮件 代码片段:public static void main(String[] args) throws Exception { receive(); ...

  5. SMTP 和 POP3 协议的区别和联系

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol 3)是两种常用的电子邮件协议,用于发送和接收电子邮件.虽然它们都涉及到电子邮 ...

  6. PHP+socket+SMTP、POP3协议发送、接收邮件

    1.实现SMTP协议的类dsmtp.cls.php: <?php            // 通过socket实现SMTP协议的功能 // version: 1.1 // author : DC ...

  7. Python学习笔记:电子邮件,POP3收取邮件

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. POP3协议命令原始码及工作原理-PHP教程,邮件处理

    一 简介: 1. pop适用于c/s结构的脱机模型的电子邮件协议,目前已发展到第三版,称pop3.脱机模型即不能在线 操作,不像imap4(netscape支持imap4) 2. 当客户机与服务器连接 ...

  9. python学习——POP3收取邮件

    SMTP用于发送邮件,如果要收取邮件呢? 收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上.收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3. Python ...

最新文章

  1. Linux ifconfig指令
  2. 洛谷 P2286 [HNOI2004]宠物收养场
  3. 点云合并pcl重载“+”
  4. 微信php 客户端cookie,微信内置浏览器中的cookie很诡异呀
  5. Edge浏览器 安装 插件Adblock Plus失败
  6. CSS进阶(15)—— CSS世界的层叠规则(上)
  7. 时间片轮转调度算法详解
  8. python流程图-python如何画流程图
  9. 关于docker容器中,外网访问阿里云服务器中tomcat,报404错误的解决方法
  10. 电脑ps4,Windows电脑玩PS4游戏,索尼:先来升级Win10吧
  11. Mecanim动画系统学习笔记
  12. css-浮动布局与样式规则
  13. ToolGood.Words一款高性能敏感词(非法词/脏字)检测过滤组件,附带繁体简体互换,支持全角半角互换,汉字转拼音,模糊搜索等功能。
  14. 【微信小程序】获取用户信息
  15. 企业管理信息系统 Django-ERP
  16. 响应式卡片悬停效果 html+css
  17. FFmpeg封装格式处理:视音频复用器(muxer)不同格式中数据有无bsf的差异-- Filter bitstream_filter实现格式转换:h264_mp4toannexb
  18. {转}一位北京差生9年的北京生活
  19. 【程序员养成之路】Java基础篇 8-流进流出的IO流(二)
  20. 从物联网到元宇宙 京东方在创新中迸发“增长韧性”

热门文章

  1. java计算机毕业设计ssm“阳光”养老院管理系统
  2. 计算机鼠标不动了,电脑上鼠标不动了怎么解决 鼠标不动了怎么办解决方案
  3. 读懂这10个问题,你也能成为第三方支付行业专家!
  4. 虚拟信用卡一般用在什么场景?
  5. 调试mikrotik路由器中的程序
  6. 三星s6开机无显示无服务器,三星Galaxy S6手机不能开机怎么办?三星Galaxy S6手机不能开机解决办法...
  7. 软件项目管理课后习题《第一章》
  8. Python——制作小型游戏贪吃蛇
  9. 《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一3.2 计算机系统...
  10. 《Android安全攻防权威指南》(图灵社区)读后感