php实现邮箱激活功能
php实现邮箱激活功能
一、样例
二、文件结构
其中swiftmailer-master是第三方插件,用来发验证邮件
三、核心代码
doAction.php 响应页面
<?php
header("content-type:text/html;charset=utf-8;");
require_once 'config/config.php';
require_once 'functions/common.func.php';
require_once 'functions/mysql.func.php';
require_once 'swiftmailer-master/lib/swift_required.php';
$link = connect3();//数据库的连接
$table = "51zxw_user";//表名字
$act = $_REQUEST['act'];
$username = $_REQUEST['username'];
$password = md5($_REQUEST['password']); switch ($act){
case 'reg':
// echo '注册成功!';
//关闭事物的自动提交
mysqli_autocommit($link, false);
//得到当前时间
$regTime = time();
//得到邮箱
$email = $_POST['email'];
//生成一个token
$token = md5($username.$password.$regTime);
//生成一个token的过期时间
$token_exptime = $regTime+24*3600;//表示一天以后过期
//插入数据
$data = compact('username','password','email','regTime','token','token_exptime');
$res = insert($link, $data, $table);
//调用第三方的库发送邮件
//创建一个transport对象,确定发送到哪个邮箱
$transport = Swift_SmtpTransport::newInstance("smtp.sina.com",25);
//账号名
$transport->setUsername('clivelyn@sina.com');
//密码
$transport->setPassword('lin123');
//创建一个发送邮箱的对象
$mailer = Swift_Mailer::newInstance($transport);
//发送邮件要有发送人,要有标题,要有邮件主体
//发送邮件信息对象
$message = Swift_Message::newInstance();
//谁来发送
$message->setFormat(array('clivelyn@sina.com'));
//发送到哪里,谁注册,我发送到谁那里
$message->setTo($email);
//设置主题
$message->setSubject('注册账号激活邮箱');
//邮件中的链接
$activeStr = "?act=active&username={$username}&token={$token}";
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$activeStr;
//设置邮件的正文内容
//链接已经成功,url再加密
$urlEncode = urlencode($url);
// echo $urlEncode;
$emailBody = <<<EOF
欢迎{$username}使用账号激活功能,请点击连接激活账号:
<a href="{$url} target="_blank">{$urlEncode}</a><br/>
(该链接在24小时内有效) 如果上面不是链接形式,请将地址复制到您的浏览器(例如IE)的地址栏再访问。 EOF; //真正的发送
$message->setBody($emailBody,'text/html','utf-8');
try {
$res1 = $mailer->send($message);
if($res && $res1){
mysqli_commit($link);
mysqli_autocommit($link,true);
alertMes("注册信息,请激活使用", "index.php");
}
}catch (Swift_ConnectionException $e){
//echo $e;
die('邮件服务器错误:').$e->getMessage();
} break;
case 'active'://激活功能
// echo '激活成功!';
$token = $_GET['token'];
//因为要进行转义
$username = mysqli_real_escape_string($link, $username);
//sql语句
$query = "select id,token_exptime from {$table} where username='{$username}'";
//mysqli的查询语句
$user = fetchOne($link, $query);
if($user){
$now = time();
$token_exptime = $user['token_exptime'];
//判断是否激活过期
if($now>$token_exptime){//过期
delete($link, $table,"username={$username}");
alertMes("激活码过期,请重新注册", "index.php");
}else{//激活,把status改为1就好
$data = array('status'=>1);
$res = update($link, $data, $table);
if($res){//激活成功
alertMes("激活成功", "index.php");
}else{
alertMes("激活失败,请重新激活", "index.php");
}
}
}else{
alertMes("激活失败,没有找到要激活的用户", 'index.php');
}
break;
}
echo "<br/>你好";
工具函数
mysql.fun.php 封装的mysqli的工具
<?php
/**
* 连接
* @param string $host
* @param string $user
* @param string $password
* @param string $charset
* @param string $database
* @return object 连接标识符
*/
function connect1($host,$user,$password,$charset,$database) {
$link = mysqli_connect ( $host, $user, $password ) or die ( '数据库连接失败<br/>ERROR ' . mysqli_connect_errno () . ':' . mysqli_connect_error () );
mysqli_set_charset ( $link, $charset );
mysqli_select_db ( $link, $database ) or die ( '指定数据库打开失败<br/>ERROR ' . mysqli_errno ( $link ) . ':' . mysqli_error ( $link ) );
return $link;
}
/**
* 连接 需要传递数组
* @param array $config
* @return object
*/
function connect2($config) {
$link = mysqli_connect ( $config ['host'], $config ['user'], $config ['password'] ) or die ( '数据库连接失败<br/>ERROR ' . mysqli_connect_errno () . ':' . mysqli_connect_error () );
mysqli_set_charset ( $link, $config ['charset'] );
mysqli_select_db ( $link, $config ['dbName'] ) or die ( '指定数据库打开失败<br/>ERROR ' . mysqli_errno ( $link ) . ':' . mysqli_error ( $link ) );
return $link;
}
/**
* 用常量的形式建立连接
* @return unknown
*/
function connect3(){
$link = mysqli_connect ( DB_HOST, DB_USER, DB_PWD ) or die ( '数据库连接失败<br/>ERROR ' . mysqli_connect_errno () . ':' . mysqli_connect_error () );
mysqli_set_charset ( $link, DB_CHARSET );
mysqli_select_db ( $link, DB_DBNAME ) or die ( '指定数据库打开失败<br/>ERROR ' . mysqli_errno ( $link ) . ':' . mysqli_error ( $link ) );
return $link;
} /*
array(
'username'=>'king',
'password'=>'king',
'age'=>'12',
'regTime'=>'123123123'
);
INSERT user(username,password,age,regTime) VALUES('king','king','12','123123123');
*/
/**
* 插入操作
* @param object $link
* @param array $data
* @param string $table
* @return boolean
*/
function insert($link,$data,$table){
$keys = join ( ',', array_keys ( $data ) );
$vals = "'" . join ( "','", array_values ( $data ) ) . "'";
$query = "INSERT {$table}({$keys}) VALUES({$vals})";
$res = mysqli_query ( $link, $query );
if ($res) {
return mysqli_insert_id ( $link );
} else {
return false;
}
} /*
array(
'username'=>'king123',
'password'=>'king123',
'age'=>'32',
'regTime'=>'123123123'
);
UPDATE user SET username='king123',password='king123',age='32',regTime='123123123' WHERE id=1
*/
/**
* 更新操作
* @param object $link
* @param array $data
* @param string $table
* @param string $where
* @return boolean
*/
function update($link, $data, $table, $where = null) {
foreach ( $data as $key => $val ) {
$set .= "{$key}='{$val}',";
}
$set = trim ( $set, ',' );
$where = $where == null ? '' : ' WHERE ' . $where;
$query = "UPDATE {$table} SET {$set} {$where}";
$res = mysqli_query ( $link, $query );
if ($res) {
return mysqli_affected_rows ( $link );
} else {
return false;
}
} //DELETE FROM user WHERE id=
/**
* 删除操作
* @param object $link
* @param string $table
* @param string $where
* @return boolean
*/
function delete($link, $table, $where = null) {
$where = $where ? ' WHERE ' . $where : '';
$query = "DELETE FROM {$table} {$where}";
$res = mysqli_query ( $link, $query );
if ($res) {
return mysqli_affected_rows ( $link );
} else {
return false;
}
} /**
* 查询指定记录
* @param object $link
* @param string $query
* @param string $result_type
* @return array|boolean
*/
function fetchOne($link, $query, $result_type = MYSQLI_ASSOC) {
$result = mysqli_query ( $link, $query );
if ($result && mysqli_num_rows ( $result ) > 0) {
$row = mysqli_fetch_array ( $result, $result_type );
return $row;
} else {
return false;
}
} /**
* 查询所有记录
* @param object $link
* @param string $query
* @param string $result_type
* @return array|boolean
*/
function fetchAll($link, $query, $result_type = MYSQLI_ASSOC) {
$result = mysqli_query ( $link, $query );
if ($result && mysqli_num_rows ( $result ) > 0) {
while ( $row = mysqli_fetch_array ( $result, $result_type ) ) {
$rows [] = $row;
}
return $rows;
} else {
return false;
}
} /**
* 得到表中的记录数
* @param object $link
* @param string $table
* @return number|boolean
*/
function getTotalRows($link, $table) {
$query = "SELECT COUNT(*) AS totalRows FROM {$table}";
$result = mysqli_query ( $link, $query );
if ($result && mysqli_num_rows ( $result ) == 1) {
$row = mysqli_fetch_assoc ( $result );
return $row ['totalRows'];
} else {
return false;
}
} /**
* 得到结果集的记录条数
* @param object $link
* @param string $query
* @return boolean
*/
function getResultRows($link, $query) {
$result = mysqli_query ( $link, $query );
if ($result) {
return mysqli_num_rows ( $result );
} else {
return false;
}
} /**
* @param object $link
*/
function getServerInfo($link) {
return mysqli_get_server_info ( $link );
}
/**
* @param object $link
*/
function getClientInfo($link) {
return mysqli_get_client_info ( $link );
} /**
* @param object $link
*/
function getHostInfo($link){
return mysqli_get_host_info($link);
} /**
* @param object $link
*/
function getProtoInfo($link) {
return mysqli_get_proto_info ( $link );
}
跳转工具
common.func.php 激活成功之后的跳转
<?php
/**
* 弹出提示信息并且跳转
* @param string $mes
* @param string $url
*/
function alertMes($mes,$url){
echo "<script>
alert('{$mes}');
location.href='{$url}';
</script>";
die;
}
四、完整代码
完整代码我会放在GitHub上面
链接如下:
php实现邮箱激活功能的更多相关文章
- .NET下用C#实现邮箱激活功能
最近要用到安全邮箱激活的功能,故写篇博客记录下. 思路:在表中增加一个字段State来记录邮箱是否激活(0激活,1未激活.) 1.发送邮件. 1-1,给邮箱发送邮件.内容:激活地址+GUID. ...
- asp.net mvc 注册中的邮箱激活功能实现(一)
基本流程图 注册页面就不再写出,现在将发送邮件的代码粘贴出来 public ActionResult SendEmial() { ; string validataCode = System.Guid ...
- asp.net mvc 注册中的邮箱激活功能实现
基本流程图 注册页面就不再写出,现在将发送邮件的代码粘贴出来 public ActionResult SendEmial() { ; string validataCode = System.Gu ...
- asp.net mvc 注册中的邮箱激活功能实现(二)
邮件发送功能封装 /// <summary> /// 发送注册邮件 /// </summary> /// <param name ...
- Java实现邮箱激活验证
最近从项目分离出来的注册邮箱激活功能,整理一下,方便下次使用 RegisterValidateService.java [java] view plaincopyprint? package co ...
- Java案例-用户注册邮箱绑定激活功能实现
<–start–> 需求描述:当客户打开收到邮箱激活码的邮件,点击激活链接,正确填写激活码后就会完成邮箱激活的步骤. 在后台编程代码编写中,有以下几个要点: ① 接收客户的手机号码和邮箱激 ...
- javamail实现邮箱验证功能
javamail是基于SMTP协议和POP3协议的邮件发送与接收系统,在用户注册与登陆的过程中,常需要用到邮箱验证功能,下面是基于javamail的一个简单实现 用户注册后通过servlet得到邮箱地 ...
- SpringBoot实现网站注册,邮件激活码激活功能
项目源码:https://gitee.com/smfx1314/springbootemail 上一篇文章已经讲到如何springboot如何实现邮件的发送,趁热打铁,这篇文章实现如下功能. 很多网站 ...
- 使用Asp.Net Identity 2.0 认证邮箱激活账号(附DEMO)
注:本文系作者原创,但可随意转载.若有任何疑问或错误,欢迎与原作者交流,原文地址:http://www.cnblogs.com/lyosaki88/p/aspnet-itentity-ii-email ...
随机推荐
- caffe 参数介绍 solver.prototxt
转载自 http://blog.csdn.net/cyh_24/article/details/51537709 solver.prototxt net: "models/bvlc_alex ...
- redis启动加载过程、数据持久化
背景 公司一年的部分业务数据放在redis服务器上,但数据量比较大,单纯的string类型数据一年就将近32G,而且是经过压缩后的. 所以我在想能否通过获取string数据的时间改为保存list数据类 ...
- vue2.0项目中使用Ueditor富文本编辑器应用中出现的问题
1.如何设置config中的内容 readonly:true,//只读模式wordCount:false,//是否开启字数统计enableAutoSave: false,//自动保存功能 重点:ena ...
- datetime is null
本文转载自阿单<datetime is null> datetime 以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值同时当datetime 为 null时 ...
- 优动漫PAINT如何打开图形文件
优动漫PAINT也就是我们常说的clip studio paint(CSP)的中文版本,在优动漫PAINT软件中打开文件的方式有很多,您可以直接拖拽至优动漫PAINT界面或者文档窗口,也可以执行文件菜 ...
- re模块findall函数用法
title: Python subtitle: 1.re模块findall函数用法 date: 2018-12-13 10:17:28 --- Python re 模块 findall 函数用法简述 ...
- js和css引入文件消除缓存
?version=<?php echo filemtime('引用路径'); ?>
- rm -fr删除不了文件
向各位求教:一个阿里的 ecs服务器,放网站的.估计被挂马了,其中网站下的一个文件index.html,被篡改,想删除,但是删除不了. ls -l 结果:-r--r--r-- 1 www www ...
- C++基础 (3) 第三天 构造函数 构造函数初始化列表 拷贝构造函数 析构函数 静态成员变量
// 同类之间无私处 2构造函数 3析构函数 4构造函数的种类和析构函数的顺序 结论:析构函数的调用顺序,跟对象的构造顺序相反,谁先构造,谁最后一个被析构. 拷贝构造函数: 注意: 等号写在下面和写在 ...
- C语言提高 (6) 第六天 文件(续) 链表的操作
1昨日回顾 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &l ...