• ThinkPHP 3.2 用户注册邮箱验证激活帐号


    本文将结合实例,讲解如何使用PHP+Mysql完成注册帐号、发送激活邮件、验证激活帐号、处理URL链接过期的功能。

    业务流程

    1、用户提交注册信息。

    2、写入数据库,此时帐号状态未激活。

    3、将用户名密码或其他标识字符加密构造成激活识别码(你也可以叫激活码)。

    4、将构造好的激活识别码组成URL发送到用户提交的邮箱。

    5、用户登录邮箱并点击URL,进行激活。

    6、验证激活识别码,如果正确则激活帐号。

    准备数据表

    用户信息表中字段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>

    发送邮件:

     /**
         * 发送邮件
         */
        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

  • 相关阅读:
    DC中为什么要用Uniquify?
    hdu 1596 find the safest road
    hdu2112 HDU Today
    hdu 2066 一个人的旅行
    poj 3026 Borg Maze
    poj 1979 Red and Black
    poj 1321 棋盘问题
    hdu 1010 Tempter of the Bone
    hdu 4861 Couple doubi
    codeforces584B Kolya and Tanya
  • 原文地址:https://www.cnblogs.com/tinywan/p/5868013.html
Copyright © 2020-2023  润新知