视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php实现邮箱验证
2020-11-02 18:22:43 责编:小采
文档


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']) > 800)

 {

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

 $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'] > 800)

 {

 $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'] > 800)

 {

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

 returntrue;

 }

 else

 {

 returnfalse;

 }

 }

 }

 else

 {

 return true;

 }

 }

10. 测试

下载本文
显示全文
专题