PHP+jQuery 注冊模塊的改進(二):郵箱激活
$(function(){ //郵箱地址 function mailaddr(mail){ if(!mail.split("@")[1]){ alert("參數(shù)錯誤"); return false; } var mail = mail.split("@"); mail = mail[1].toLowerCase(); //與常用郵箱進行對比 if(mail == "qq.com" || mail == "vip.qq.com" || mail == "foxmail.com"){ return 'mail.qq.com'; }else if(mail == '163.com'){ return 'mail.163.com'; }else if(mail == 'vip.163.com'){ return 'vip.163.com'; }else if(mail == '126.com'){ return'mail.126.com'; }else if(mail == 'gmail.com'){ return'mail.google.com'; }else if(mail == 'sohu.com'){ return'mail.sohu.com'; }else if(mail == 'tom.com'){ return'mail.tom.com'; }else if(mail == 'vip.sina.com'){ return'vip.sina.com'; }else if(mail == 'sina.com.cn' || mail == 'sina.com'){ return'mail.sina.com.cn'; }else if(mail == 'tom.com'){ return'mail.tom.com'; }else if(mail == 'yahoo.com.cn' || mail == 'yahoo.cn'){ return'mail.cn.yahoo.com'; }else if(mail == 'tom.com'){ return'mail.tom.com'; }else if(mail == 'yeah.net'){ return'www.yeah.net'; }else if(mail == '21cn.com'){ return'mail.21cn.com'; }else if(mail == 'hotmail.com'){ return'www.hotmail.com'; }else if(mail == 'sogou.com'){ return'mail.sogou.com'; }else if(mail == '188.com'){ return'www.188.com'; }else if(mail == '139.com'){ return'mail.10086.cn'; }else if(mail == '189.cn'){ return'webmail15.189.cn/webmail'; }else if(mail == 'wo.com.cn'){ return'mail.wo.com.cn/smsmail'; }else if(mail == '139.com'){ return'mail.10086.cn'; }else{ return''; } } var uemailaddr = $("#mailaddr").text(); if(mailaddr(uemailaddr) == ""){ $("#maillogin").remove(); //控制樣式 $(".ftit2").css("top","110px"); $(".notice").css("bottom","-120px"); $("#mailaddr").click(function(){ return false; }); }else{ $("#mailaddr").attr("href","http://"+mailaddr(uemailaddr)); $("#maillogin a").attr("href","http://"+mailaddr(uemailaddr)); }})
2.給激活鏈接設置失效時間
關于設置失效時間的目的,我在網上看到有這幾種說法,第一是節(jié)省資源,過期的數(shù)據(jù)會被清除,這種說法我不認同,因為在過期之后,只是這一條激活連接不能使用,但是注冊用戶可以重新發(fā)送鏈接,所以用戶數(shù)據(jù)并沒有被清除;第二種說法是安全,即在較短時間內激活,可以避免用戶郵箱被盜引發(fā)的安全問題,對于這一點我也不認同,因為即使用戶郵箱被盜,還是可以重新發(fā)送激活鏈接,激活鏈接的地址仍然是在郵箱里面,所以和被盜不被盜沒有關系;我認為是,在一個較長的時間內,如果網站的注冊機制或者找回密碼機制發(fā)生了變化,失效時間可以在一定程度上避免很早之前的激活鏈接仍按照以前的機制而帶來激活錯誤或者找回密碼錯誤,此時用戶可以選擇重新生成最新的激活鏈接來保證注冊或者找回密碼的正確性,對網站來說更穩(wěn)定安全。
思路:
需要在數(shù)據(jù)庫中增加兩個字段,分別是表示用戶的注冊日期:regdate( int ),和激活鏈接是否有效的lockurl( tinyint )。
當用戶注冊成功時,把當前日期插入到表中的regdate字段;當用戶超過有效期沒有點擊激活鏈接,再次點擊激活鏈接時就把數(shù)據(jù)庫中的lock字段修改成1,當lock為1時,該鏈接失效,直到用戶重新生成注冊鏈接時更換activekey后,把lock值設為0,同時更新注冊時間,用戶才可以點擊新的鏈接發(fā)送郵件進行激活。
修改和新增的的文件有:
register_chk.php,注冊成功時把當前的時間戳插入表中;
activation.php中在update user表的active字段之前,先判斷是否超過有效期,如果超過,則active字段不變,同時lockurl字段設為1,此時給出提示:請重新激活并且跳轉至reactivation.php頁面;
reactivation.php接受參數(shù),如果參數(shù)正確,則顯示是重新收取激活鏈接還是返回注冊頁,如果參數(shù)錯誤則直接返回注冊頁;
當選擇重新收取激活鏈接,則跳轉至remail.php,如果參數(shù)正確,則更新注冊時間和activekey,然后重新發(fā)送郵件,郵件中的地址依然指向activation.php。如果參數(shù)錯誤,則跳轉回注冊頁。
其他修改之處:
1.把郵件代碼寫成郵件類
郵件注冊類mail.class.php:
<?php function postmail($auth,$port,$envelope,$password,$smtp,$postuemail,$subject,$mailbody){ //$smtp smtp郵件服務器地址 //$postuemail 用戶注冊郵件 //$subject 郵件主題 //$mailbody 郵件內容 $config = array( 'auth'=>$auth,//發(fā)件人 'port' =>$port,//端口 'username'=>$envelope,//發(fā)件郵箱 'password'=>$password //發(fā)件郵箱密碼 ); //實例化驗證的對象,使用gmail smtp服務器 $transport = new Zend_Mail_Transport_Smtp($smtp,$config); $mail = new Zend_Mail('utf-8'); $mail->addTo($postuemail,'獲取用戶注冊激活鏈接'); $mail->setFrom($envelope,$auth); $mail->setSubject($subject); $mail->setBodyHtml($mailbody); $mail->send($transport);}
2.用戶名注冊時區(qū)分大小寫,修改checkname.php
//用戶名區(qū)分大小寫$sql = "select uname from user where binary uname='".$uname."'";
流程圖:
需要注意的是,GET傳遞的參數(shù)也要進行轉義處理。
Js倒計時跳轉代碼 showTime.js:
var textBox = document.getElementById("textBox");var second = document.getElementById("second");var t = 4;function showTime(href){ t-=1; second.innerHTML = t; if(t==0){ textBox.innerHTML = "正在跳轉..."; self.location = href; } setTimeout("showTime(href)",1000);}
注冊并發(fā)送郵件代碼 register_chk.php:
<?php header("charst=utf-8"); include_once 'conn/conn.php'; include_once 'Zend/Mail/Transport/Smtp.php'; include_once 'Zend/Mail.php'; include_once 'mail.class.php'; //激活key,生成的隨機數(shù) $key = md5(rand()); //先寫入數(shù)據(jù)庫,再發(fā)郵件 //寫入數(shù)據(jù)庫 //判斷是否開啟magic_quotes_gpc if(get_magic_quotes_gpc()){ $postuname = $_POST['uname']; $postupwd = $_POST['upwd']; $postuemail = $_POST['uemail']; }else{ $postuname = addslashes($_POST['uname']); $postupwd = addslashes($_POST['upwd']); $postuemail = addslashes($_POST['uemail']); } function check_input($value){ // 如果不是數(shù)字則加引號 if (!is_numeric($value)){ $value = mysql_real_escape_string($value); } return $value; } $postuname = check_input($postuname); $postupwd = check_input($postupwd); $postuemail = check_input($postuemail); $sql = "insert into user(uname,upwd,uemail,activekey,regdate)values('".trim($postuname)."','".md5(trim($postupwd))."','".trim($postuemail)."','".$key."','".time()."')"; $num = $conne->uidRst($sql); if($num == 1){ //插入成功時發(fā)送郵件 //用戶激活鏈接 $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode(trim($postuname)).'&k='.$key;//file_put_contents("D:/mylog.log",$url." *********\r\n",FILE_APPEND); //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '換成郵箱的密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號'; $mailbody = '注冊成功,<a href="'.$url.'" target="_blank">請點擊此處激活帳號</a>'; postmail($auth,$port,$envelope,$password,$smtp,$postuemail,$subject,$mailbody); echo "<script>self.location=\"maillogin.php?m=".$postuemail."\";</script>"; }else{ //提示激活失敗并跳轉 echo "<div id=\"textBox\">激活失敗,請重新注冊,<span id=\"second\"></span> 秒鐘后跳轉至重新激活頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; }?>
激活。activation.php:
<?php session_start();header('Content-type:text/html;charset=utf-8');include_once 'conn/conn.php';$nowTime = time();$table = "user";if(!empty($_GET['name']) && !is_null($_GET['name']) && !empty($_GET['k']) && !is_null($_GET['k'])){ if(get_magic_quotes_gpc()){ $getname = stripslashes(urldecode($_GET['name'])); $k = stripslashes(urldecode($_GET['k'])); }else{ $getname = urldecode($_GET['name']); $k = urldecode($_GET['k']); } //urldecode反轉url中的中文編碼 $sql = "select * from ".$table." where uname='".$getname."' and activekey='".$k."'";file_put_contents("D:/mylog.log",$sql." ---\r\n",FILE_APPEND); $num = $conne->getRowsNum($sql); if($num>0){ $rs = $conne->getRowsRst($sql); //注冊時間 $rsRegdate = $rs['regdate']; //有效期2分鐘 if($nowTime > $rsRegdate+120){ //超過有效期 $upnum = $conne->uidRst("update ".$table." set lockurl = 1 where uname = '".$getname."' and activekey = '".$k."'"); if($upnum>0){ //提示激活失敗并跳轉 echo "<div id=\"textBox\">超過激活有效期,激活失敗,<span id=\"second\"></span> 秒鐘后跳轉至重新激活頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='reactivation.php?n=".urlencode($getname)."&k=".$k."';showTime(href);</script>"; }else{ //提示激活失敗并跳轉 echo "<div id=\"textBox\">激活失敗,請重新注冊,<span id=\"second\"></span> 秒鐘后跳轉至重新激活頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; } }else{ $upnum = $conne->uidRst("update ".$table." set active = 1 where uname = '".$getname."' and activekey = '".$k."'"); if($upnum>0){ $_SESSION['name'] = urldecode($getname); echo "<script>alert('您已成功激活');window.location.href='main.php';</script>"; }else{ echo "<script>alert('您已經激活過了');window.location.href='main.php';</script>"; } } }else{ //提示激活失敗并跳轉 echo "激活鏈接已失效,請重新發(fā)送激活鏈接或重新注冊"; echo "<script>window.setTimeout(\"self.location='register.php'\",3000);</script>"; }}?>
用戶選擇重新激活或返回注冊頁 reactivation.php:
<?phpheader("charst=utf-8");if(isset($_GET['n']) && $_GET['n']!="" && isset($_GET['k']) && $_GET['k']!=""){ //過濾處理 if(get_magic_quotes_gpc()){ $n = stripslashes(urldecode($_GET['n'])); $k = stripslashes(urldecode($_GET['k'])); }else{ $n = $_GET['n']; $k = $_GET['k']; } echo "<a href='remail.php?n=".urlencode($n)."&k=".urlencode($k)."'>重新收取激活郵件</a>"; echo "<a href='register.php'>返回注冊頁</a>";}else{ echo "<div id=\"textBox\">參數(shù)錯誤,請重新注冊,<span id=\"second\"></span> 秒鐘后跳轉至注冊頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>";}?>
重新發(fā)送郵件 remail.php:
<?phpheader("charst=utf-8");include_once 'conn/conn.php';include_once 'Zend/Mail/Transport/Smtp.php';include_once 'Zend/Mail.php';include_once 'mail.class.php';if(isset($_GET['n']) && $_GET['n']!="" && isset($_GET['k']) && $_GET['k']!=""){ //過濾處理 if(get_magic_quotes_gpc()){ $n = stripslashes(urldecode($_GET['n'])); $k = stripslashes(urldecode($_GET['k'])); }else{ $n = $_GET['n']; $k = $_GET['k']; } $table = "user"; //先查詢記錄 $sql = "select * from ".$table." where uname='".$n."' and activekey='".$k."'"; $rs = $conne->getRowsRst($sql); $rsuemail = $rs['uemail']; $num = $conne->getRowsNum($sql); if($num == 1){ $key = md5(rand()); //更新注冊時間 $nowTime = time(); //update activekey和lockurl $upnum = $conne->uidRst("update ".$table." set activekey = '".$key."' , lockurl=0,regdate = '".$nowTime."' where uname = '".$n."' and activekey = '".$k."'"); if($upnum == 1){ //插入成功時發(fā)送郵件 //用戶激活鏈接 $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode((trim($n))).'&k='.$key; //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '換成自己的郵箱密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號'; $mailbody = '注冊成功,<a href="'.$url.'" target="_blank">請點擊此處激活帳號</a>'; postmail($auth,$port,$envelope,$password,$smtp,$rsuemail,$subject,$mailbody); echo "<script>self.location=\"maillogin.php?m=".$rsuemail."\";</script>"; }else{ //提示激活失敗并跳轉 echo "<div id=\"textBox\">激活失敗,<span id=\"second\"></span> 秒鐘后跳轉至注冊頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; } }else{ //提示激活失敗并跳轉 echo "<div id=\"textBox\">12激活失敗,<span id=\"second\"></span> 秒鐘后跳轉至注冊頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; }}else{ echo "<div id=\"textBox\">參數(shù)錯誤,請重新注冊,<span id=\"second\"></span> 秒鐘后跳轉至注冊頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>";}?>
3.maillogin.php頁面重新發(fā)送激活鏈接
思路: 注冊頁register_chk.php和重新發(fā)送郵件的remail.php頁面在發(fā)送郵件以后跳至maillogin.php時,除了把email通過GET傳遞過去,再加上name和key,在maillogin.php頁面把接受到的后兩個參數(shù)接受到hidden的input里,通過jQuery的post方法請求remailajax.php重新發(fā)送郵件。發(fā)送成功以后通過jQuery設置定時器顯示文字通知用戶,4秒后自動消失。
如圖:
代碼:
register_chk.php:
<?php header("charst=utf-8"); include_once 'conn/conn.php'; include_once 'Zend/Mail/Transport/Smtp.php'; include_once 'Zend/Mail.php'; include_once 'mail.class.php'; //激活key,生成的隨機數(shù) $key = md5(rand()); //先寫入數(shù)據(jù)庫,再發(fā)郵件 //寫入數(shù)據(jù)庫 //判斷是否開啟magic_quotes_gpc if(get_magic_quotes_gpc()){ $postuname = trim($_POST['uname']); $postupwd = trim($_POST['upwd']); $postuemail = trim($_POST['uemail']); }else{ $postuname = addslashes(trim($_POST['uname'])); $postupwd = addslashes(trim($_POST['upwd'])); $postuemail = addslashes(trim($_POST['uemail'])); } function check_input($value){ // 如果不是數(shù)字則加引號 if (!is_numeric($value)){ $value = mysql_real_escape_string($value); } return $value; } $postuname = check_input($postuname); $postupwd = check_input($postupwd); $postuemail = check_input($postuemail); $sql = "insert into user(uname,upwd,uemail,activekey,regdate)values('".$postuname."','".md5($postupwd)."','".$postuemail."','".$key."','".time()."')"; $num = $conne->uidRst($sql); if($num == 1){ //插入成功時發(fā)送郵件 //用戶激活鏈接 $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode($postuname).'&k='.$key; //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '郵箱密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號'; $mailbody = '注冊成功,<a href="'.$url.'" target="_blank">請點擊此處激活帳號</a>'; postmail($auth,$port,$envelope,$password,$smtp,$postuemail,$subject,$mailbody); echo "<script>self.location=\"maillogin.php?m=".$postuemail."&n=".urlencode($postuname)."&k=".$key."\";</script>"; }else{ //提示激活失敗并跳轉 echo "<div id=\"textBox\">激活失敗,請重新注冊,<span id=\"second\"></span> 秒鐘后跳轉至重新激活頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; }?>
remail.php:
<?phpheader("charst=utf-8");include_once 'conn/conn.php';include_once 'Zend/Mail/Transport/Smtp.php';include_once 'Zend/Mail.php';include_once 'mail.class.php';if(isset($_GET['n']) && $_GET['n']!="" && isset($_GET['k']) && $_GET['k']!=""){ //過濾處理 if(get_magic_quotes_gpc()){ $n = stripslashes(urldecode($_GET['n'])); $k = stripslashes(urldecode($_GET['k'])); }else{ $n = $_GET['n']; $k = $_GET['k']; }file_put_contents("D:/mylog.log",$n." xxx\r\n",FILE_APPEND); $table = "user"; //先查詢記錄 //addslashes($n) 因為使用了mysql_real_escape_string,所以存儲在數(shù)據(jù)庫中的是帶轉義的字符串 $sql = "select * from ".$table." where uname='".$n."' and activekey='".$k."'"; $rs = $conne->getRowsRst($sql); $rsuemail = $rs['uemail'];file_put_contents("D:/mylog.log",$sql." xxx\r\n",FILE_APPEND); $num = $conne->getRowsNum($sql); if($num == 1){ $key = md5(rand()); //更新注冊時間 $nowTime = time(); //update activekey和lockurl $upnum = $conne->uidRst("update ".$table." set activekey = '".$key."' , lockurl=0,regdate = '".$nowTime."' where uname = '".$n."' and activekey = '".$k."'"); if($upnum == 1){ //插入成功時發(fā)送郵件 //用戶激活鏈接 $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode((trim($n))).'&k='.$key; //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '郵箱密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號'; $mailbody = '注冊成功,<a href="'.$url.'" target="_blank">請點擊此處激活帳號</a>'; postmail($auth,$port,$envelope,$password,$smtp,$rsuemail,$subject,$mailbody); echo "<script>self.location=\"maillogin.php?m=".$rsuemail."&n=".urlencode($n)."&k=".$key."\";</script>"; }else{ //提示激活失敗并跳轉 echo "<div id=\"textBox\">22激活失敗,<span id=\"second\"></span> 秒鐘后跳轉至注冊頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; } }else{ //提示激活失敗并跳轉 echo "<div id=\"textBox\">12激活失敗,<span id=\"second\"></span> 秒鐘后跳轉至注冊頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; }}else{ echo "<div id=\"textBox\">參數(shù)錯誤,請重新注冊,<span id=\"second\"></span> 秒鐘后跳轉至注冊頁...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>";}?>
maillogin.php:
<!DOCTYPE html><html><head><meta charset="utf-8"><title>注冊頁面</title><link href="templets/css/common.css" rel="stylesheet" type="text/css"><style>#container{ background-color:#fff; width:990px; height:547px; margin-top:50px; margin-bottom:20px; overflow:hidden;}#mailChk{ width:530px; margin:100px auto auto auto; position:relative;}.mailfonts{ margin-left:20px;}.mailpic{ float:left;}.mailfonts{ float:left;}.hfonts{ font-size:22px; }.ftit{ position:relative; top:-70px; left:-180px; border-bottom:1px solid #eee; width:870px; padding-bottom:10px; font-size: 20px; font-weight: normal; font-family: "Microsoft YaHei",\5fae\8f6f\96c5\9ed1,arial,\5b8b\4f53; color: #323232;}.ftit2{ height:1px; top:50px; left:-180px; }.sfonts{ line-height:48px; color:#666;}.orange{ color:#ee8c18;}#maillogin{ display: block; width: 390px; height: 50px; line-height: 50px; border: 0; overflow: hidden; text-align: center; background: #69b3f2; font-family: "Microsoft YaHei",\5fae\8f6f\96c5\9ed1,arial,\5b8b\4f53; font-size: 26px; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; margin:100px auto 0 85px; cursor:pointer;}#maillogin:hover{ background: #7cbdf5;}#maillogin,#maillogin:hover{ color:#fff;}#maillogin a{ color:#fff;}.notice{ position:relative; bottom:-70px; left:-180px;}#notice{ width:300px; height:200px; position:fixed; top:50%; left:50%; margin:-100px 0 0 -150px; background:#eee; text-align:center; line-height:180px; display:none;}.notit{ font-size:14px; color:#949494; font-weight:bold; font-family:arial;}.noul{ color:#949494; margin-left:-40px;}</style><script src="templets/js/jquery-1.8.3.min.js"></script><script src="templets/js/maillogin.js"></script></head><body><!--頂部長條--><div id="header-nav"> <div id="header-nav-fonts"> <span class="top-tie-big"><a href="#">Dee's BLOG</a></span> <span class="top-tie"> | </span> <span class="top-tie-big">注冊</span> <span class="top-tie-small">已有帳號?馬上<a href="#">登錄</a></span> <div class="cls"></div> </div></div><!-- 內容區(qū) --><div id="container"> <div id="mailChk"> <?php if(isset($_GET['m']) && $_GET['m']!=""){ $m = $_GET['m']; }else{ echo "<div class=\"hfonts ftit\">操作有誤,<a href=\"templets/register.html\">請重新注冊</div>"; exit(); } //接收用戶名和key if(!empty($_GET['n']) && !is_null($_GET['n']) && !empty($_GET['k']) && !is_null($_GET['k'])){ if(get_magic_quotes_gpc()){ $n = stripslashes(urldecode($_GET['n'])); $k = stripslashes(urldecode($_GET['k'])); }else{ $n = urldecode($_GET['n']); $k = urldecode($_GET['k']); } } require_once 'mail.class.php'; ?> <div class="hfonts ftit">郵箱驗證</div> <img class="mailpic" src="templets/images/mail.jpg"> <div class="mailfonts"> <div class="hfonts">驗證郵件已發(fā)出,請48小時內登陸郵箱驗證</div> <div class="sfonts">登錄郵箱 <a id="mailaddr" class="orange"><?php echo $m;?></a> ,并按郵件提示操作即可</div> <input id="n" type="hidden" value="<?php echo $n;?>"/> <input id="k" type="hidden" value="<?php echo $k;?>"/> </div> <button type="button" id="maillogin"><a href="">立即登錄郵箱驗證</a></button> <div class="ftit ftit2"></div> <div class="cls"></div> <div class="notice"> <h3 class="notit">還沒有收到驗證郵件呢?</h3> <ul class="noul"> <li>1.嘗試到廣告郵件、垃圾郵件目錄里找找看</li> <li>2.<a id="re" class="blue" href="#">再次發(fā)送驗證郵件</a></li> <li>3.如果重發(fā)注冊驗證郵件仍然沒有收到,請更換<a class="blue" href="register.php">另一個郵件地址</a></li> </ul> </div> </div> </div></body><script> $(function(){ $("#re").click(function(){ $.post("remailajax.php",{ //要傳遞的數(shù)據(jù) n : $("#n").val(), k : $("#k").val(), m : $("#mailaddr").text() },function(data,textStatus){ if(data == 0){ success(); }else{ alert("重新發(fā)送郵件失敗"); } }); return false; }); $notice = $("<div id=\"notice\">郵件已經發(fā)送,請到郵箱中查看...</div>"); function success(){ $notice.insertAfter($("#mailChk")); $notice.show(300); } function hide(){ if($notice){ $notice.hide(300); } } //顯示4秒 setInterval(hide,4000); });</script></html>
emailajax.php:
<?phpheader("charset=utf-8");include_once 'Zend/Mail/Transport/Smtp.php';include_once 'Zend/Mail.php';require_once 'mail.class.php';if(isset($_POST['n']) && $_POST['n']!="" && isset($_POST['k']) && $_POST['k']!="" && isset($_POST['m']) && $_POST['m']!=""){ if(get_magic_quotes_gpc()){ $n = stripslashes(urldecode($_POST['n'])); $k = stripslashes(urldecode($_POST['k'])); $m = stripslashes(urldecode($_POST['m'])); }else{ $n = $_POST['n']; $k = $_POST['k']; $m = $_POST['m']; } $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode($n).'&k='.$k; //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '郵箱密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號'; $mailbody = '注冊成功,<a href="'.$url.'" target="_blank">請點擊此處激活帳號</a>'; postmail($auth,$port,$envelope,$password,$smtp,$m,$subject,$mailbody); echo 0;}
4.更換郵箱即重新注冊。
maillogin.php代碼片段:
<li>3.如果重發(fā)注冊驗證郵件仍然沒有收到,請更換<a class="blue" href="register.php">另一個郵件地址</a></li>
5.此時目錄結構和數(shù)據(jù)庫
ROOT:
├─conn
│ ├─conn.php
│
├─templets
│ ├─css
│ │ ├─common.css
│ │ ├─register.css
│ │
│ ├─images
│ │
│ └─js
│ ├─jquery-1.8.3.min.js
│ ├─register.js
│ ├─emailup.js
│ ├─showTime.js
│ ├─maillogin.js
│
├─chkname.php
├─chkemail.php
├─valcode.php
├─register_chk.php
├─activation.php
├─mail.class.php -- 郵件類
├─maillogin.php --發(fā)送完郵件的返回頁,可以登錄郵箱和再次發(fā)送郵件
├─reactivation.php --用戶選擇是重新發(fā)送激活郵件還是返回注冊頁
├─remail.php --超時重新發(fā)送郵件
├─remailajax.php --點擊再次發(fā)送郵件
├─remail.php --重新發(fā)送郵件
├─showval.php --生產驗證碼
├─arial.ttf
│
└─Zend
數(shù)據(jù)庫:
CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `uname` varchar(14) character set utf8 collate utf8_bin NOT NULL default '', `upwd` varchar(32) NOT NULL default '', `uemail` varchar(50) NOT NULL default '', `active` tinyint(4) default '0', `count` tinyint(4) default '0', `activekey` varchar(32) NOT NULL default '' COMMENT '注冊時生成的key,用于激活驗證', `regdate` int(11) default NULL COMMENT '注冊時間', `lockurl` tinyint(4) default '0' COMMENT '超過激活時間m沒有激活,就把該值置為1', PRIMARY KEY (`id`), UNIQUE KEY `uemail` (`uemail`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
相關文章
PHP實現(xiàn)Redis單據(jù)鎖以及防止并發(fā)重復寫入
本篇文章給大家分享了PHP實現(xiàn)Redis單據(jù)鎖以及如何防止并發(fā)重復寫入的方法,對此有需要的朋友參考學習下。2018-04-04swoole_process實現(xiàn)進程池的方法示例
這篇文章主要介紹了swoole_process實現(xiàn)進程池的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10