PHP实现的激活用户注册验证邮箱功能示例


Posted in PHP onJune 06, 2017

本文实例讲述了PHP实现的激活用户注册验证邮箱功能。分享给大家供大家参考,具体如下:

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

注册邮箱激活流程

1、用户注册
2、插入用户数据,此时帐号未激活状态。
3、将用户名密码或其他标识字符加密构造成激活识别码(你也可以叫激活码)。
4、将构造好的激活识别码组成URL发送到用户提交的邮箱。
5、用户登录邮箱并点击URL,进行激活。
6、验证激活识别码,如果正确则激活帐号。

t_user.sql

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

HTML

以下是一个注册表单,用户可以输入注册信息,包括用户名、密码和邮箱。

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

register.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()) {//写入成功,发邮件
  include_once("smtp.class.php");
  $smtpserver = "smtp.163.com"; //SMTP服务器
  $smtpserverport = 25; //SMTP服务器端口
  $smtpusermail = "hjl416148489_4@163.com"; //SMTP服务器的用户邮箱
  $smtpuser = "hjl416148489_4@163.com"; //SMTP服务器的用户帐号
  $smtppass = "hjl7233163"; //SMTP服务器的用户密码
  $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //这里面的一个true是表示使用身份验证,否则不使用身份验证.
  $emailtype = "HTML"; //信件类型,文本:text;网页:HTML
  $smtpemailto = $email;
  $smtpemailfrom = $smtpusermail;
  $emailsubject = "用户帐号激活";
  $emailbody = "亲爱的" . $username . ":<br/>感谢您在我站注册了新帐号。<br/>请点击链接激活您的帐号。<br/><a href='https://3water.com/demo/active.php?verify=" . $token . "' target='_blank'>https://3water.com/demo/active.php?verify=" . $token . "</a><br/>如果以上链接无法点击,请将它复制到你的浏览器地址栏中进入访问,该链接24小时内有效。<br/>如果此次激活请求非你本人所发,请忽略本邮件。<br/><p style='text-align:right'>-------- 三水点靠木https://3water.com敬上</p>";
  $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype);
  if ($rs == 1) {
    $msg = '恭喜您,注册成功!<br/>请登录到您的邮箱及时激活您的帐号!';
  } else {
    $msg = $rs;
  }
  echo $msg;
}

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字段并没有用处了,您可以清空。并且status激活状态变为1了。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php单件模式结合命令链模式使用说明
Sep 07 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
Jul 02 PHP
php绘制一个扇形的方法
Jan 24 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
PHP实现懒加载的方法
Mar 07 PHP
PHP常用的排序和查找算法
Aug 06 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
Aug 01 PHP
php获取excel文件数据
Apr 21 PHP
PHP使用CURL实现下载文件功能示例
Jun 03 PHP
PHP7.3.10编译安装教程
Oct 08 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 #PHP
PHP培训要多少钱
Jun 06 #PHP
Mac系统完美安装PHP7详细教程
Jun 06 #PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 #PHP
PHP PDO操作MySQL基础教程
Jun 05 #PHP
PHP生成各种随机验证码的方法总结【附demo源码】
Jun 05 #PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 #PHP
You might like
php 5.3.5安装memcache注意事项小结
2011/04/12 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
javascript 动态添加表格行
2006/06/22 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中使用PDB库调试程序
2015/04/05 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
python占位符输入方式实例
2019/05/27 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
python线程中的同步问题及解决方法
2019/08/29 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python