通过PHP实现用户注册后邮箱验证激活


Posted in PHP onNovember 10, 2020

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

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

业务流程

1、用户提交注册信息。

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

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

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

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

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

准备数据表

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

CREATE TABLE IF NOT EXISTS `t_user` ( 
 `id` int(11) NOT NULL AUTO_INCREMENT, 
 `username` varchar(30) NOT NULL COMMENT '用户名', 
 `password` varchar(32) NOT NULL COMMENT '密码', 
 `email` varchar(30) NOT NULL COMMENT '邮箱', 
 `token` varchar(50) NOT NULL COMMENT '帐号激活码', 
 `token_exptime` int(10) NOT NULL COMMENT '激活码有效期', 
 `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态,0-未激活,1-已激活', 
 `regtime` int(10) NOT NULL COMMENT '注册时间', 
 PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

在页面中放置一个注册表单,用户可以输入注册信息,包括用户名、密码和邮箱。

<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>

对于用户的输入要进行必要的前端验证,关于表单验证功能,建议您参考本站文章:实例讲解表单验证插件Validation的应用,本文对前端验证代码略过,另外其实页面中还应该有个要求用户重复输入密码的输入框,一时偷懒就此略过。

register.php

用户将注册信息提交到register.php进行处理。register.php需要完成写入数据和发送邮件两大功能。

首先包含必要的两个文件,connect.php和smtp.class.php,这两个文件在外面提供的下载包里有,欢迎下载。

include_once("connect.php");//连接数据库
include_once("smtp.class.php");//邮件发送类

然后我们要过滤用户提交的信息,并验证用户名是否存在(前端也可以验证)。

$username = stripslashes(trim($_POST['username'])); 
$query = mysql_query("select id from t_user where username='$username'"); 
$num = mysql_num_rows($query); 
if($num==1){ 
  echo '用户名已存在,请换个其他的用户名'; 
  exit; 
}

接着我们将用户密码加密,构造激活识别码:

$password = md5(trim($_POST['password'])); //加密密码
$email = trim($_POST['email']); //邮箱
$regtime = time();
$token = md5($username.$password.$regtime); //创建用于激活识别码
$token_exptime = time()+60*60*24;//过期时间为24小时后
$sql = "insert into `t_user` (`username`,`password`,`email`,`token`,`token_exptime`,`regtime`)
values ('$username','$password','$email','$token','$token_exptime','$regtime')";
mysql_query($sql);

上述代码中,$token即构造好的激活识别码,它是由用户名、密码和当前时间组成并md5加密得来的。$token_exptime用于设置激活链接URL的过期时间,用户在这个时间段内可以激活帐号,本例设置的是24小时内激活有效。最后将这些字段插入到数据表t_user中。

当数据插入成功后,调用邮件发送类将激活信息发送给用户注册的邮箱,注意将构造好的激活识别码组成一个完整的URL作为用户点击时的激活链接,以下是详细代码:

if(mysql_insert_id()){ 
  $smtpserver = ""; //SMTP服务器,如:smtp.163.com 
  $smtpserverport = 25; //SMTP服务器端口,一般为25 
  $smtpusermail = ""; //SMTP服务器的用户邮箱,如xxx@163.com 
  $smtpuser = ""; //SMTP服务器的用户帐号xxx@163.com 
  $smtppass = ""; //SMTP服务器的用户密码 
  $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //实例化邮件类 
  $emailtype = "HTML"; //信件类型,文本:text;网页:HTML 
  $smtpemailto = $email; //接收邮件方,本例为注册用户的Email 
  $smtpemailfrom = $smtpusermail; //发送邮件方,如xxx@163.com 
  $emailsubject = "用户帐号激活";//邮件标题 
  //邮件主体内容 
  $emailbody = "亲爱的".$username.":<br/>感谢您在我站注册了新帐号。<br/>请点击链接激活您的帐号。<br/> 
  <a href='http://www.helloweba.com/demo/register/active.php?verify=".$token."' target= 
'_blank'>http://www.helloweba.com/demo/register/active.php?verify=".$token."</a><br/> 
  如果以上链接无法点击,请将它复制到你的浏览器地址栏中进入访问,该链接24小时内有效。"; 
  //发送邮件 
  $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); 
  if($rs==1){ 
    $msg = '恭喜您,注册成功!<br/>请登录到您的邮箱及时激活您的帐号!';   
  }else{ 
    $msg = $rs;   
  } 
} 
echo $msg;

还有一个相当好用且强大的邮件发送类分享个大家:使用PHPMailer发送带附件并支持HTML内容的邮件,直接可以用哦。

active.php

如果不出意外,您注册帐号时填写的Email将收到一封helloweba发送的邮件,这个时候您直接点击激活链接,交由active.php处理。

active.php接收提交的链接信息,获取参数verify的值,即激活识别码。将它与数据表中的用户信息进行查询对比,如果有相应的数据集,判断是否过期,如果在有效期内则将对应的用户表中字段status设置1,即已激活,这样就完成了激活功能。

include_once("connect.php");//连接数据库 
 
$verify = stripslashes(trim($_GET['verify'])); 
$nowtime = time(); 
 
$query = mysql_query("select id,token_exptime from t_user where status='0' and 
`token`='$verify'"); 
$row = mysql_fetch_array($query); 
if($row){ 
  if($nowtime>$row['token_exptime']){ //24hour 
    $msg = '您的激活有效期已过,请登录您的帐号重新发送激活邮件.'; 
  }else{ 
    mysql_query("update t_user set status=1 where id=".$row['id']); 
    if(mysql_affected_rows($link)!=1) die(0); 
    $msg = '激活成功!'; 
  } 
}else{ 
  $msg = 'error.';   
} 
echo $msg;

激活成功后,发现token字段并没有用处了,您可以清空。接下来我们会讲解用户找回密码的功能,也要用到邮箱验证,敬请关注。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php预定义常量
Dec 25 PHP
PHP校验ISBN码的函数代码
Jan 17 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
php下Memcached入门实例解析
Jan 05 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
PHP设计模式之模板方法模式定义与用法详解
Apr 02 PHP
PHP获取星期几的常用方法小结
Dec 18 PHP
PHP中的异常处理机制深入讲解
Nov 10 #PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 #PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 #PHP
关于PHP求解三数之和问题详析
Nov 09 #PHP
PHP中isset、empty的用法与区别示例详解
Nov 05 #PHP
PHP后门隐藏的一些技巧总结
Nov 04 #PHP
phpstudy2020搭建站点的实现示例
Oct 30 #PHP
You might like
PHP在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
pandas apply多线程实现代码
2020/08/17 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
美国存储和组织商店:The Container Store
2017/08/16 全球购物
英国家用电器购物网站:Hughes
2018/02/23 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
艺术专业大学生自我评价
2013/09/22 职场文书
优秀学生自我鉴定范例
2013/12/18 职场文书
致标枪运动员加油稿
2014/02/15 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
幼师个人总结范文
2015/02/28 职场文书
小学生安全保证书
2015/05/09 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server