当前位置: 首页 > news >正文

php实现邮箱验证

一、Introduction

需求是用户在注册时填写email,注册后,需要到邮箱验证后才能登陆。

二、实现

验证流程,注册成功后,为用户生成一个验证码;将验证码以连接方式发到用户邮箱;用户点击连接将验证码发回网站;网站验证这个验证码是否是为这个用户生成的验证码;帐号需要在24小时内验证,否则帐号失效。

1.        准备工作

需要添加phpMailer类来发邮件。下载phpMailer,然后解压到项目根目录下。

发邮件使用smtp协议,端口是25;收邮件,使用pop3协议,端口号是110。还需要一台邮件服务器。可以自己搭建,也可以使用第三方的。使用第三方的邮件服务器需要在第三方注册一个帐号。登陆开启smtp协议。

在config.php中配置邮箱相关的信息。

   'EMAIL' => array(

       'host' => 'smtp.163.com',

       'user' => 'youxiangzhanghao',

       'password' => 'password', //此处的密码为user邮箱在开启smtp时设置的授权密码。     

),

2.        创建用于发送邮件的公用方法

/**

 * 发送邮件的方法

 */

functionsendMail($to, $title, $content)

{

         require_once('./PHPMailer-5.2.14/class.smtp.php');

         require_once('./PHPMailer-5.2.14/class.phpmailer.php');

         $mail = new PHPMailer();

         //设置为发送邮件

         $mail->IsSMTP();

         //是否允许发送html代码为邮件内容

         $mail->IsHTML(true);

         $mail->CharSet = 'utf-8';

         //是否需要身份验证

         $mail->SMTPAuth = true;

         //邮件服务器的帐号信息

         $mailConfig = C('EMAIL');

         $mail->From =$mailConfig['user'].'@163.com';

         $mail->FromName =$mailConfig['user'];

         $mail->Host = $mailConfig['host'];

         $mail->Username = $mailConfig['user'];

         $mail->Password =$mailConfig['password'];

         //发邮件的端口号

         $mail->Port = 25;

         //收件人

         $mail->AddAddress($to);

         //邮件标题

         $mail->Subject = $title;

         //邮件内容

         $mail->Body = $content;

         return($mail->send());

}

在控制器的首页方法中测试

//测试发送邮件

var_dump(sendMail('haha@163.com','phptestemail', '<a href="http://www.phptest.com">hahahah</a>'));

3.        修改会员表,添加email字段和验证码字段

email  varchar(150)  not  null comment  '邮箱',

email_chkcode  char(32)  not  null default  ''  comment  '邮箱验证码',

email_chkcode_time  int  unsigned  not  null comment  '邮箱验证码生成时间',

key  email_chkcode(email_chkcode)

4.        修改注册,必须填email

修改注册表单,添加email字段;修改member模型,允许插入email字段,并增加email字段为email的验证规则。

5.        注册之前生成email验证码

在_before_insert()方法中

                   //生成email验证码

                   $data['email_chkcode']= md5(uniqid());

                   $data['email_chkcode_time']= time();

6.        注册之后将验证码发给用户邮箱

         /**

          * 注册后的钩子函数

          */

         protected function _after_insert($data,$option)

         {

                   $content = "欢迎注册,请点击以下完成验证:<p><a href='http://www.php2.com/eshop/index.php/Home/Member/email_chk/code/{$data['email_chkcode']}'>请点击</a></p>";

                   sendMail($data['email'],'php2网站邮箱验证', $content);

         }

7.        在member控制器添加方法完成验证

    /**

     * 完成邮箱验证方法

     */

    public function email_chk()

    {

        //接收验证码

        $code = I('get.code');

        //查询这个验证码是否有效

        $member = D('Admin/Member');

        $info = $member->field('id,email_chkcode_time')->where(array(

            'email_chkcode' => $code,

        ))->find();

        if($info)

        {

            if((time() -$info['email_chkcode_time']) > 86400)

            {

                //帐号过期,删除这个帐号

               $member->delete($info['id']);

                $this->error('验证码已过期,帐号已经删除,请重新注册', U('regist'));

                exit;

            }

            else

            {

                //验证通过,将验证码清空

                $member->where(array(

                    'id' => $info['id'],

               ))->setFielf('email_chkcode', '');

                $this->success('验证通过,请登陆', U('login'));

                exit;

            }

        }

        else

        {

            $this->error('参数错误', U('/'));

            exit;

        }

    }

