POP3协议分析邮箱自动激活用户

使用POP3协议分析邮箱自动激活用户

2015-03-28 Lover雪儿

前几天,我们实现了,用户PHP模拟邮件激活注册用户,

地址:http://www.cnblogs.com/lihaiyan/p/4359927.html ,但是有的时候,往往是需要注册用户自己手动的向服务器的邮箱进行发送一封邮件,然后服务器通过分析邮箱的发件人,从而匹配自动的激活用户账号。

上class.pop3.php 邮件发送人分析php源代码:

  1 <?php
  2
  3 //用户往[email protected]邮箱发一封邮件,
  4 //系统就会将此用户激活
  5 /*
  6 1.用PHP+POP3协议收取信件(PHP + SOCKER编程)
  7 2.收到信件,分析发件人,并激活该用户
  8 3.每隔几分钟,自动运行一次(linux下crontab做定时任务)
  9 */
 10 class pop3{
 11     const CRLF = "\r\n";    //确定换行符
 12     protected $host = ‘pop3.163.com‘;    //使用163
 13     protected $port = 110;    //端口号
 14
 15     protected $errno = -1;
 16     protected $errstr = ‘‘;
 17
 18     protected $user = ‘lihaiyan1063385677‘;
 19     protected $pass = ‘1063385677‘;
 20
 21     protected $fh = NULL;    //放置连接资源
 22     protected $conn = NULL;    //放置数据库的资源
 23
 24     public function __construct(){
 25         $this->conn();    //连接
 26         $this->login();    //登陆
 27     }
 28     //连接服务器
 29     public function conn(){
 30         //连上服务器,并会返回资源
 31         $this->fh = fsockopen($this->host,$this->port,$this->errno,$this->errstr);
 32         //var_dump($this->fh);
 33     }
 34     //发送用户名+密码 登陆
 35     public function login(){
 36         //发送  user lihaiyan1063385677
 37         fwrite($this->fh,‘user ‘.$this->user.self::CRLF);
 38         //读取一行返回信息,正确则返回 +OK
 39         if(substr($this->getLine(),0,3) != ‘+OK‘){
 40             throw new Exception(‘用户名不正确‘);    //扔出一个异常
 41         }
 42         //发送  pass 1063385677
 43         fwrite($this->fh,‘pass ‘.$this->pass.self::CRLF);
 44         //读取一行返回信息,正确则返回 +OK
 45         if(substr($this->getLine(),0,3) != ‘+OK‘){
 46             throw new Exception(‘密码不正确‘);    //扔出一个异常
 47         }
 48     }
 49     //读取内容,从资源中获取一行数据
 50     protected function getLine(){
 51         $temp = fgets($this->fh);
 52         //echo $temp;
 53         return $temp;
 54     }
 55     //查询邮件数量
 56     public function getCnt(){
 57         fwrite($this->fh,‘stat ‘.‘ ‘.self::CRLF);
 58         $temp = explode(" ",$this->getLine());
 59         //var_dump($temp);
 60         return $temp[1];
 61     }
 62     //查询出所有的邮件发信人
 63     public function getAll(){
 64         $sum = $this->getCnt();    //获取邮件总数量
 65         $post = array();    //发信人
 66
 67         for($i = 1; $i <= $sum; $i++){
 68             fwrite($this->fh,‘top ‘.$i.‘ 10‘.self::CRLF);
 69                 //每次读取一行,找到以From 开头的行,截取后面的邮箱地址
 70             while($row = fgets($this->fh)){
 71                 //echo $row,‘<br/>‘;
 72                 if(substr(strtolower($row),0,4) == ‘from‘){
 73                          //截取所有发件人账号
 74                     //$post[] = substr($row,5,strlen($row));
 75                     //echo strpos($row,‘<‘)," ",strpos($row,‘>‘)-10,‘<br/>‘;
 76                     $post[] = substr($row,strpos($row,‘<‘)+1,strpos($row,‘>‘)-strpos($row,‘<‘)-1);
 77                     break;
 78                 }
 79             }
 80         }
 81         return $post;
 82     }
 83     //获取数据库中为激活的用户的邮箱
 84     protected function get_no_active_mail(){
 85         //链接数据库
 86         $this->conn = mysql_connect(‘localhost‘,‘root‘,‘‘);
 87         mysql_query(‘use test‘,$this->conn);
 88         mysql_query(‘set names utf8‘,$this->conn);
 89
 90         $sql = "select email from mailuser where status = 0";
 91         $rs = mysql_query($sql,$this->conn);
 92         $rs = mysql_fetch_assoc($rs);    //取结果
 93         //print_r($rs);
 94         return $rs;
 95     }
 96
 97
 98     //激活发信人的用户
 99     public function activeUser(){
100         $post = $this->getAll();
101         echo "<B><h3>邮箱中所有的发件人:</h3></B><br/>";
102         print_r($post);
103         $rs = $this->get_no_active_mail();
104         echo "<br/><B><h3>未激活用户的邮箱:</h3></B><br/>";
105         print_r($rs);
106         if(!empty($rs))
107         foreach($rs as $v){
108             if(in_array($v,$post)){
109                 echo "<br/><B><h3>邮箱 ".$v." 的用户激活成功!</h3></B>";
110                 $sql = "update mailuser set status = 1 where status = 0 and email = ‘".$v."‘";
111                 mysql_query($sql,$this->conn);
112             }
113         }
114     }
115 }
116
117 $pop = new pop3();
118 try {
119 //    $pop->conn();    //连接
120 //    $pop->login();    //登陆
121 //    echo ‘你有‘,$pop->getCnt(),‘封邮件<br/>‘;
122 //    echo ‘发信人是:‘,print_r($pop->getAll()),‘<br/>‘;
123     $pop->activeUser();
124 }
125 catch(exception $e){
126     echo $e->getMessage(); //获取异常
127 }
128 ?>

