首頁  >  文章  >  後端開發  >  PHP實現用戶註冊後郵箱驗證,啟動帳號

PHP實現用戶註冊後郵箱驗證,啟動帳號

高洛峰
高洛峰原創
2016-11-21 10:45:341320瀏覽

我們在許多網站註冊會員時,註冊完成後,系統會自動向用戶的郵箱發送一封郵件,這封郵件的內容就是一個URL鏈接,用戶需要點擊打開這個鏈接才能激活之前在該網站註冊的帳號。啟動成功後才能正常使用會員功能。

 

本文將結合實例,講解如何使用PHP+Mysql完成註冊帳號、發送啟動郵件、驗證啟動帳號、處理URL連結過期的功能。

業務流程

1、使用者提交註冊資料。

2、寫入資料庫,此時帳號狀態未啟動。

3、將使用者名稱密碼或其他識別字元加密建構成啟動識別碼(你也可以叫啟動碼)。

4、將建構好的啟動識別碼組成URL送到使用者提交的郵箱。

5、使用者登入郵箱並點選URL,進行啟用。

6、驗證啟動識別碼,如果正確則啟動帳號。

準備資料表

使用者資訊表中欄位Email很重要,它可以用來驗證使用者、找回密碼、甚至對網站方來說可以用來收集使用者資訊進行Email行銷,以下是使用者資訊表t_user的表結構:

CREATE TABLE IF NOT EXISTS `t_user` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `username` varchar(30) NOT NULL COMMENT '用户名', 
  `password` varchar(32) NOT NULL COMMENT '密码', 
  `email` varchar(30) NOT NULL COMMENT '邮箱', 
  `token` varchar(50) NOT NULL COMMENT '帐号激活码', 
  `token_exptime` int(10) NOT NULL COMMENT '激活码有效期', 
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态,0-未激活,1-已激活', 
  `regtime` int(10) NOT NULL COMMENT '注册时间', 
  PRIMARY KEY (`id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

HTML

在頁面中放置一個註冊表單,用戶可以輸入註冊信息,包括用戶名、密碼和郵箱。

<form id="reg" action="register.php" method="post"> 
    <p>用户名:<input type="text" class="input" name="username" id="user"></p> 
    <p>密 码:<input type="password" class="input" name="password" id="pass"></p> 
    <p>E-mail:<input type="text" class="input" name="email" id="email"></p> 
    <p><input type="submit" class="btn" value="提交注册"></p> 
</form>

對於使用者的輸入要進行必要的前端驗證,關於表單驗證功能,建議您參考本站文章:實例講解表單驗證插件Validation的應用,本文對前端驗證程式碼略過,另外其實頁面中還應該有個要求使用者重複輸入密碼的輸入框,一時偷懶就此略過。

register.php

用戶將註冊資訊提交到register.php進行處理。 register.php需要完成寫入資料和發送郵件兩大功能。

首先包含必要的兩個文件,connect.php和smtp.class.php,這兩個文件在外面提供的下載包裡有,歡迎下載。

include_once("connect.php");//连接数据库 
include_once("smtp.class.php");//邮件发送类

然後我們要過濾用戶提交的信息,並驗證用戶名是否存在(前端也可以驗證)。

$username = stripslashes(trim($_POST[&#39;username&#39;])); 
$query = mysql_query("select id from t_user where username=&#39;$username&#39;"); 
$num = mysql_num_rows($query); 
if($num==1){ 
    echo &#39;用户名已存在,请换个其他的用户名&#39;; 
    exit; 
}

接著我們將用戶密碼加密,構造激活識別碼:

$password = md5(trim($_POST[&#39;password&#39;])); //加密密码 
$email = trim($_POST[&#39;email&#39;]); //邮箱 
$regtime = time(); 
 
$token = md5($username.$password.$regtime); //创建用于激活识别码 
$token_exptime = time()+60*60*24;//过期时间为24小时后 
 
$sql = "insert into `t_user` (`username`,`password`,`email`,`token`,`token_exptime`,`regtime`)  
values (&#39;$username&#39;,&#39;$password&#39;,&#39;$email&#39;,&#39;$token&#39;,&#39;$token_exptime&#39;,&#39;$regtime&#39;)"; 
 
mysql_query($sql);

上述代碼中,$token即構造好的激活識別碼,它是由用戶名、密碼和當前時間組成併md5加密得來的。 $token_exptime用於設定啟動連結URL的過期時間,使用者在這個時間段內可以啟動帳號,本例設定的是24小時內啟動有效。最後將這些欄位插入到資料表t_user中。

當數據插入成功後,調用郵件發送類將激活信息發送給用戶註冊的郵箱,注意將構造好的激活識別碼組成一個完整的URL作為用戶點擊時的激活鏈接,以下是詳細代碼:

if(mysql_insert_id()){ 
    $smtpserver = ""; //SMTP服务器,如:smtp.163.com 
    $smtpserverport = 25; //SMTP服务器端口,一般为25 
    $smtpusermail = ""; //SMTP服务器的用户邮箱,如xxx@163.com 
    $smtpuser = ""; //SMTP服务器的用户帐号xxx@163.com 
    $smtppass = ""; //SMTP服务器的用户密码 
    $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //实例化邮件类 
    $emailtype = "HTML"; //信件类型,文本:text;网页:HTML 
    $smtpemailto = $email; //接收邮件方,本例为注册用户的Email 
    $smtpemailfrom = $smtpusermail; //发送邮件方,如xxx@163.com 
    $emailsubject = "用户帐号激活";//邮件标题 
    //邮件主体内容 
    $emailbody = "亲爱的".$username.":<br/>感谢您在我站注册了新帐号。<br/>请点击链接激活您的帐号。<br/> 
    <a href=&#39;http://www.helloweba.com/demo/register/active.php?verify=".$token."&#39; target= 
&#39;_blank&#39;>http://www.helloweba.com/demo/register/active.php?verify=".$token."</a><br/> 
    如果以上链接无法点击,请将它复制到你的浏览器地址栏中进入访问,该链接24小时内有效。"; 
    //发送邮件 
    $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); 
    if($rs==1){ 
        $msg = &#39;恭喜您,注册成功!<br/>请登录到您的邮箱及时激活您的帐号!&#39;;     
    }else{ 
        $msg = $rs;     
    } 
} 
echo $msg;

還有一個相當好用且強大的郵件發送類別分享個大家:使用PHPMailer發送帶附件並支援HTML內容的郵件,直接可以用哦。

active.php

如果不出意外,您註冊帳號時填寫的Email將收到一封helloweba發送的郵件,這個時候您直接點擊激活鏈接,交由active.php處理。

active.php接收提交的連結訊息,取得參數verify的值,即啟動識別碼。將它與數據表中的用戶資訊進行查詢對比,如果有相應的數據集,判斷是否過期,如果在有效期內則將對應的用戶表中字段status設置1,即已激活,這樣就完成了激活功能。

include_once("connect.php");//连接数据库 
 
$verify = stripslashes(trim($_GET[&#39;verify&#39;])); 
$nowtime = time(); 
 
$query = mysql_query("select id,token_exptime from t_user where status=&#39;0&#39; and  
`token`=&#39;$verify&#39;"); 
$row = mysql_fetch_array($query); 
if($row){ 
    if($nowtime>$row[&#39;token_exptime&#39;]){ //24hour 
        $msg = &#39;您的激活有效期已过,请登录您的帐号重新发送激活邮件.&#39;; 
    }else{ 
        mysql_query("update t_user set status=1 where id=".$row[&#39;id&#39;]); 
        if(mysql_affected_rows($link)!=1) die(0); 
        $msg = &#39;激活成功!&#39;; 
    } 
}else{ 
    $msg = &#39;error.&#39;;     
} 
echo $msg;

啟動成功後,發現token欄位並沒有用處了,您可以清空。接下來我們會說明用戶找回密碼的功能,也要用到郵箱驗證,敬請關注。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn