邮箱注册,激活后才能登录在几年前是非常流行的平台注册模式之一,虽然随着移动端智能化的崛起,很多平台已经可以通过账号关联无需注册就可以登录了,但邮箱注册激活后才能登录的方式依然还有很多平台在使用。
今天分享的是在php中如何实现账号注册,邮箱激活登录。本次教程php实现邮件发送功能主要使用的 swiftmailer-master 类库。
<?php
require_once '../function/autoload.php';
require_once '../function/PdoMysql.class.php'; //pdo数据库操作类
require_once 'config.php'; //数据库配置信息
require_once '../function/swiftmailer/swiftmailer/lib/swift_required.php';//邮件发送类库
require_once 'pwd.php'; //QQ邮箱smtp密码(不是QQ邮箱密码)
require_once '../function/JwtAuth.php'; //JWT token生成类
$act = $_GET['act'];
$pdoDb = new PdoMysql();
switch ($act){
case 'reg':
//注册
break;
case 'login':
//登录
break;
case 'active':
//激活
break;
default:break;
}平台注册的三大功能:注册-激活-登录。
前台的注册-登录-激活表单这里就不说了,无非就是通过 form 表单给后端传送数据。
1、注册:
这里我把注册分为了三块
①把用户名、密码、邮箱、账号注册时间写入用户表。
②通过用户账号id生成Token,并写入对应用户数据表。
【不知道Token怎么生成的,可以看 php开发app接口之Token的生成实现 这篇文章,里面详细的介绍了利用 JWT 生成 token 的步骤】
③发送邮件通知用户激活账号。
【发送邮件需要注意的事项:QQ邮箱需要把 POP3/SMTP服务 IMAP/SMTP服务开启,开启后会有一个秘密,这个秘密就是我们下面程序中发送邮件有的密码】
【所有的输入都是有害的,因此在获取前端表单传送过来的数据时要先过滤。】

case 'reg':
//注册
//①数据表中写入基础数据
$user_name = addslashes($_POST['username']);
//密码加密
$password = _md5(addslashes($_POST['password']));
$email = addslashes($_POST['email']);
$created_at = time();
$data = compact('user_name', 'password', 'email', 'created_at');
$res = $pdoDb->add($data,'user');
if ($res){
//②获取用户id,生成token
$uid = $pdoDb->getLastInsertId();
$jwtAuth = JwtAuth::getInstance();
$token = $jwtAuth->setUid($uid)->encode()->getToken();
$token_exptime = time()+3600*24;
$dataUpdate = compact('token', 'token_exptime');
$resUpdate = $pdoDb->update($dataUpdate, 'user', 'user_id='.$uid);
//③发送激活邮件
//配置邮件服务器,得到传输对象
$transport=Swift_SmtpTransport::newInstance('smtp.qq.com',465,'ssl');
//设置登陆帐号和密码
$transport->setUsername('739120308@qq.com');
$transport->setPassword($emailPassword);
//得到发送邮件对象Swift_Mailer对象
$mailer=Swift_Mailer::newInstance($transport);
//得到邮件信息对象
$message=Swift_Message::newInstance();
//设置管理员的信息
$message->setFrom(array('739120308@qq.com'=>'BY'));
//将邮件发给谁
$message->setTo(array($email=>'BY'));
//设置邮件主题
$message->setSubject('激活邮件');
$url="http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?act=active&token={$token}";
$urlencode=urlencode($url);
$str=<<<EOF
亲爱的{$user_name}您好~!感谢您注册我们网站<br/>
请点击此链接激活帐号即可登陆!<br/>
<a href="{$url}">{$urlencode}</a>
<br/>
如果点此链接无反映,可以将其复制到浏览器中来执行,链接的有效时间为24小时。
EOF;
$message->setBody("{$str}",'text/html','utf-8');
try{
if($mailer->send($message)){
echo "恭喜您{$user_name}注册成功,请到邮箱激活之后登陆<br/>";
echo '3秒钟后跳转到登陆页面';
echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
}else{
$pdoDb->delete($table,'id='.$uid);
echo '注册失败,请重新注册';
echo '3秒钟后跳转到注册页面';
echo '<meta http-equiv="refresh" content="3;url=index.php#toregister"/>';
}
}catch(Swift_ConnectionException $e){
echo '邮件发送错误'.$e->getMessage();
}
}
break;2、激活
账号激活注意通过验证 token 的有效性以及是否过期来激活。token 的验证可以参考这里文章 app接口开发之Token的发放与验证 。
token 验证通过后需要把账号的状态改为激活状态,因为 token 是根据用户 id 生成的,因此这里可以直接用token作为条件来修改账号状态,减少了数据库的二次操作。
账号激活失败的两种处理方式:
①把激活失败的用户其信息从数据表中删除,让他重新注册激活。
②提供一个激活入口,让用户提供注册邮箱或者用户名,然后重新发送激活邮箱。
case 'active':
//激活
$token = $_GET['token'];
//token验证
$jwtAuth = JwtAuth::getInstance();
$jwtAuth = $jwtAuth->setToken($token);
if ($jwtAuth->validate() && $jwtAuth->verify()){
$status = 1;
$dataUpdate = compact('status');
//token是唯一的,可以直接用token作为条件来修改状态
$activeRes = $pdoDb->update($dataUpdate,'user', 'token="'.$token. '" AND status="0"');
if ($activeRes){
echo '激活成功';
echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
}else{
echo '激活失败,请重新激活';
echo '<meta http-equiv="refresh" content="3;url=index.php#toactive"/>';
}
}else{
echo 'token过期,请重新激活';
echo '<meta http-equiv="refresh" content="3;url=index.php#toactive"/>';
}
break;3、登陆
登陆有两步验证:
用户名、密码验证;
激活状态验证。
case 'login':
//登录
$user_name = addslashes($_POST['username']);
//密码加密,可自定义加密方法,也可以用php自带的加密方法,这里使用的是自定义加密方法
$password = _md5(addslashes($_POST['password']));
$res = $pdoDb->find('user', 'username='.$user_name,'user_id,password,status');
if ($password == $res['password']){
if ($res['status']==1){
echo '登录成功';
}else{
echo '请先激活再登录';
echo '<meta http-equiv="refresh" content="3;url=index.php#toactive"/>';
}
}else{
echo '用户名或密码错误,请重新登录';
echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
}
break;php 账号注册 QQ邮箱激活才能登录的教程就分享到这里,有什么不明白的可以评论留言或者可以邮箱邮件留言。
