php实现邮箱验证

绝地灬酷狼 2022-06-01 02:45 360阅读 0赞

一、Introduction

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

二、实现

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

  1. 准备工作

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

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

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

  1. 'EMAIL' => array(
  2. 'host' => 'smtp.163.com',
  3. 'user' => 'youxiangzhanghao',
  4. 'password' => 'password', //此处的密码为user邮箱在开启smtp时设置的授权密码。
  5. ),
  1. 创建用于发送邮件的公用方法

    /**

    • 发送邮件的方法

    */

    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());

    }

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

  1. //测试发送邮件
  2. var_dump(sendMail('haha@163.com','phptestemail', '<a href="http://www.phptest.com">hahahah</a>'));
  1. 修改会员表,添加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)

  2. 修改注册,必须填email

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

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

在_before_insert()方法中

  1. //生成email验证码
  2. $data['email_chkcode']= md5(uniqid());
  3. $data['email_chkcode_time']= time();
  1. 注册之后将验证码发给用户邮箱

    /**

    1. * 注册后的钩子函数
    2. */

    protected function _after_insert($data,$option)

    {

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

    }

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

    /**

    • 完成邮箱验证方法

    */

    public function email_chk()

    {

    //接收验证码

    $code = I(‘get.code’);

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

    $member = D(‘Admin/Member’);

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

    1. 'email_chkcode' => $code,

    ))->find();

    if($info)

    {

    1. if((time() -$info['email_chkcode_time']) > 86400)
    2. {
    3. //帐号过期,删除这个帐号
    4. $member->delete($info['id']);
    5. $this->error('验证码已过期,帐号已经删除,请重新注册', U('regist'));
    6. exit;
    7. }
    8. else
    9. {
    10. //验证通过,将验证码清空
    11. $member->where(array(
    12. 'id' => $info['id'],
    13. ))->setFielf('email_chkcode', '');
    14. $this->success('验证通过,请登陆', U('login'));
    15. exit;
    16. }

    }

    else

    {

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

    }

    }

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

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

    if(!empty($user[‘email_chkcode’]))

    {

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

    }

  4. 修改注册代码

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

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

  1. array('email','chk\_un\_email', 'email已经存在!', 1,'callback', 3),
  2. array('username','chk\_un\_user', '用户名已经存在!', 1,'callback', 3),
  3. //验证已经存在的邮箱是否通过验证
  4. public function chk_un_email()
  5. {
  6. $email = I('post.email');
  7. $username =I('post.username');
  8. $hasEmail =$this->field('id,email_chkcode,email_chkcode_time')->where(array(
  9. 'email' =>$email,
  10. ))->find();
  11. if($hasEmail)
  12. {
  13. if(empty($hasEmail['email_chkcode']))
  14. {
  15. returnfalse;
  16. }
  17. else
  18. {
  19. if(time() -$hasEmail['email_chkcode_time'] > 86400)
  20. {
  21. $this->delete($hasEmail['id']);
  22. returntrue;
  23. }
  24. else
  25. {
  26. returnfalse;
  27. }
  28. }
  29. }
  30. else
  31. {
  32. return true;
  33. }
  34. }
  35. //验证已经存在的用户名是否通过验证
  36. public function chk_un_user()
  37. {
  38. $username =I('post.username');
  39. $hasUsername =$this->field('id,email_chkcode,email_chkcode_time')->where(array(
  40. 'username' =>$username,
  41. ))->find();
  42. if($hasUsername)
  43. {
  44. if(empty($hasUsername['email_chkcode']))
  45. {
  46. returnfalse;
  47. }
  48. else
  49. {
  50. if(time() -$hasUsername['email_chkcode_time'] > 86400)
  51. {
  52. $this->delete($hasUsername['id']);
  53. returntrue;
  54. }
  55. else
  56. {
  57. returnfalse;
  58. }
  59. }
  60. }
  61. else
  62. {
  63. return true;
  64. }
  65. }
  1. 测试

发表评论

表情:
评论列表 (有 0 条评论,360人围观)

还没有评论,来说两句吧...

相关阅读

    相关 php实现邮箱验证

    一、Introduction 需求是用户在注册时填写email,注册后,需要到邮箱验证后才能登陆。 二、实现 验证流程,注册成功后,为用户生成一个验证码;将验证码以连接方

    相关 邮箱验证码功能实现

    在进行实际项目的开发过程中,我们可能会遇到需要需要对用户账号密码进行找回,这时就需要我们通过邮件进行验证,从而对用户信息进行修改,下面我就将自己开发过程中的邮件发送功能简单描述