【转存】帐号经过邮箱找回密码功能设计

帐号经过邮箱找回密码功能设计

javascript

 php

一般所说的密码找回功能不是真的能把忘记的密码找回,由于咱们的密码是加密保存的,通常开发者会在验证用户信息后经过程序生成一个新密码或者生成一个特定的连接并发送邮件到用户邮箱,用户从邮箱连接到网站的重置密码模块从新设置新密码。css

固然如今有的网站也有手机短信的方式找回密码,原理就是经过发送验证码来验明正身,和发送邮件验证同样,最终仍是要经过重置密码来完成找回密码的流程。 
密码找回的功能,通常步骤是:html

1.表单输入注册时的邮箱; 2.验证用户邮箱是否正确,若是用户邮箱不存在网站的用户表中,则提示用户邮箱未注册; 3.发送邮件,若是用户邮箱确实存在用户表中,则组合用于验证用户信息的字符串,并构造URL发送到用户邮箱中; 4.用户登陆邮箱收取邮件,点击URL连接到网站验证程序; 5.网站程序经过用户请求的字符串查询本地用户表,比对用户信息是否正确; 6.若是正确则转到重置密码页面从新设置新密码,反之则提示用户验证无效。

 

HTML 
咱们在找回密码的页面上放置一个要求用户输入注册时所用的邮箱,而后提交前台js来处理交互。前端

<p><strong>输入您注册的电子邮箱,找回密码:</strong></p> <p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p> <p><input type="button" class="btn" id="sub_btn" value="提 交"></p> 

 

jQuery 
当用户输入完邮箱并点击提交后,jQuery先验证邮箱格式是否正确,若是正确则经过向后台sendmail.php发送Ajax请求,sendmail.php负责验证邮箱是否存在和发送邮件,并会返回相应的处理结果给前台页面,请看jQuery代码:java

$(function(){ $("#sub_btn").click(function(){ var email = $("#email").val(); var preg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; //匹配Email if(email=='' || !preg.test(email)){ $("#chkmsg").html("请填写正确的邮箱!"); }else{ $("#sub_btn").attr("disabled","disabled").val('提交中..').css("cursor","default"); $.post("sendmail.php",{mail:email},function(msg){ if(msg=="noreg"){ $("#chkmsg").html("该邮箱还没有注册!"); $("#sub_btn").removeAttr("disabled").val('提 交').css("cursor","pointer"); }else{ $(".demo").html("<h3>"+msg+"</h3>"); } }); } }); }) 

 

以上使用的jQuery代码很方便简洁的完成了前端交互操做,若是您有必定的jQuery基础,那上面的代码一目了然,很少解释。mysql

PHP 
sendmail.php须要验证Email是否存在系统用户表中,若是有,则读取用户信息,将用户id、用户名和密码惊醒md5加密生成一个特别的字符串做为找回密码的验证码,而后构造URL。同时咱们为了控制URL连接的时效性,将记录用户提交找回密码动做的操做时间,最后调用邮件发送类发送邮件到用户邮箱,发送邮件类smtp.class.php已经打包好,请下载。web

include_once("connect.php");//链接数据库 $email = stripslashes(trim($_POST['mail'])); $sql = "select id,username,password from `t_user` where `email`='$email'"; $query = mysql_query($sql); $num = mysql_num_rows($query); if($num==0){//该邮箱还没有注册! echo 'noreg'; exit; }else{ $row = mysql_fetch_array($query); $getpasstime = time(); $uid = $row['id']; $token = md5($uid.$row['username'].$row['password']);//组合验证码 $url = "http://www.helloweba.com/demo/resetpass/reset.php?email=".$email." &token=".$token;//构造URL $time = date('Y-m-d H:i'); $result = sendmail($time,$email,$url); if($result==1){//邮件发送成功 $msg = '系统已向您的邮箱发送了一封邮件<br/>请登陆到您的邮箱及时重置您的密码!'; //更新数据发送时间 mysql_query("update `t_user` set `getpasstime`='$getpasstime' where id='$uid '"); }else{ $msg = $result; } echo $msg; } //发送邮件 function sendmail($time,$email,$url){ include_once("smtp.class.php"); $smtpserver = ""; //SMTP服务器,如smtp.163.com $smtpserverport = 25; //SMTP服务器端口 $smtpusermail = ""; //SMTP服务器的用户邮箱 $smtpuser = ""; //SMTP服务器的用户账号 $smtppass = ""; //SMTP服务器的用户密码 $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //这里面的一个true是表示使用身份验证,不然不使用身份验证. $emailtype = "HTML"; //信件类型,文本:text;网页:HTML $smtpemailto = $email; $smtpemailfrom = $smtpusermail; $emailsubject = "Helloweba.com - 找回密码"; $emailbody = "亲爱的".$email.":<br/>您在".$time."提交了找回密码请求。请点击下面的连接重置密码 (按钮24小时内有效)。<br/><a href='".$url."'target='_blank'>".$url."</a>"; $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); return $rs; } 

 

好了,这个时候你的邮箱将会收到一封来自helloweba的密码找回邮件,邮件内容中有一个URL连接,点击该连接到helloweba.com的reset.php来验证邮箱。sql

include_once("connect.php");//链接数据库 $token = stripslashes(trim($_GET['token'])); $email = stripslashes(trim($_GET['email'])); $sql = "select * from `t_user` where email='$email'"; $query = mysql_query($sql); $row = mysql_fetch_array($query); if($row){ $mt = md5($row['id'].$row['username'].$row['password']); if($mt==$token){ if(time()-$row['getpasstime']>24*60*60){ $msg = '该连接已过时!'; }else{ //重置密码... $msg = '请从新设置密码,显示重置密码表单,<br/>这里只是演示,略过。'; } }else{ $msg = '无效的连接'; } }else{ $msg = '错误的连接!'; } echo $msg; 

 

reset.php首先接受参数email和token,而后根据email查询数据表t_user中是否存在该Email,若是存在则获取该用户的信息,而且和sendmail.php中的token组合方式同样构建token值,而后与url传过来的token进行对比,若是当前时间与发送邮件时的时间相差超过24小时的,则提示“该连接已过时!”,反之,则说明连接有效,而且调转到重置密码页面,最后就是用户本身设置新密码了数据库

 

 

知识点补充:

http://www.w3school.com.cn/php/php_mysql_connect.asp

链接到一个 MySQL 数据库

在您可以访问并处理数据库中的数据以前,您必须建立到达数据库的链接。

在 PHP 中,这个任务经过 mysql_connect() 函数完成。

语法

mysql_connect(servername,username,password);
参数 描述
servername 可选。规定要链接的服务器。默认是 "localhost:3306"。
username 可选。规定登陆所使用的用户名。默认值是拥有服务器进程的用户的名称。
password 可选。规定登陆所用的密码。默认是 ""。

注释:虽然还存在其余的参数,但上面列出了最重要的参数。请访问 W3School 提供的 PHP MySQL 参考手册,得到更多的细节信息。

例子

在下面的例子中,咱们在一个变量中 ($con) 存放了在脚本中供稍后使用的链接。若是链接失败,将执行 "die" 部分:

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

// some code

?>

关闭链接

脚本一结束,就会关闭链接。如需提早关闭链接,请使用 mysql_close() 函数。

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

// some code

mysql_close($con);
?>
相关文章
相关标签/搜索