本文将结合实例,讲解如何使用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. Docker 执行nginx以及简单进入container

    1. docker run -d --name mynginx nginx 运行起来nginx镜像之后 2. docker exec -ti mynginx /bin/bash 能够进入操作界面 发现 ...

  2. kali linux升级

    自己使用的是2017.2 版本的kali linux 想着升级一下 里面的包 比如msf 等 但是执行 msfupdate时提示 root@kali201702:~# msfupdate msfupd ...

  3. CSS实现垂直居中的5种思路

    前面的话 相对于水平居中,人们对于垂直居中略显为难,大部分原因是vertical-align不能正确使用.实际上,实现垂直居中也是围绕几个思路展开的.本文将介绍关于垂直居中的5种思路 line-hei ...

  4. FieldGroup绑定的日期类型存储格式的问题

    问题 日期存储的时候,当前数据库中存储格式为 "2017-9-5 0:00:00", 而我实现了以后,看到数据库的存储格式为 "Mon Sep 04 00:00:00 C ...

  5. MT【35】用复数得到的两组恒等式

    特别的,当$r\rightarrow1^{-}$时有以下两个恒等式: 第二个恒等式有关的自主招生试题参考博文MT[31]傅里叶级数为背景的三角求和 评:利用两种展开形式得到一些恒等式是复数里经常出现的 ...

  6. 自学Linux Shell6.2-用户自定义环境变量

    点击返回 自学Linux命令行与Shell脚本之路 6.2-用户自定义环境变量 1.设置局部用户定义变量 一旦启动bash shell(或者执行一个shell脚本),你就能创建这个shell进程可见的 ...

  7. 自学Python5.1-面向对象与面向过程

    自学Python之路 自学Python5.1-面向对象与面向过程 面向过程:根据业务逻辑从上到下写代码. 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开 ...

  8. js的==和===练习

    今天检查了一下JS的== 和===的区别 如下: 表达式                              值 1==true  true 1===true  false 0==false t ...

  9. es某个分片受损或卡在INITIALIZING状态时解决办法

    参考这篇文章 # OK last warning: you will probably lose data. Don't do this if you can't risk that. CLUSTER ...

  10. 字符串格式化format方法

    通过位置参数传参 print('{}, {}'.format('KeithTt', 18)) # KeithTt, 18 位置参数可以通过索引调用 print('{1}, {0}'.format('K ...