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 相关文章推荐
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
解析PHP工厂模式的好处
Jun 18 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
如何让搜索引擎抓取AJAX内容解决方案
Aug 25 PHP
php随机取mysql记录方法小结
Dec 27 PHP
Thinkphp关闭缓存的方法
Jun 26 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
PHP使用数组实现矩阵数学运算的方法示例
May 29 PHP
php smtp实现发送邮件功能
Jun 22 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
实例化php类时传参的方法分析
Jun 05 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
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
php随机显示图片的简单示例
2014/02/15 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
2020/08/06 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
react build 后打包发布总结
2018/08/24 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
Angular脚手架开发的实现步骤
2019/04/09 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
js实现省级联动(数据结构优化)
2020/07/17 Javascript
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
python datetime中strptime用法详解
2019/08/29 Python
python实现大学人员管理系统
2019/10/25 Python
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
会计自荐书
2013/12/02 职场文书
售后主管岗位职责
2013/12/08 职场文书
入党积极分子评语
2014/05/04 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
物流管理专业自荐信
2014/06/23 职场文书
户籍证明书标准模板
2014/09/10 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
个人党性分析总结
2015/03/05 职场文书
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