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中使用Oracle数据库(4)
Oct 09 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
Apr 22 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
深入解析php之apc
May 15 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
php设计模式之委托模式
Feb 13 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
Sep 22 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
php数组指针函数功能及用法示例
Feb 11 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 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使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
jQuery实用基础超详细介绍
2013/04/11 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
详解python时间模块中的datetime模块
2016/01/13 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
python批量赋值操作实例
2018/10/22 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
python里 super类的工作原理详解
2019/06/19 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
市场营销职业生涯规划书范文
2014/01/12 职场文书
四年级学生评语大全
2014/04/21 职场文书
正科级干部考察材料
2014/05/29 职场文书
专项法律服务方案
2014/06/11 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
win10下go mod配置方式
2021/04/25 Golang
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript