zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    模块之使用模块
    函数之return
    Python3入门(八)——面向对象OOP
    Python3入门(七)——模块
    Python3入门(六)——函数式编程
    Python3入门(五)——高级特性
    Python3入门(四)——Python函数
    Python3入门(三)——Python基础语法
    Python3入门(二)——Python开发工具Pycharm安装与配置
    大数据入门第二十五天——elasticsearch入门
  • 原文地址:https://www.cnblogs.com/tinywan/p/5868013.html
Copyright © 2011-2022 走看看