日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php实现邮箱验证

發(fā)布時(shí)間:2023/12/31 php 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php实现邮箱验证 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、Introduction

需求是用戶在注冊時(shí)填寫email,注冊后,需要到郵箱驗(yàn)證后才能登陸。

二、實(shí)現(xiàn)

驗(yàn)證流程,注冊成功后,為用戶生成一個(gè)驗(yàn)證碼;將驗(yàn)證碼以連接方式發(fā)到用戶郵箱;用戶點(diǎn)擊連接將驗(yàn)證碼發(fā)回網(wǎng)站;網(wǎng)站驗(yàn)證這個(gè)驗(yàn)證碼是否是為這個(gè)用戶生成的驗(yàn)證碼;帳號需要在24小時(shí)內(nèi)驗(yàn)證,否則帳號失效。

1.????????準(zhǔn)備工作

需要添加phpMailer類來發(fā)郵件。下載phpMailer,然后解壓到項(xiàng)目根目錄下。

發(fā)郵件使用smtp協(xié)議,端口是25;收郵件,使用pop3協(xié)議,端口號是110。還需要一臺郵件服務(wù)器。可以自己搭建,也可以使用第三方的。使用第三方的郵件服務(wù)器需要在第三方注冊一個(gè)帳號。登陸開啟smtp協(xié)議。

在config.php中配置郵箱相關(guān)的信息。

???'EMAIL' => array('host' => 'smtp.163.com','user' => 'youxiangzhanghao','password' => 'password', //此處的密碼為user郵箱在開啟smtp時(shí)設(shè)置的授權(quán)密碼。?????),

2.????????創(chuàng)建用于發(fā)送郵件的公用方法

/*** 發(fā)送郵件的方法*/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();//設(shè)置為發(fā)送郵件$mail->IsSMTP();//是否允許發(fā)送html代碼為郵件內(nèi)容$mail->IsHTML(true);$mail->CharSet = 'utf-8';//是否需要身份驗(yàn)證$mail->SMTPAuth = true;//郵件服務(wù)器的帳號信息$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'];//發(fā)郵件的端口號$mail->Port = 25;//收件人$mail->AddAddress($to);//郵件標(biāo)題$mail->Subject = $title;//郵件內(nèi)容$mail->Body = $content;return($mail->send());}

在控制器的首頁方法中測試

//測試發(fā)送郵件var_dump(sendMail('haha@163.com','phptestemail', '<a href="http://www.phptest.com">hahahah</a>'));

3.????????修改會員表,添加email字段和驗(yàn)證碼字段

email ?varchar(150) ?not ?null?comment ?'郵箱',email_chkcode ?char(32) ?not ?null?default ?'' ?comment ?'郵箱驗(yàn)證碼',email_chkcode_time ?int ?unsigned ?not ?null?comment ?'郵箱驗(yàn)證碼生成時(shí)間',key ?email_chkcode(email_chkcode)

4.????????修改注冊,必須填email

修改注冊表單,添加email字段;修改member模型,允許插入email字段,并增加email字段為email的驗(yàn)證規(guī)則。

5.????????注冊之前生成email驗(yàn)證碼

在_before_insert()方法中

?????????????????? //生成email驗(yàn)證碼$data['email_chkcode']= md5(uniqid());$data['email_chkcode_time']= time();

6.????????注冊之后將驗(yàn)證碼發(fā)給用戶郵箱

???????? /*** 注冊后的鉤子函數(shù)*/protected function _after_insert($data,$option){$content = "歡迎注冊,請點(diǎn)擊以下完成驗(yàn)證:<p><a href='http://www.php2.com/eshop/index.php/Home/Member/email_chk/code/{$data['email_chkcode']}'>請點(diǎn)擊</a></p>";sendMail($data['email'],'php2網(wǎng)站郵箱驗(yàn)證', $content);}

7.????????在member控制器添加方法完成驗(yàn)證

??? /*** 完成郵箱驗(yàn)證方法*/public function email_chk(){//接收驗(yàn)證碼$code = I('get.code');//查詢這個(gè)驗(yàn)證碼是否有效$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){//帳號過期,刪除這個(gè)帳號$member->delete($info['id']);$this->error('驗(yàn)證碼已過期,帳號已經(jīng)刪除,請重新注冊', U('regist'));exit;}else{//驗(yàn)證通過,將驗(yàn)證碼清空$member->where(array('id' => $info['id'],))->setFielf('email_chkcode', '');$this->success('驗(yàn)證通過,請登陸', U('login'));exit;}}else{$this->error('參數(shù)錯(cuò)誤', U('/'));exit;}}

8.????????修改會員模型中的登陸方法

???????? //判斷這個(gè)帳號是否通過驗(yàn)證碼驗(yàn)證if(!empty($user['email_chkcode'])){$this->error= '必須驗(yàn)證后才可以登陸';returnfalse;}

9.????????修改注冊代碼

如果一個(gè)帳號已經(jīng)存在,但是過期沒有驗(yàn)證,可以刪除這個(gè)帳號。

添加注冊時(shí)的表單驗(yàn)證,為username和email添加關(guān)于唯一性和注冊驗(yàn)證碼的驗(yàn)證。

???????? array('email','chk_un_email', 'email已經(jīng)存在!', 1,'callback', 3),

???????? array('username','chk_un_user', '用戶名已經(jīng)存在!', 1,'callback', 3),

???????? //驗(yàn)證已經(jīng)存在的郵箱是否通過驗(yàn)證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;}}//驗(yàn)證已經(jīng)存在的用戶名是否通過驗(yàn)證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.????測試

?

總結(jié)

以上是生活随笔為你收集整理的php实现邮箱验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。