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

业务流程

1、用户提交注册信息。

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

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

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

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

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

准备数据表

用户信息表中字段Email很重要,它可以用来验证用户、找回密码、甚至对网站方来说可以用来收集用户信息进行Email营销,以下是用户信息表cmf_email的表结构:

CREATE TABLE `cmf_email`  (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`email` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`email_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱注册码',
`token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账户激活码',
`token_exptime` int(10) NULL DEFAULT NULL COMMENT '激活码有效期',
`status` tinyint(1) NULL DEFAULT 0 COMMENT '状态,0=未激活,1=已激活',
`regtime` int(10) NULL DEFAULT NULL COMMENT '注册时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '//---前台邮箱注册' ROW_FORMAT = Dynamic;

在框架中下载phpmailer包

1.composer require phpmailer/phpmailer

2.在控制器中引入类

use PHPMailer\PHPMailer\PHPMailer

3步骤

<?php
// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2019 http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Powerless < wzxaini9@gmail.com>
// +----------------------------------------------------------------------
namespace app\user\controller; use cmf\controller\HomeBaseController;
use think\Db;
use think\facade\Validate;
use app\user\model\UserModel;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception; class RegisterController extends HomeBaseController
{ /**
* 前台用户注册
*/
public function index()
{
return $this->fetch('register');
} //发送qq邮箱
/*
* @param
* $address_email --收件人邮箱
* $active_url ---激活地址
* $token --- 账户激活码
* $email_password --邮箱密码
* **/
public function setEmail($address_email, $token, $active_url, $email_password)
{
$sendmail = '135xxx7@qq.com'; //发件人邮箱
//$sendmailpswd = "cbllxxxxxxxhdbc"; //客户端授权密码,而不是邮箱的登录密码!
$sendmailpswd = "olbzxxxxhpqjbfc"; //客户端授权密码,而不是邮箱的登录密码!
$send_name = '悦桔拉拉商城';// 设置发件人信息,如邮件格式说明中的发件人,
$toemail = $address_email;//定义收件人的邮箱
$to_name = '小号';//设置收件人信息,如邮件格式说明中的收件人
$mail = new PHPMailer();
$mail->isSMTP();// 使用SMTP服务
$mail->CharSet = "utf8";// 编码格式为utf8,不设置编码的话,中文会出现乱码
$mail->Host = "smtp.qq.com";// 发送方的SMTP服务器地址
$mail->SMTPAuth = true;// 是否使用身份验证
$mail->Username = $sendmail;//// 发送方的
$mail->Password = $sendmailpswd;//客户端授权密码,而不是邮箱的登录密码!
$mail->SMTPSecure = "ssl";// 使用ssl协议方式
$mail->Port = 465;// qq端口465或587)
// $mail->setFrom($sendmail,$send_name);// 设置发件人信息,如邮件格式说明中的发件人,
$mail->setFrom($sendmail, $send_name);
$mail->addAddress($toemail, $to_name);// 设置收件人信息,如邮件格式说明中的收件人,
$mail->addReplyTo($sendmail, $send_name);// 设置回复人信息,指的是收件人收到邮件后,如果要回复,回复邮件将发送到的邮箱地址
//$mail->addCC("xxx@qq.com");// 设置邮件抄送人,可以只写地址,上述的设置也可以只写地址(这个人也能收到邮件)
//$mail->addBCC("xxx@qq.com");// 设置秘密抄送人(这个人也能收到邮件)
//$mail->addAttachment("bug0.jpg");// 添加附件
$mail->Subject = "悦桔拉拉商城,激活邮箱";// 邮件标题
// $mail->Body = "邮件内容是 <b>您的验证码是:123456</b>,哈哈哈!";// 邮件正文
$mail->Body = "恭喜您,注册成功!请点击链接激活您的帐户:" . "$active_url" . "$token" . "
如果以上链接无法点击,请将它复制到你的浏览器地址栏中进入访问,该链接24小时内有效。";// 邮件正文
//$mail->AltBody = "This is the plain text纯文本";// 这个是设置纯文本方式显示的正文内容,如果不支持Html方式,就会用到这个,基本无用
$token_exptime = time() + 60 * 60 * 24;//过期时间为24小时后
if (!$mail->send()) {// 发送邮件
$this->error('邮箱注册失败!请检查邮箱号码是否正确', url('user/register/index'));
} else {
//将邮箱与密码写入数据库
$data = [
'email' => $address_email,
'email_password' => $email_password,
'token' => $token,
'regtime' => time(),
'token_exptime' => $token_exptime,
];
$res = Db::name('email')->insert($data);
if ($res) {
$this->success('恭喜您,注册成功!<br/>请登录到您的邮箱及时激活您的帐号,然后进行登录!', url('user/login/index'));
}
}
}
  
  //前台注册页面,用户点击提交,跳转到控制器里面的add方法
public function add()
{
if ($this->request->isPost()) { $rules = [
'email' => $this->request->param('email'),
'email_password' => cmf_password($this->request->param('email_password'), $authCode = 'yjllshop'),
];
$nowtime = time(); //当前时间
//对于是否已经注册用户进行判断
$res = Db('email')->where('email', $rules['email'])->find();
if ($res) {
if ($nowtime > $res['token_exptime']) {
$this->error('您的激活有效期已过,请登录您的帐号重新发送激活邮件', url('user/register/index'));
} else {
$this->success('您已经注册过,请直接登录!', url('user/login/index'));
}
}
//dump($rules);die;
//激活地址--对应激活方法
$active_url = 'http://www.yjllshop.com/user/register/valRegister?token='; //调用生产token方法
$token = $this->makeToken($rules['email']);
$this->setEmail($rules['email'], $token, $active_url, $rules['email_password']);
}
} //制作token
public function makeToken($email)
{
$regtime = time();
$num = rand(0, 100);//一段随机数字
$md5Num = md5($regtime . $num . $email);
$token = base64_encode(md5($md5Num)); //创建用于激活识别码 return $token;
} //邮箱激活方法--并且将邮箱的各个信息存放数据库
public function valRegister()
{
//$token
$nowtime = time(); //当前时间
if ($this->request->isGet()) {
$token = $this->request->param('token');
//将条件token值与status=0状态值带入数据库查询,如果能查到,在判断时间是够是过期,就进行激活操作,改变激活码
$res = Db('email')
->where('status', 0)
->where('token', $token)->find();
//dump($res);
/// dump($res['token_exptime']);die;
if ($res) {
if ($nowtime > $res['token_exptime']) {
$this->error('您的激活有效期已过,请登录您的帐号重新发送激活邮件', url('user/register/index'));
} else {
Db::name('email')->where('token', $token)->setField('status', 1);
$this->success('恭喜您,激活成功!<br/>请进行登录!', url('user/login/index'));
}
} else {
$this->error('邮箱注册失败!请检查邮箱号码是否正确', url('user/register/index'));
}
}
//Db::name('email')->insert($user); }
}

  

  

客户端的授权码

注册完成后的数据库

(进阶篇)PHP(thinkphp5框架)实现用户注册后邮箱验证,激活帐号的更多相关文章

  1. PHP用户注册邮箱验证激活帐号

    我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 本 ...

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

    本文将结合实例,讲解如何使用PHP+Mysql完成注册帐号.发送激活邮件.验证激活帐号.处理URL链接过期的功能. 业务流程 1.用户提交注册信息. 2.写入数据库,此时帐号状态未激活. 3.将用户名 ...

  3. (进阶篇)PHP实现用户注册后邮箱验证,激活帐号

    我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 本 ...

  4. PHP用户注册邮箱并验证激活帐号

    我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 查 ...

  5. discuz x2.5用户注册后邮箱认证后无法收到邮件或者直接进垃圾箱

    又是一个周末,jquery特效继续折腾我那discuz论坛,我开启了个邮箱验证,恶意注册的太恶心了,没有办法. 能稍微屏蔽点,但是问题来了,据亲们反应,无法收到验证邮件,或者有时间直接进入垃圾箱,这个 ...

  6. Django用户注册、邮箱验证实践

    算法流程如下:1)处理用户注册数据,存入数据库,is_activity字段设置为False,用户未认证之前不允许登陆2)产生token,生成验证连接URL3)发送验证邮件4)用户通过认证邮箱点击验证连 ...

  7. 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  8. C# 使用Emit实现动态AOP框架 进阶篇之异常处理

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  9. C# 使用Emit实现动态AOP框架 进阶篇之优化

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