class.pop3.php

上mail_create.php模拟账号激活php源代码:

 1 <?php
 2 /* 模拟创建用户+创建激活码+发送激活码邮件
 3  *邮箱用户表
 4     create table mailuser (
 5     uid int primary key auto_increment,
 6     uname char(20) not null default ‘‘,
 7     email char(35) not null default ‘‘,
 8     pass char(32) not null default ‘‘,
 9     status tinyint not null default 0
10 )engine myisam charset utf8;
11   邮箱激活码
12     create table activecode(
13     cid int primary key auto_increment,
14     uname char(20) not null default ‘‘,
15     code char(16) not null default ‘‘,
16     expire int not null default 0   //激活码过期时间
17 )engine myisam charset utf8;
18  */
19 /*    思路步骤:
20  *    1. 连接数据库
21  *    2. insert用户表
22  *    3. 随机生成激活码并insert activecode表
23  *    4. 把生成的激活码发送至注册邮件,用户激活
24  * */
25 //1.连接数据库
26 require(‘./conn.php‘);
27
28 //用户生成随机 激活码 字符串
29 $str = ‘abcdefghijkmnpqrstuvwxyzABCDEFGHJMNPQRSTUVWXYZ23456789‘;
30
31 $uname = substr(str_shuffle($str),0,8);  //生成8位的随机用户名
32 $email = "[email protected]";   //激活邮件发送地址
33
34
35 //2. 模拟注册用户
36 $sql = "insert into mailuser(uname,email) values(‘$uname‘,‘$email‘)";
37 mysql_query($sql,$conn);
38
39
40 //3. 生成激活码
41 $code = substr(str_shuffle($str),0,8);    //生成8位随机用户表
42 $expire = time() + 5*24*36;        //激活码5天内有效
43
44 $sql = "insert into activecode(uname,code,expire) value(‘$uname‘,‘$code‘,‘$expire‘)";
45 mysql_query($sql,$conn);
46
47
48 //4. 发送激活邮件,把激活码发送给用户
49 require(‘../PHPMailer_v5.1/class.phpmailer.php‘); //包含phpmailer
50
51 $phpmailer = new PHPMailer();
52 /*设置PHPMAILER发信用的方式
53  * 可以用win下的mail()来发送
54  * 可以用linux下sengmail ,gmail来发送
55  * 可以用smtp协议登录到某个账户上来发送
56  * */
57 $phpmailer->IsSMTP();
58 $phpmailer->Host = ‘smtp.163.com‘;    //设置smtp服务器
59 $phpmailer->SMTPAuth = true;        //SMTP服务器是否需要认证,要登录
60 $phpmailer->Port = 25;                //smtp端口
61 $phpmailer->Username = "lihaiyan1063385677";  //smtp服务器账号
62 $phpmailer->Password = "xxxx";          //smtp服务器密码
63
64 //信息设置完毕
65 //开始正式写信
66 $phpmailer->CharSet = "UTF-8";        //设置字符集
67 $phpmailer->From = "[email protected]";    //来自
68 $phpmailer->FromName = "LoverXueEr";        //姓名
69 $phpmailer->Subject = $uname . ‘,点击激活邮件‘;    //主题
70 //开始正式写邮件内容
71 $phpmailer->Body = "please click http://localhost/foruser/PHPMailer/mail/mail_active.php?code=$code to active the acount!!\nThank you!";
72
73 //添加收件人
74 $phpmailer->AddAddress("[email protected]", "Lover雪儿");
75
76 //发信
77 echo $phpmailer->send() ? "ok":"fail";
78
79
80 ?>

mail_create.php

1. 运行mail_create.php,成功的模拟注册用户,查看数据库,结果如图所示:

2.运行class.pop3.php,分析邮件的发送人,并且自动匹配激活用户,如下图所示:

3.模拟用户向服务器邮箱发送邮件

发送成功

4.再次运行class.pop3.php,激活成功后,用户status已经激活成功为1,如图所示:

时间: 03-27

POP3协议分析邮箱自动激活用户的相关文章

Yosemite上手动增加基于POP3协议的QQ邮箱账记

不知道是升级到Yosimite还是qq邮箱账户的问题,反正是创建邮箱账号时系统自动创建一个所谓的互联网账号.通过这种方式创建的账号少了一个以往的手动选择账号类型的步骤. 说起来,其实这也是一种进步,可惜的是不知道为什么,通过这种方式建立的邮箱账号在接收邮件时速度超慢,不知各位看官的体验是怎样的,反正老猿是非常的不爽拉. 老猿心中一动,突然想到,还不如使用老的POP3协议接收呢,预先下载到本地,再点击阅读的速度一定会比使用那该死的IMAP快不少. 于是乎,老猿便开始了疼苦的手动配置之旅,原因非它,

NetAnalyzer笔记 之 二. 简单的协议分析

[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 上篇我们回顾完了NetAnalyzer一些可有可无的历史,在本篇,我决定先不对NetAnalyzer做介绍,而是先要了解一些关于构建NetAnalyzer的基础知识,如系统中可以分析的一些网络协议,了解它们的分布方式,字段含义等.在了解了协议的基础上,开始对Winpcap进行一些介绍,在这过程中,学习配置Winpcap的开发环境,做一些简单的数据采集程序.第三部分着重介绍过滤表达式的一些基本语法结构.写下来则要

SMTP协议分析

SMTP协议分析 第1章.     SMTP概述 1.1.  SMTP在邮件通信中的位置 SMTP,即简单邮件传送协议,所相应RFC文档为RFC821.同http等多数应用层协议一样,它工作在C/S模式下,用来实现因特网上的邮件传送.SMTP在整个电子邮件通信中所处的位置如图 1所看到的. 图 1电子邮件的通信过程 能够看出,SMTP是用来将客户机上的邮件传送到server上.这里的客户机是指某次连接中的发送方,server是指对应的接收方.在解说发送邮件的整个通信过程前,先解释一以下几个术语.

Smtp协议与Pop3协议的简单实现

前言 本文主要介绍smtp与pop3协议的原理,后面会附上对其的简单封装与实现. smtp协议对应的RFC文档为:RFC821 smtp协议 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地.通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟.SMTP服务

OmniPeek 基础之协议分析

Ominpeek一款网络抓包工具,或者说网络协议分析工具.不是管是前端开发.后端开发或都测试人员.为了解数据是否正常的传递,经常会用到网络数据包拦截软件来进行分析. Ominpeek 与我们常用的HttpWatch.Fildder 略有不同.HttpWatch 是基于浏览器的插件,拦截HTTP的数据包,而Ominpeek是基于网卡底层扫描的.计算机与外界的交流必经过网卡,也就是说它能拿检测到一切经过网络的数据. Ominpeek 是由Wildpackets 公司研发的网络扫描维护工具,其提供了高

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

本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu.163等等他们都有自己的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. 电子邮箱(E

Pop3协议详解

POP3全称为Post Office Protocol version3,即邮局协议第3版.它被用户代理用来邮件服务器取得邮件.POP3采用的也是C/S通信 模型 用户从邮件服务器上接收邮件的典型通信过程如下. 1) 用户运行用户代理(如Foxmail, Outlook Express). 2) 用户代理(以下简称客户端)与邮件服务器(以下简称服务器端)的110端口建立TCP连 接. 3) 客户端向服务器端发出各种命令,来请求各种服务(如查询邮箱信息,下载某封邮件等). 4) 服务端解析用户的命

pop3协议的几种状态

研究邮件时关于Pop3协议的几种处理状态总结如下:1.基本操作 初始时,服务器通过侦听TCP端口110开始POP3服务.当客户主机需要使用服务时,它将与服务器主机建立TCP连接.当连接建立后,POP3发送确认消息.客户和POP3服务器相互(分别)交换命令和响应,这一过程一直要持续到连接终止. POP3命令由一个命令和一些参数组成.所有命令以一个CRLF对结束.命令和参数由可打印的ASCII字符组成,它们之间由空格间隔.命令一般是三到四个字母,每个参数却可达40个字符长. POP3响应由一个状态码

pop3协议auth指令总结

在使用Pop3协议时用到auth指令,现总结如下: AUTH机制[初始响应] 机制:标识SASL认证机制的字符串 初始响应:可选的初始客户端响应,如在[RFC4422]的第3节中定义.如果存在, 这个回应必须编码为Base64(在第4节中指定)[RFC4648]),或者仅由单个字符 "="组成,其中代表一个空初始响应. 限制: AUTH命令成功完成后,不再需要 AUTH命令在同一会话中被发出.在一个成功的AUTH命令完成后,服务器必须拒绝接下来所有带有-ERR回复的AUTH命令. AU