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

业务流程

1、用户提交注册信息。

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

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

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

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

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

准备数据表

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

DROP TABLE IF EXISTS `wechat_user`;
CREATE TABLE `wechat_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`orgId` int(11) DEFAULT '' COMMENT '组织ID',
`username` varchar(40) DEFAULT NULL,
`password` varchar(40) NOT NULL,
`nickName` varchar(40) DEFAULT NULL,
`mobile` varchar(20) DEFAULT NULL,
`openId` varchar(50) DEFAULT NULL,
`createTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
`checkFlag` int(2) DEFAULT NULL,
`enabled` tinyint(2) DEFAULT '',
`accessExpires` int(12) DEFAULT NULL,
`accessToken` varchar(128) DEFAULT NULL,
`reTime` varchar(32) DEFAULT NULL,
`email` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=434 DEFAULT CHARSET=utf8 COMMENT='组织和用户关系表';

视图:

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

发送邮件:

 /**
* 发送邮件
*/
public function send_email()
{
$usernName = I('post.userName','Guest112');
$passWord = I('post.passWord','123456'.rand(1000,9999));
$email = I('post.email','756684177@qq.com');
$reTime = time();
$accessToken = md5($usernName . $passWord . $reTime);//创建用于激活识别码
$accessExpires = $reTime + 60 * 60 * 24; //过期时间为24小时后
$model = M('User');
$data['username'] = $usernName;
$data['password'] = $passWord;
$data['nickName'] = $usernName;
$data['accessToken'] = $accessToken;
$data['accessExpires'] = $accessExpires;
$data['reTime'] = $reTime;
$data['email'] = $email;
$data['enabled'] = 0;
if ($model->add($data) == false) return 'error';
echo 'success';
$link = "http://wechatu.xd107.com/home/Index/activation?accessToken={$accessToken}";
$str = <<<html
您好!<p></p>
感谢您在Tinywan世界注册帐户!<p></p>
帐户需要激活才能使用,赶紧激活成为Tinywan家园的正式一员吧:)<p></p>
点击下面的链接立即激活帐户(或将网址复制到浏览器中打开):<p></p>
$link html;
$result = send_email($email, 'Tinywan世界帐户激活邮件--' . $usernName, $str);
if ($result['error'] == 1) {
var_dump($result);
die;
}
var_dump('发送完成');
}

激活邮件:

// 用户点击激活方法
public function activation()
{
$accessToken = I('get.accessToken');
$nowTime = time();
$where['enabled'] = 0;
$where['accessToken'] = $accessToken;
$res = M('User')->where($where)->find();
if (!$res) exit('没有改账户');
if ($nowTime > $res['accessexpires']) exit('您的激活有效期已过,请登录您的帐号重新发送激活邮件');
$update = M('User')->where(array('id' => $res['id']))->setField('enabled', 1);
if ($update == false) exit('修改数据库字段失败');
$link = "http://wechatu.xd107.com/home/Index/qrcode?accessToken={$accessToken}"; //这里跳转到一个个人博客的二维码
header('location:' . $link);
}

附:发送邮件方法:

/**
* 发送邮件
* @param string $address 需要发送的邮箱地址 发送给多个地址需要写成数组形式
* @param string $subject 标题
* @param string $content 内容
* @return boolean 是否成功
*/
function send_email($address, $subject, $content)
{
$email_smtp = C('EMAIL_SMTP');
$email_username = C('EMAIL_USERNAME');
$email_password = C('EMAIL_PASSWORD');
$email_from_name = C('EMAIL_FROM_NAME');
if (empty($email_smtp) || empty($email_username) || empty($email_password) || empty($email_from_name)) {
return array("error" => 1, "message" => '邮箱配置不完整');
}
require './ThinkPHP/Library/Org/Nx/class.phpmailer.php';
require './ThinkPHP/Library/Org/Nx/class.smtp.php';
$phpmailer = new \Phpmailer();
// 设置PHPMailer使用SMTP服务器发送Email
$phpmailer->IsSMTP();
// 设置为html格式
$phpmailer->IsHTML(true);
// 设置邮件的字符编码'
$phpmailer->CharSet = 'UTF-8';
// 设置SMTP服务器。
$phpmailer->Host = $email_smtp;
// 设置为"需要验证"
$phpmailer->SMTPAuth = true;
// 设置用户名
$phpmailer->Username = $email_username;
// 设置密码
$phpmailer->Password = $email_password;
// 设置邮件头的From字段。
$phpmailer->From = $email_username;
// 设置发件人名字
$phpmailer->FromName = $email_from_name;
// 添加收件人地址,可以多次使用来添加多个收件人
if (is_array($address)) {
foreach ($address as $addressv) {
$phpmailer->AddAddress($addressv);
}
} else {
$phpmailer->AddAddress($address);
}
// 设置邮件标题
$phpmailer->Subject = $subject;
// 设置邮件正文
$phpmailer->Body = $content;
// 发送邮件。
if (!$phpmailer->Send()) {
$phpmailererror = $phpmailer->ErrorInfo;
return array("error" => 1, "message" => $phpmailererror);
} else {
return array("error" => 0);
}
}

代码详细见:https://github.com/Tinywan/ThinkPhpStudy

ThinkPHP 3.2 用户注册邮箱验证激活帐号的更多相关文章

  1. PHP用户注册邮箱验证激活帐号

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

  2. PHP用户注册邮箱并验证激活帐号

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

  3. ThinkPHP 3.2 用户注册邮箱验证帐号找回密码

    一.前言 当然现在有的网站也有手机短信的方式找回密码,原理就是通过发送验证码来验明正身,和发送邮件验证一样,最终还是要通过重置密码来完成找回密码的流程. 本文将使用PHP+Mysql+jQuery来实 ...

  4. (进阶篇)PHP实现用户注册后邮箱验证,激活帐号

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

  5. (进阶篇)PHP(thinkphp5框架)实现用户注册后邮箱验证,激活帐号

    本文将结合实例,讲解如何使用thinkphp5+Mysql完成注册帐号.发送激活邮件.验证激活帐号.处理URL链接过期的功能. 业务流程 1.用户提交注册信息. 2.写入数据库,此时帐号状态未激活. ...

  6. .net 实现注册邮箱验证激活

    没事上网当了个注册邮箱验证激活的代码,用起来感觉还不错,特意和大家要一起分享一下 下面是主要实现代码: uing System.Net.Mail; public partial class jquer ...

  7. [转]C# 邮箱验证激活

    原文链接 /// <summary> /// 发送邮件 发送激活码 /// </summary> /// <param name="address"& ...

  8. Java案例-用户注册邮箱绑定激活功能实现

    <–start–> 需求描述:当客户打开收到邮箱激活码的邮件,点击激活链接,正确填写激活码后就会完成邮箱激活的步骤. 在后台编程代码编写中,有以下几个要点: ① 接收客户的手机号码和邮箱激 ...

  9. thinkphp phpmailer邮箱验证

    thinkphp 关于phpmailer的邮箱验证 一  . 登陆自己的邮箱,例如:qq邮箱.登陆qq邮箱在账户设置中开启smtp服务: 之后回发送一个授权码 , 这个授权码先保存下来,这个授权码在后 ...

随机推荐

  1. PHP 4种输出的方式

    <?php //测试用的数组 $info = array('11'=>'aaa', '22'=>'bbb', '33'=>'ccc'); //第一种,将整个数组作为一个对象输出 ...

  2. Java之Array(数组)说明

    代码说明: package array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** ...

  3. CSS兼容性详解

    前面的话 对于前端工程师来说,不想面对又不得不面对的一个问题就是兼容性.在几年之前,处理兼容性,一般地就是处理IE低版本浏览器的兼容性.而近几年,随着移动端的发展,工程师也需要注意手机兼容性了.本文将 ...

  4. Django的datetime.timedelta类(Django编程-2)

    datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象. 如果有人问你昨天是几号,这个很容易就回答出来了.但是如果 ...

  5. ceph S3测试--cosbench

    COSBench安装 Cosbench是Intel的开源云存储性能测试软件,COSBench目前已经广泛使用与云存储测试,并作为云存储的基准测试工具使用 1 环境 1.1 操作系统 COSBench可 ...

  6. Python3网络爬虫(3):使用User Agent和代理IP隐藏身份

    Python版本: python3 IDE: pycharm2017.3.3 一.为何要设置User Agent 有一些网站不喜欢被爬虫访问,所以会检测对象,如果是爬虫程序,他就会不让你访问,通过设置 ...

  7. emwin 之变量定义位置

    @2018-08-13 小记 本意是想在回调函数中定义一变量暂存下拉框操作前的的设定值,与后期更改的设定值作比较后更新操作,但结果失败了 分析后,此变量定义为局部变量,emwin回调函数又是事件触发型 ...

  8. Division, UVa 72(暴力求解)

    题目链接:https://vjudge.net/problem/UVA-725 Write a program that finds and displays all pairs of 5-digit ...

  9. JavaScript -- throw、try 和 catch

    try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. 很想java哦. <!DOCTYPE html> <html> <head& ...

  10. HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径)

    HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径) Description A group of researchers ar ...