ThinkPHP 3.2 用戶註冊郵箱驗證激活賬號

本文將結合實例,講解如何使用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);
    }
}

 代碼詳細見:https://github.com/Tinywan/ThinkPhpStudy

 

做者:Tinywan

本文版權歸做者和博客園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索