使用POP3协议分析邮箱自动激活用户
2015-03-28 Lover雪儿
前几天,我们实现了,用户PHP模拟邮件激活注册用户,
地址:http://www.cnblogs.com/lihaiyan/p/4359927.html ,但是有的时候,往往是需要注册用户自己手动的向服务器的邮箱进行发送一封邮件,然后服务器通过分析邮箱的发件人,从而匹配自动的激活用户账号。
上class.pop3.php 邮件发送人分析php源代码:
1 <?php 2 3 //用户往lihaiyan1063385677@163.com邮箱发一封邮件, 4 //系统就会将此用户激活 5 /* 6 1.用PHP+POP3协议收取信件(PHP + SOCKER编程) 7 2.收到信件,分析发件人,并激活该用户 8 3.每隔几分钟,自动运行一次(linux下crontab做定时任务) 9 */ 10 class pop3{ 11 const CRLF = " "; //确定换行符 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 ?>
上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 = "1063385677@qq.com"; //激活邮件发送地址 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 = "lihaiyan1063385677@163.com"; //来自 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!! Thank you!"; 72 73 //添加收件人 74 $phpmailer->AddAddress("1063385677@qq.com", "Lover雪儿"); 75 76 //发信 77 echo $phpmailer->send() ? "ok":"fail"; 78 79 80 ?>
1. 运行mail_create.php,成功的模拟注册用户,查看数据库,结果如图所示:
2.运行class.pop3.php,分析邮件的发送人,并且自动匹配激活用户,如下图所示:
3.模拟用户向服务器邮箱发送邮件
发送成功
4.再次运行class.pop3.php,激活成功后,用户status已经激活成功为1,如图所示: