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语法(2)
Oct 09 PHP
phpMyadmin 用户权限中英对照
Apr 02 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
PHP 第二节 数据类型之转换
Apr 28 PHP
解析php常用image图像函数集
Jun 24 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
php环境套包 dedeampz 伪静态设置示例
Mar 26 PHP
Opcache导致php-fpm崩溃nginx返回502
Mar 02 PHP
php操作redis缓存方法分享
Jun 03 PHP
laravel自定义分页效果
Jul 23 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 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
MySQL授权问题总结
2007/05/06 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
wxpython学习笔记(推荐查看)
2014/06/09 Python
python框架中flask知识点总结
2018/08/17 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
在python3中实现更新界面
2020/02/21 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
python实现猜单词游戏
2020/05/22 Python
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
小学教师培训方案
2014/06/09 职场文书
余世维讲座观后感
2015/06/11 职场文书
人与自然的观后感
2015/06/18 职场文书
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js