首页 > 后端开发 > PHP问题 > php实现邮箱验证

php实现邮箱验证

藏色散人
发布: 2023-03-06 10:58:01
原创
6523 人浏览过

php实现邮箱验证的方法:首先下载phpMailer;然后解压到项目根目录下;接着需要一台邮件服务器;最后在“config.php”中配置邮箱相关的信息并创建用于发送邮件的公用方法即可。

php实现邮箱验证

推荐:《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(&#39;haha@163.com&#39;,&#39;phptestemail&#39;, &#39;<a href="http://www.phptest.com">hahahah</a>&#39;));
登录后复制

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

email  varchar(150)  not  null comment  &#39;邮箱&#39;,

email_chkcode  char(32)  not  null default  &#39;&#39;  comment  &#39;邮箱验证码&#39;,

email_chkcode_time  int  unsigned  not  null comment  &#39;邮箱验证码生成时间&#39;,

key  email_chkcode(email_chkcode)
登录后复制

4.修改注册,必须填email

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

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

在_before_insert()方法中

                   //生成email验证码

                   $data[&#39;email_chkcode&#39;]= md5(uniqid());

                   $data[&#39;email_chkcode_time&#39;]= time();
登录后复制

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

         /**

          * 注册后的钩子函数

          */

         protected function _after_insert($data,$option)

         {

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

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

         }
登录后复制

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

    /**

     * 完成邮箱验证方法

     */

    public function email_chk()

    {

        //接收验证码

        $code = I(&#39;get.code&#39;);

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

        $member = D(&#39;Admin/Member&#39;);

        $info = $member->field(&#39;id,email_chkcode_time&#39;)->where(array(

            &#39;email_chkcode&#39; => $code,

        ))->find();

        if($info)

        {

            if((time() -$info[&#39;email_chkcode_time&#39;]) > 86400)

            {

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

               $member->delete($info[&#39;id&#39;]);

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

                exit;

            }

            else

            {

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

                $member->where(array(

                    &#39;id&#39; => $info[&#39;id&#39;],

               ))->setFielf(&#39;email_chkcode&#39;, &#39;&#39;);

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

                exit;

            }

        }

        else

        {

            $this->error(&#39;参数错误&#39;, U(&#39;/&#39;));

            exit;

        }

    }
登录后复制

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

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

         if(!empty($user[&#39;email_chkcode&#39;]))

         {

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

                   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(&#39;post.email&#39;);

                   $username =I(&#39;post.username&#39;);

                   $hasEmail =$this->field(&#39;id,email_chkcode,email_chkcode_time&#39;)->where(array(

                            &#39;email&#39; =>$email,

                   ))->find();

                   if($hasEmail)

                   {

                            if(empty($hasEmail[&#39;email_chkcode&#39;]))

                            {

                                     returnfalse;

                            }

                            else

                            {

                                     if(time() -$hasEmail[&#39;email_chkcode_time&#39;] > 86400)

                                     {

                                               $this->delete($hasEmail[&#39;id&#39;]);

                                               returntrue;

                                     }

                                     else

                                     {

                                               returnfalse;

                                     }

                            }

                   }

                   else

                   {

                            return true;

                   }

         }



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

         public function chk_un_user()

         {

                   $username =I(&#39;post.username&#39;);

                   $hasUsername =$this->field(&#39;id,email_chkcode,email_chkcode_time&#39;)->where(array(

                            &#39;username&#39; =>$username,

                   ))->find();

                   if($hasUsername)

                   {

                            if(empty($hasUsername[&#39;email_chkcode&#39;]))

                            {

                                     returnfalse;

                            }

                            else

                            {

                                     if(time() -$hasUsername[&#39;email_chkcode_time&#39;] > 86400)

                                     {

                                               $this->delete($hasUsername[&#39;id&#39;]);

                                               returntrue;

                                     }

                                     else

                                     {

                                               returnfalse;

                                     }

                            }

                   }

                   else

                   {

                            return true;

                   }

         }
登录后复制

10.    测试

以上是php实现邮箱验证的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
php
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板