8.        修改会员模型中的登陆方法

         //判断这个帐号是否通过验证码验证

         if(!empty($user['email_chkcode']))

         {

                   $this->error= '必须验证后才可以登陆';

                   returnfalse;

         }

9.        修改注册代码

如果一个帐号已经存在,但是过期没有验证,可以删除这个帐号。

添加注册时的表单验证,为username和email添加关于唯一性和注册验证码的验证。

         array('email','chk_un_email', 'email已经存在!', 1,'callback', 3),

         array('username','chk_un_user', '用户名已经存在!', 1,'callback', 3),

         //验证已经存在的邮箱是否通过验证

         public function chk_un_email()

         {

                   $email = I('post.email');

                   $username =I('post.username');

                   $hasEmail =$this->field('id,email_chkcode,email_chkcode_time')->where(array(

                            'email' =>$email,

                   ))->find();

                   if($hasEmail)

                   {

                            if(empty($hasEmail['email_chkcode']))

                            {

                                     returnfalse;

                            }

                            else

                            {

                                     if(time() -$hasEmail['email_chkcode_time'] > 86400)

                                     {

                                               $this->delete($hasEmail['id']);

                                               returntrue;

                                     }

                                     else

                                     {

                                               returnfalse;

                                     }

                            }

                   }

                   else

                   {

                            return true;

                   }

         }



         //验证已经存在的用户名是否通过验证

         public function chk_un_user()

         {

                   $username =I('post.username');

                   $hasUsername =$this->field('id,email_chkcode,email_chkcode_time')->where(array(

                            'username' =>$username,

                   ))->find();

                   if($hasUsername)

                   {

                            if(empty($hasUsername['email_chkcode']))

                            {

                                     returnfalse;

                            }

                            else

                            {

                                     if(time() -$hasUsername['email_chkcode_time'] > 86400)

                                     {

                                               $this->delete($hasUsername['id']);

                                               returntrue;

                                     }

                                     else

                                     {

                                               returnfalse;

                                     }

                            }

                   }

                   else

                   {

                            return true;

                   }

         }

10.    测试

 

相关文章:

  • php微信公众号开发
  • [one_demo_4]不使用第3个变量交换两个变量的值
  • [one_demo_5]命令行输入输出
  • [one_demo_6]逆置整数
  • [one_demo_7]求走到第50个台阶的走法多少种
  • [one_demo_8]十进制转二进制
  • [one_demo_9]判断数组是否递增
  • [one_demo_10]递归解决汉诺塔问题
  • [one_demo_11]二分查找法
  • [one_demo_12]递归打印*\n*.*.\n*..*..\n图形
  • c
  • network
  • 使用javadoc生成项目的帮助文档
  • [one_demo_13]ArrayList去除重复的元素
  • web项目发布到tomcat的两种方式
  • [deviceone开发]-do_Webview的基本示例
  • 【comparator, comparable】小总结
  • Android 控件背景颜色处理
  • Angular2开发踩坑系列-生产环境编译
  • Angular数据绑定机制
  • CSS 三角实现
  • css的样式优先级
  • export和import的用法总结
  • flask接收请求并推入栈
  • HTML中设置input等文本框为不可操作
  • iOS | NSProxy
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js中的正则表达式入门
  • log4j2输出到kafka
  • PHP面试之三:MySQL数据库
  • Python_OOP
  • React-flux杂记
  • springboot_database项目介绍
  • vue 个人积累(使用工具,组件)
  • vue2.0项目引入element-ui
  • 阿里云前端周刊 - 第 26 期
  • 精彩代码 vue.js
  • 老板让我十分钟上手nx-admin
  • 入门级的git使用指北
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 微信小程序填坑清单
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 中文输入法与React文本输入框的问题与解决方案
  • 【干货分享】dos命令大全
  • 仓管云——企业云erp功能有哪些?
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​linux启动进程的方式
  • ​插件化DPI在商用WIFI中的价值
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #QT(一种朴素的计算器实现方法)
  • #微信小程序:微信小程序常见的配置传旨