PHP+jQuery 注冊(cè)模塊的改進(jìn)(二):郵箱激活第2/2頁(yè)
$(function(){ //郵箱地址 function mailaddr(mail){ if(!mail.split("@")[1]){ alert("參數(shù)錯(cuò)誤"); return false; } var mail = mail.split("@"); mail = mail[1].toLowerCase(); //與常用郵箱進(jìn)行對(duì)比 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.給激活鏈接設(shè)置失效時(shí)間
關(guān)于設(shè)置失效時(shí)間的目的,我在網(wǎng)上看到有這幾種說法,第一是節(jié)省資源,過期的數(shù)據(jù)會(huì)被清除,這種說法我不認(rèn)同,因?yàn)樵谶^期之后,只是這一條激活連接不能使用,但是注冊(cè)用戶可以重新發(fā)送鏈接,所以用戶數(shù)據(jù)并沒有被清除;第二種說法是安全,即在較短時(shí)間內(nèi)激活,可以避免用戶郵箱被盜引發(fā)的安全問題,對(duì)于這一點(diǎn)我也不認(rèn)同,因?yàn)榧词褂脩羿]箱被盜,還是可以重新發(fā)送激活鏈接,激活鏈接的地址仍然是在郵箱里面,所以和被盜不被盜沒有關(guān)系;我認(rèn)為是,在一個(gè)較長(zhǎng)的時(shí)間內(nèi),如果網(wǎng)站的注冊(cè)機(jī)制或者找回密碼機(jī)制發(fā)生了變化,失效時(shí)間可以在一定程度上避免很早之前的激活鏈接仍按照以前的機(jī)制而帶來激活錯(cuò)誤或者找回密碼錯(cuò)誤,此時(shí)用戶可以選擇重新生成最新的激活鏈接來保證注冊(cè)或者找回密碼的正確性,對(duì)網(wǎng)站來說更穩(wěn)定安全。
思路:
需要在數(shù)據(jù)庫(kù)中增加兩個(gè)字段,分別是表示用戶的注冊(cè)日期:regdate( int ),和激活鏈接是否有效的lockurl( tinyint )。
當(dāng)用戶注冊(cè)成功時(shí),把當(dāng)前日期插入到表中的regdate字段;當(dāng)用戶超過有效期沒有點(diǎn)擊激活鏈接,再次點(diǎn)擊激活鏈接時(shí)就把數(shù)據(jù)庫(kù)中的lock字段修改成1,當(dāng)lock為1時(shí),該鏈接失效,直到用戶重新生成注冊(cè)鏈接時(shí)更換activekey后,把lock值設(shè)為0,同時(shí)更新注冊(cè)時(shí)間,用戶才可以點(diǎn)擊新的鏈接發(fā)送郵件進(jìn)行激活。
修改和新增的的文件有:
register_chk.php,注冊(cè)成功時(shí)把當(dāng)前的時(shí)間戳插入表中;
activation.php中在update user表的active字段之前,先判斷是否超過有效期,如果超過,則active字段不變,同時(shí)lockurl字段設(shè)為1,此時(shí)給出提示:請(qǐng)重新激活并且跳轉(zhuǎn)至reactivation.php頁(yè)面;
reactivation.php接受參數(shù),如果參數(shù)正確,則顯示是重新收取激活鏈接還是返回注冊(cè)頁(yè),如果參數(shù)錯(cuò)誤則直接返回注冊(cè)頁(yè);
當(dāng)選擇重新收取激活鏈接,則跳轉(zhuǎn)至remail.php,如果參數(shù)正確,則更新注冊(cè)時(shí)間和activekey,然后重新發(fā)送郵件,郵件中的地址依然指向activation.php。如果參數(shù)錯(cuò)誤,則跳轉(zhuǎn)回注冊(cè)頁(yè)。
其他修改之處:
1.把郵件代碼寫成郵件類
郵件注冊(cè)類mail.class.php:
<?php function postmail($auth,$port,$envelope,$password,$smtp,$postuemail,$subject,$mailbody){ //$smtp smtp郵件服務(wù)器地址 //$postuemail 用戶注冊(cè)郵件 //$subject 郵件主題 //$mailbody 郵件內(nèi)容 $config = array( 'auth'=>$auth,//發(fā)件人 'port' =>$port,//端口 'username'=>$envelope,//發(fā)件郵箱 'password'=>$password //發(fā)件郵箱密碼 ); //實(shí)例化驗(yàn)證的對(duì)象,使用gmail smtp服務(wù)器 $transport = new Zend_Mail_Transport_Smtp($smtp,$config); $mail = new Zend_Mail('utf-8'); $mail->addTo($postuemail,'獲取用戶注冊(cè)激活鏈接'); $mail->setFrom($envelope,$auth); $mail->setSubject($subject); $mail->setBodyHtml($mailbody); $mail->send($transport);}
2.用戶名注冊(cè)時(shí)區(qū)分大小寫,修改checkname.php
//用戶名區(qū)分大小寫$sql = "select uname from user where binary uname='".$uname."'";
流程圖:
需要注意的是,GET傳遞的參數(shù)也要進(jìn)行轉(zhuǎn)義處理。
Js倒計(jì)時(shí)跳轉(zhuǎn)代碼 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 = "正在跳轉(zhuǎn)..."; self.location = href; } setTimeout("showTime(href)",1000);}
注冊(cè)并發(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,生成的隨機(jī)數(shù) $key = md5(rand()); //先寫入數(shù)據(jù)庫(kù),再發(fā)郵件 //寫入數(shù)據(jù)庫(kù) //判斷是否開啟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ù)字則加引號(hào) 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){ //插入成功時(shí)發(fā)送郵件 //用戶激活鏈接 $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉(zhuǎn)換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 = '激活您的帳號(hào)'; $mailbody = '注冊(cè)成功,<a href="'.$url.'" target="_blank">請(qǐng)點(diǎn)擊此處激活帳號(hào)</a>'; postmail($auth,$port,$envelope,$password,$smtp,$postuemail,$subject,$mailbody); echo "<script>self.location=\"maillogin.php?m=".$postuemail."\";</script>"; }else{ //提示激活失敗并跳轉(zhuǎn) echo "<div id=\"textBox\">激活失敗,請(qǐng)重新注冊(cè),<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至重新激活頁(yè)...</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反轉(zhuǎn)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); //注冊(cè)時(shí)間 $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){ //提示激活失敗并跳轉(zhuǎn) echo "<div id=\"textBox\">超過激活有效期,激活失敗,<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至重新激活頁(yè)...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='reactivation.php?n=".urlencode($getname)."&k=".$k."';showTime(href);</script>"; }else{ //提示激活失敗并跳轉(zhuǎn) echo "<div id=\"textBox\">激活失敗,請(qǐng)重新注冊(cè),<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至重新激活頁(yè)...</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('您已經(jīng)激活過了');window.location.href='main.php';</script>"; } } }else{ //提示激活失敗并跳轉(zhuǎn) echo "激活鏈接已失效,請(qǐng)重新發(fā)送激活鏈接或重新注冊(cè)"; echo "<script>window.setTimeout(\"self.location='register.php'\",3000);</script>"; }}?>
用戶選擇重新激活或返回注冊(cè)頁(yè) 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'>返回注冊(cè)頁(yè)</a>";}else{ echo "<div id=\"textBox\">參數(shù)錯(cuò)誤,請(qǐng)重新注冊(cè),<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至注冊(cè)頁(yè)...</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()); //更新注冊(cè)時(shí)間 $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){ //插入成功時(shí)發(fā)送郵件 //用戶激活鏈接 $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉(zhuǎn)換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode((trim($n))).'&k='.$key; //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '換成自己的郵箱密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號(hào)'; $mailbody = '注冊(cè)成功,<a href="'.$url.'" target="_blank">請(qǐng)點(diǎn)擊此處激活帳號(hào)</a>'; postmail($auth,$port,$envelope,$password,$smtp,$rsuemail,$subject,$mailbody); echo "<script>self.location=\"maillogin.php?m=".$rsuemail."\";</script>"; }else{ //提示激活失敗并跳轉(zhuǎn) echo "<div id=\"textBox\">激活失敗,<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至注冊(cè)頁(yè)...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; } }else{ //提示激活失敗并跳轉(zhuǎn) echo "<div id=\"textBox\">12激活失敗,<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至注冊(cè)頁(yè)...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; }}else{ echo "<div id=\"textBox\">參數(shù)錯(cuò)誤,請(qǐng)重新注冊(cè),<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至注冊(cè)頁(yè)...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>";}?>
3.maillogin.php頁(yè)面重新發(fā)送激活鏈接
思路: 注冊(cè)頁(yè)register_chk.php和重新發(fā)送郵件的remail.php頁(yè)面在發(fā)送郵件以后跳至maillogin.php時(shí),除了把email通過GET傳遞過去,再加上name和key,在maillogin.php頁(yè)面把接受到的后兩個(gè)參數(shù)接受到hidden的input里,通過jQuery的post方法請(qǐng)求remailajax.php重新發(fā)送郵件。發(fā)送成功以后通過jQuery設(shè)置定時(shí)器顯示文字通知用戶,4秒后自動(dòng)消失。
如圖:
代碼:
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,生成的隨機(jī)數(shù) $key = md5(rand()); //先寫入數(shù)據(jù)庫(kù),再發(fā)郵件 //寫入數(shù)據(jù)庫(kù) //判斷是否開啟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ù)字則加引號(hào) 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){ //插入成功時(shí)發(fā)送郵件 //用戶激活鏈接 $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉(zhuǎn)換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode($postuname).'&k='.$key; //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '郵箱密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號(hào)'; $mailbody = '注冊(cè)成功,<a href="'.$url.'" target="_blank">請(qǐng)點(diǎn)擊此處激活帳號(hào)</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{ //提示激活失敗并跳轉(zhuǎn) echo "<div id=\"textBox\">激活失敗,請(qǐng)重新注冊(cè),<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至重新激活頁(yè)...</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) 因?yàn)槭褂昧薽ysql_real_escape_string,所以存儲(chǔ)在數(shù)據(jù)庫(kù)中的是帶轉(zhuǎn)義的字符串 $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()); //更新注冊(cè)時(shí)間 $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){ //插入成功時(shí)發(fā)送郵件 //用戶激活鏈接 $url = 'http://'.$_SERVER['HTTP_HOST'].'/activation.php'; //urlencode函數(shù)轉(zhuǎn)換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode((trim($n))).'&k='.$key; //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '郵箱密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號(hào)'; $mailbody = '注冊(cè)成功,<a href="'.$url.'" target="_blank">請(qǐng)點(diǎn)擊此處激活帳號(hào)</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{ //提示激活失敗并跳轉(zhuǎn) echo "<div id=\"textBox\">22激活失敗,<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至注冊(cè)頁(yè)...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; } }else{ //提示激活失敗并跳轉(zhuǎn) echo "<div id=\"textBox\">12激活失敗,<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至注冊(cè)頁(yè)...</div>"; echo "<script src=\"templets/js/showTime.js\"></script>"; echo "<script>var href='register.php';showTime(href);</script>"; }}else{ echo "<div id=\"textBox\">參數(shù)錯(cuò)誤,請(qǐng)重新注冊(cè),<span id=\"second\"></span> 秒鐘后跳轉(zhuǎn)至注冊(cè)頁(yè)...</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>注冊(cè)頁(yè)面</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><!--頂部長(zhǎng)條--><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">注冊(cè)</span> <span class="top-tie-small">已有帳號(hào)?馬上<a href="#">登錄</a></span> <div class="cls"></div> </div></div><!-- 內(nèi)容區(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\">請(qǐng)重新注冊(cè)</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">郵箱驗(yàn)證</div> <img class="mailpic" src="templets/images/mail.jpg"> <div class="mailfonts"> <div class="hfonts">驗(yàn)證郵件已發(fā)出,請(qǐng)48小時(shí)內(nèi)登陸郵箱驗(yàn)證</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="">立即登錄郵箱驗(yàn)證</a></button> <div class="ftit ftit2"></div> <div class="cls"></div> <div class="notice"> <h3 class="notit">還沒有收到驗(yàn)證郵件呢?</h3> <ul class="noul"> <li>1.嘗試到廣告郵件、垃圾郵件目錄里找找看</li> <li>2.<a id="re" class="blue" href="#">再次發(fā)送驗(yàn)證郵件</a></li> <li>3.如果重發(fā)注冊(cè)驗(yàn)證郵件仍然沒有收到,請(qǐng)更換<a class="blue" href="register.php">另一個(gè)郵件地址</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\">郵件已經(jīng)發(fā)送,請(qǐng)到郵箱中查看...</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ù)轉(zhuǎn)換url中的中文編碼 //帶反斜杠 $url.= '?name='.urlencode($n).'&k='.$k; //定義登錄使用的郵箱 $envelope = 'dee1566@126.com'; $password = '郵箱密碼'; $port = 25; $auth = 'login'; $smtp = 'smtp.126.com'; //激活郵件的主題和正文 $subject = '激活您的帳號(hào)'; $mailbody = '注冊(cè)成功,<a href="'.$url.'" target="_blank">請(qǐng)點(diǎn)擊此處激活帳號(hào)</a>'; postmail($auth,$port,$envelope,$password,$smtp,$m,$subject,$mailbody); echo 0;}
4.更換郵箱即重新注冊(cè)。
maillogin.php代碼片段:
<li>3.如果重發(fā)注冊(cè)驗(yàn)證郵件仍然沒有收到,請(qǐng)更換<a class="blue" href="register.php">另一個(gè)郵件地址</a></li>
5.此時(shí)目錄結(jié)構(gòu)和數(shù)據(jù)庫(kù)
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ā)送完郵件的返回頁(yè),可以登錄郵箱和再次發(fā)送郵件
├─reactivation.php --用戶選擇是重新發(fā)送激活郵件還是返回注冊(cè)頁(yè)
├─remail.php --超時(shí)重新發(fā)送郵件
├─remailajax.php --點(diǎn)擊再次發(fā)送郵件
├─remail.php --重新發(fā)送郵件
├─showval.php --生產(chǎn)驗(yàn)證碼
├─arial.ttf
│
└─Zend
數(shù)據(jù)庫(kù):
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 '注冊(cè)時(shí)生成的key,用于激活驗(yàn)證', `regdate` int(11) default NULL COMMENT '注冊(cè)時(shí)間', `lockurl` tinyint(4) default '0' COMMENT '超過激活時(shí)間m沒有激活,就把該值置為1', PRIMARY KEY (`id`), UNIQUE KEY `uemail` (`uemail`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 注冊(cè)頁(yè)面之前先驗(yàn)證用戶名是否存在的php代碼
- 用Php編寫注冊(cè)后Email激活驗(yàn)證的實(shí)例代碼
- php用戶注冊(cè)頁(yè)面利用js進(jìn)行表單驗(yàn)證具體實(shí)例
- ThinkPHP之用戶注冊(cè)登錄留言完整實(shí)例
- PHP+Ajax檢測(cè)用戶名或郵件注冊(cè)時(shí)是否已經(jīng)存在實(shí)例教程
- PHP+jQuery 注冊(cè)模塊開發(fā)詳解
- PHP+jQuery 注冊(cè)模塊的改進(jìn)(一):驗(yàn)證碼存入SESSION
- php+mysql實(shí)現(xiàn)用戶注冊(cè)登陸的方法
- php發(fā)送短信驗(yàn)證碼完成注冊(cè)功能
- PHP連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)注冊(cè)頁(yè)面的增刪改查操作
相關(guān)文章
PHP中使用FFMPEG獲取視頻縮略圖和視頻總時(shí)長(zhǎng)實(shí)例
這篇文章主要介紹了PHP中使用FFMPEG獲取視頻縮略圖和視頻總時(shí)長(zhǎng)實(shí)例,需要的朋友可以參考下2014-05-05PHP實(shí)現(xiàn)Redis單據(jù)鎖以及防止并發(fā)重復(fù)寫入
本篇文章給大家分享了PHP實(shí)現(xiàn)Redis單據(jù)鎖以及如何防止并發(fā)重復(fù)寫入的方法,對(duì)此有需要的朋友參考學(xué)習(xí)下。2018-04-04關(guān)于Yii2框架跑腳本時(shí)內(nèi)存泄漏問題的分析與解決
這篇文章主要給大家介紹了關(guān)于Yii2框架跑腳本時(shí)內(nèi)存泄漏問題的分析與解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Yii2具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12PHP設(shè)置圖片文件上傳大小的具體實(shí)現(xiàn)方法
PHP默認(rèn)的上傳限定是最大2M,想上傳超過此設(shè)定的文件,需要調(diào)整PHP、apache等的一些參數(shù)2013-10-10swoole_process實(shí)現(xiàn)進(jìn)程池的方法示例
這篇文章主要介紹了swoole_process實(shí)現(xiàn)進(jìn)程池的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10