本文將結合實例,講解如何使用PHP+Mysql完成註冊賬號、發送激活郵件、驗證激活賬號、處理URL連接過時的功能。php
一、用戶提交註冊信息。html
二、寫入數據庫,此時賬號狀態未激活。git
三、將用戶名密碼或其餘標識字符加密構形成激活識別碼(你也能夠叫激活碼)。github
四、將構造好的激活識別碼組成URL發送到用戶提交的郵箱。sql
五、用戶登陸郵箱並點擊URL,進行激活。數據庫
六、驗證激活識別碼,若是正確則激活賬號。數組
用戶信息表中字段Email很重要,它能夠用來驗證用戶、找回密碼、甚至對網站方來講能夠用來收集用戶信息進行Email營銷,如下是用戶信息表t_user的表結構:瀏覽器
DROP TABLE IF EXISTS `wechat_user`; CREATE TABLE `wechat_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `orgId` int(11) DEFAULT '0' COMMENT '組織ID', `username` varchar(40) DEFAULT NULL, `password` varchar(40) NOT NULL, `nickName` varchar(40) DEFAULT NULL, `mobile` varchar(20) DEFAULT NULL, `openId` varchar(50) DEFAULT NULL, `createTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入時間', `checkFlag` int(2) DEFAULT NULL, `enabled` tinyint(2) DEFAULT '1', `accessExpires` int(12) DEFAULT NULL, `accessToken` varchar(128) DEFAULT NULL, `reTime` varchar(32) DEFAULT NULL, `email` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=434 DEFAULT CHARSET=utf8 COMMENT='組織和用戶關係表';
視圖:服務器
<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>
發送郵件:ide
/** * 發送郵件 */ public function send_email() { $usernName = I('post.userName','Guest112'); $passWord = I('post.passWord','123456'.rand(1000,9999)); $email = I('post.email','756684177@qq.com'); $reTime = time(); $accessToken = md5($usernName . $passWord . $reTime);//建立用於激活識別碼 $accessExpires = $reTime + 60 * 60 * 24; //過時時間爲24小時後 $model = M('User'); $data['username'] = $usernName; $data['password'] = $passWord; $data['nickName'] = $usernName; $data['accessToken'] = $accessToken; $data['accessExpires'] = $accessExpires; $data['reTime'] = $reTime; $data['email'] = $email; $data['enabled'] = 0; if ($model->add($data) == false) return 'error'; echo 'success'; $link = "http://wechatu.xd107.com/home/Index/activation?accessToken={$accessToken}"; $str = <<<html 您好!<p></p> 感謝您在Tinywan世界註冊賬戶!<p></p> 賬戶須要激活才能使用,趕忙激活成爲Tinywan家園的正式一員吧:)<p></p> 點擊下面的連接當即激活賬戶(或將網址複製到瀏覽器中打開):<p></p> $link html; $result = send_email($email, 'Tinywan世界賬戶激活郵件--' . $usernName, $str); if ($result['error'] == 1) { var_dump($result); die; } var_dump('發送完成'); }
激活郵件:
// 用戶點擊激活方法 public function activation() { $accessToken = I('get.accessToken'); $nowTime = time(); $where['enabled'] = 0; $where['accessToken'] = $accessToken; $res = M('User')->where($where)->find(); if (!$res) exit('沒有改帳戶'); if ($nowTime > $res['accessexpires']) exit('您的激活有效期已過,請登陸您的賬號從新發送激活郵件'); $update = M('User')->where(array('id' => $res['id']))->setField('enabled', 1); if ($update == false) exit('修改數據庫字段失敗'); $link = "http://wechatu.xd107.com/home/Index/qrcode?accessToken={$accessToken}"; //這裏跳轉到一個我的博客的二維碼 header('location:' . $link); }
附:發送郵件方法:
/** * 發送郵件 * @param string $address 須要發送的郵箱地址 發送給多個地址須要寫成數組形式 * @param string $subject 標題 * @param string $content 內容 * @return boolean 是否成功 */ function send_email($address, $subject, $content) { $email_smtp = C('EMAIL_SMTP'); $email_username = C('EMAIL_USERNAME'); $email_password = C('EMAIL_PASSWORD'); $email_from_name = C('EMAIL_FROM_NAME'); if (empty($email_smtp) || empty($email_username) || empty($email_password) || empty($email_from_name)) { return array("error" => 1, "message" => '郵箱配置不完整'); } require './ThinkPHP/Library/Org/Nx/class.phpmailer.php'; require './ThinkPHP/Library/Org/Nx/class.smtp.php'; $phpmailer = new \Phpmailer(); // 設置PHPMailer使用SMTP服務器發送Email $phpmailer->IsSMTP(); // 設置爲html格式 $phpmailer->IsHTML(true); // 設置郵件的字符編碼' $phpmailer->CharSet = 'UTF-8'; // 設置SMTP服務器。 $phpmailer->Host = $email_smtp; // 設置爲"須要驗證" $phpmailer->SMTPAuth = true; // 設置用戶名 $phpmailer->Username = $email_username; // 設置密碼 $phpmailer->Password = $email_password; // 設置郵件頭的From字段。 $phpmailer->From = $email_username; // 設置發件人名字 $phpmailer->FromName = $email_from_name; // 添加收件人地址,能夠屢次使用來添加多個收件人 if (is_array($address)) { foreach ($address as $addressv) { $phpmailer->AddAddress($addressv); } } else { $phpmailer->AddAddress($address); } // 設置郵件標題 $phpmailer->Subject = $subject; // 設置郵件正文 $phpmailer->Body = $content; // 發送郵件。 if (!$phpmailer->Send()) { $phpmailererror = $phpmailer->ErrorInfo; return array("error" => 1, "message" => $phpmailererror); } else { return array("error" => 0); } }
做者:Tinywan
本文版權歸做者和博客園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。