随机推荐

  1. vue-cli启动本地服务,局域网下通过ip访问不到的原因

    1.问题描述: 新开发了一个vue-cli项目,想通过手机查看效果,发现访问不到,ip地址和端口号都没错但是手机访问不到,在本机电脑浏览器输入ip端口号一样访问不到,只能通过localhost:808 ...

  2. 无法启动MYSQL服务”1067 进程意外终止”解决的方法——汇总及终极方法

    自己一開始依照百度经验里的方法--<MySQL下载安装.配置与使用(win7x64)>去安装和配置,可是到后面步骤总是出现1067代号的错误. 慢慢折腾去解决. 这里汇总各种导致mysql ...

  3. 大神真会玩~这组C4D动图,我都看了一整天!

    来自法国的Guillaume Kurkdjian 擅长创作一些平面动态图像 每张都诉说了一个小笑话或者小故事 像个极其微型的小电影. 这些动图的灵感可能来自某个交通工具 或是某个悠闲的时光 也可能是生 ...

  4. 换行符在HTML中直接替换为<br>

         #set($text=$!obj.getMeasure().replaceAll("\r\n","<br>"))     <td a ...

  5. 2018.07.20 bzoj2152: 聪聪可可(点分治)

    传送门 本蒟蒻AC的第二道点分治,调了30min" role="presentation" style="position: relative;"&g ...

  6. HDU 3897 Base Station (网络流,最大闭合子图)

    题意:给定n个带权点m条无向带权边,选一个子图,则这个子图的权值为 边权和-点权和,求一个最大的权值. 析:把每条边都看成是一个新点,然后建图,就是一个裸的最大闭合子图. 代码如下: #pragma ...

  7. UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

    题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排 ...

  8. org.apache.cxf 官方骨架

    mvn archetype:generate -DarchetypeCatalog=remote 用 cxf 筛选结果 官方三大项目骨架 org.apache.cxf:cxf-http-basic ( ...

  9. Get同步请求

    //同步get请求 //    NSURL: iOS 中的URL存储类,可存储网址或者文件路径         NSString *urlString = @"http://api.map. ...

  10. (回文串 )Best Reward -- hdu -- 3613

    http://acm.hdu.edu.cn/showproblem.php?pid=3613 Best Reward Time Limit: 2000/1000 MS (Java/Others)    ...