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实现邮箱激活功能的更多相关文章

  1. .NET下用C#实现邮箱激活功能

    最近要用到安全邮箱激活的功能,故写篇博客记录下. 思路:在表中增加一个字段State来记录邮箱是否激活(0激活,1未激活.) 1.发送邮件.     1-1,给邮箱发送邮件.内容:激活地址+GUID. ...

  2. asp.net mvc 注册中的邮箱激活功能实现(一)

    基本流程图 注册页面就不再写出,现在将发送邮件的代码粘贴出来 public ActionResult SendEmial() { ; string validataCode = System.Guid ...

  3. asp.net mvc 注册中的邮箱激活功能实现

    基本流程图 注册页面就不再写出,现在将发送邮件的代码粘贴出来   public ActionResult SendEmial() { ; string validataCode = System.Gu ...

  4. asp.net mvc 注册中的邮箱激活功能实现(二)

    邮件发送功能封装 /// <summary>        /// 发送注册邮件        /// </summary>        /// <param name ...

  5. Java实现邮箱激活验证

    最近从项目分离出来的注册邮箱激活功能,整理一下,方便下次使用 RegisterValidateService.java [java] view plaincopyprint?   package co ...

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

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

  7. javamail实现邮箱验证功能

    javamail是基于SMTP协议和POP3协议的邮件发送与接收系统,在用户注册与登陆的过程中,常需要用到邮箱验证功能,下面是基于javamail的一个简单实现 用户注册后通过servlet得到邮箱地 ...

  8. SpringBoot实现网站注册,邮件激活码激活功能

    项目源码:https://gitee.com/smfx1314/springbootemail 上一篇文章已经讲到如何springboot如何实现邮件的发送,趁热打铁,这篇文章实现如下功能. 很多网站 ...

  9. 使用Asp.Net Identity 2.0 认证邮箱激活账号(附DEMO)

    注:本文系作者原创,但可随意转载.若有任何疑问或错误,欢迎与原作者交流,原文地址:http://www.cnblogs.com/lyosaki88/p/aspnet-itentity-ii-email ...

随机推荐

  1. 浅谈Python Web 框架:Django, Twisted, Tornado, Flask, Cyclone 和 Pyramid

    Django Django 是一个高级的 Python Web 框架,支持快速开发,简洁.实用的设计.如果你正在建一个和电子商务网站相似的应用,那你应该选择用 Django 框架.它能使你快速完成工作 ...

  2. JAVA比较两张图相似度

    代码: package com.uiwho.com; import javax.imageio.*; import java.awt.image.*; import java.awt.*;//Colo ...

  3. html中<frameset>标签,框架结构各窗口的父级菜单子级菜单关系

    这个问题搞得我头大,并且在查过百度后各位大佬给出的解释我都不能理解,应该是我太白的原因,希望我写的能好理解. 下面文章窗口1.2.3,在代码里分别为chuangkou.chuangkou1.chuan ...

  4. JavaScript定时器的开启关闭

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...

  5. mysql 各项操作流程

    启动mysql:进入命令行输入:net start mysql 如果失败则显示:服务名无效,需跳转到指定Bin目录下进行启动mysql, 成功则进行下一步:登陆 :mysql -uroot -proo ...

  6. 换个语言学一下 Golang (2)——基础语法

    Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.比如下面的hello world就是由 6 个标记组成: 行分隔符 在 Go 程序中,一行代表一个语句结束.每个语句 ...

  7. Exact Change FreeCodeCamp

    function checkCashRegister(price, cash, cid) { var change; var sumCid = 0; // Here is your change, m ...

  8. http请求后台报406错误

    1.springMVC的项目,通过浏览器访问后台方法遇到了报406的错误,找了很多原因,最终发现是因为缺少spring-mvc的json配置. 2.添加依赖:jackson-databind.jack ...

  9. Git 本地项目添加多个远程仓库

    做了一个小玩意儿,是在 码云 上做的仓储: 还想同时放在 github 上做个备份: 就在 github 上创建了一个新的项目地址: 可以看出,官方给了三种导入方式: 1.创建一个新的项目: 2.推送 ...

  10. Python笔记17---------魔法方法

    魔法方法也为特殊方法,即用两个下划线形成的(__方法__).自己定义的方法最好不要采用这种方式,因为这些方法会在一些特殊的情况下直接被调用. 1.第一个魔法方法:类中常用的__init__()方法:相 ...