zoukankan      html  css  js  c++  java
  • thinkphp实现用户注册时邮箱激活

    有些网站在注册的时候,会向用户的邮箱发送邮件,点击邮件中的链接激活账户,基本原理就是在注册的时候(即点击发送邮件的时候),先把用户的信息存进数据库,另外还有一个激活状态的字段(默认是未激活)点击邮件中的链接,验证通过之后,该字段状态会改为已激活,邮件中的链接信息包括:用户id(只要是在数据库中能找到对应的数据就行,不一定是id),激活码,点击这个链接之后,会把这些数据传到我们写好的一个方法里面,只要在这个方法里面验证即可。

    业务流程

    1、用户提交注册信息

    2、写入数据库,此时账号未激活

    3、将用户名密码或其他标识字符进行加密构成激活码

    4、将激活码和用户的id组成URL发送到邮箱

    5、用户登陆邮箱。点击URL激活

    6、验证激活码,正确就激活账号,更改激活状态

    数据库设计 

    发送邮件

    发送邮件之前需要加载phpemailer类,可以看我上一篇文章Thinkphp5+PHPMailer实现发送邮件

    public function index()
        {
            $toemail = 'xxx@126.com';    //这里写的是收件人的邮箱
            $active_url = "http://test.zxf/index/sendmail/active.html?id=1&active_key=123";
            $body =  "亲爱的".$toemail.":<br/>感谢您在我站注册了新帐号。<br/>请点击链接激活您的帐号。<br/> 
                        <a href='".$active_url."' target= '_blank'>点击激活</a><br/> 
                        如果以上链接无法点击,请将它复制到你的浏览器地址栏中进入访问,该链接24小时内有效。"; 
    
            $mail=new Phpmailer();
            $mail->isSMTP();    // 使用SMTP服务(发送邮件的服务)
            $mail->CharSet = "utf8";    // 编码格式为utf8,不设置编码的话,中文会出现乱码
            $mail->Host = "smtp.qq.com";    // 发送方的SMTP服务器地址
            $mail->SMTPAuth = true;    // 是否使用身份验证
            $mail->Username = "xx@qq.com";    // 申请了smtp服务的邮箱名(自己的邮箱名)
            $mail->Password = "xxxx";    // 发送方的邮箱密码,不是登录密码,是qq的第三方授权登录码,要自己去开启(之前叫你保存的那个密码)
            $mail->SMTPSecure = "ssl";    // 使用ssl协议方式,
            $mail->Port = 465;    // QQ邮箱的ssl协议方式端口号是465/587
            $mail->setFrom("xx@qq.com","测试发件人");    // 设置发件人信息,如邮件格式说明中的发件人,
            $mail->addAddress($toemail,'测试收件人');    // 设置收件人信息,如邮件格式说明中的收件人
            $mail->addReplyTo("xx@qq.com","Reply");    // 设置回复人信息,指的是收件人收到邮件后,如果要回复,回复邮件将发送到的邮箱地址
            $mail->Subject = "这是一个测试邮件";    // 邮件标题
            $mail->Body = $body;// 邮件正文
            
            $mail->CharSet = "UTF-8";   //字符集
            $mail->Encoding = "base64"; //编码方式
            $mail->IsHTML(true);    //支持html格式内容
    
           if(!$mail->send()){    // 发送邮件
               echo "Message could not be sent.";
               echo "Mailer Error: ".$mail->ErrorInfo;    // 输出错误信息
            }else{
                echo '';
                return '发送成功';
            }
        }

    发送成功之后,邮件内容,注意,如果发送之后,邮件内容不能解析html代码,需要添加支持html格式内容 $mail->IsHTML(true);

    验证注册激活账户 

    public function active()
        {
            $data = request()->param();
            // 通过id找对应的激活码
            $active_key = Db::table('active')->where(['id'=>$data['id']])->value('active_key');
            if ($active_key) {
    
                // 验证激活码是否正确
                if ($active_key == $data['active_key']) {
                    // 更改激活状态
                    $res = Db::table('active')->where(['id'=>$data['id']])->update(['status'=>1]);
                    if ($res) {
                        echo "激活成功";
                    }else{
    
                        echo "激活失败";
                    }
                }else{
                    echo "激活码不正确";
                }
            }else{
                echo "用户不存在";
            }
        }

    这里只是简单举例,安全性还不高,可以对激活码加密,添加激活码的过期时间等提高安全性

  • 相关阅读:
    【HDU
    写个shell脚本依次运行每个程序半小时
    Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ
    【UVALive
    【Gym
    【最短路算法】Dijkstra+heap和SPFA的区别
    【Gym 100812C】Story of Princess (走完图所有边)
    【C++】VS2015/VS2017连接Mysql数据库教程
    博客园设置Google-code-prettify渲染代码高亮
    【QML与C++混合编程】用QVariantList传递数组类型成员
  • 原文地址:https://www.cnblogs.com/zxf100/p/12658351.html
Copyright © 2011-2022 走看看