• 技术文章 >后端开发 >PHP问题

    php实现邮箱验证

    藏色散人藏色散人2020-09-30 10:06:40原创1105

    php实现邮箱验证的方法:首先下载phpMailer;然后解压到项目根目录下;接着需要一台邮件服务器;最后在“config.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('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实现邮箱验证的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php
    上一篇:php header跳转页面需要注意什么 下一篇:typecho去掉index.php的方法
    大前端线上培训班

    相关文章推荐

    • PHP使用POP3读取邮箱接收邮件的实例解析• PHP演示如何发送邮件给某个邮箱• 如何判断用户输入的邮箱格式是否正确?• php如何隐藏部分邮箱

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网