Ajax+PHPMailer实现邮箱找回密码功能

       前两天实现了一个通过邮箱找回密码的功能,今天来做一个总结:

首先,需要开启邮箱的IMAP/SMTP服务,我用的是QQ邮箱的,会获取一个IMAP/SMTP服务密码:如uudwdedzxbhmhjhb;在这个位置:

Ajax+PHPMailer实现邮箱找回密码功能_第1张图片

文件目录结构如下:

Ajax+PHPMailer实现邮箱找回密码功能_第2张图片其中PHPMailer是php自带的发送邮件功能并封装好的代码,主要会用到src下PHPMailer.php和SMTP.php文件,这些文件在网上都是很容易找到的;

find_pwd.php是邮箱输入界面:

Ajax+PHPMailer实现邮箱找回密码功能_第3张图片





找回密码





找回密码

返回登录界面

上面都是前端界面,通过Ajax的post提交值到后台send_email.php进行处理,其中$data是方便我测试数据是否测通用的,$url可能需要更改,用$_SERVER['REQUEST_URI']获取url地址更好,这个$url是发送到用户的邮箱中的用来修改密码的链接,对于我的require_once()的引用文件,PHPMailer.php和SMTP中的命名空间namespace需要注释掉,不然会报错;或者引用文件的路径换一下:

query($sql)){
        $row = $smt->fetch(PDO::FETCH_BOTH);
        if($data['email'] = $row['email']){
            $data['mess'] = "接受成功!";
            $data['success'] = 1;
            $u_id = $row['id'];
            $data['id'] = $u_id;
            $token = md5($u_id.$row['user'].$row['password']);
            $data['token'] = $token;
            $url = "http://localhost/project/interview_practice/20181017/2018101701/find_pwd/reset_pwd.php?email=".$email."&token=".$token;
            $time = date('Y-m-d H:i:s');
            $data['time'] = $time;
            $result = sendemail($time,$email,$url);
            if($result){
                $msg = '系统已向您的邮箱发送了一封邮件
请登录到您的邮箱及时重置您的密码!'; $update_time = time(); $sql1 = "update users set update_time='$update_time' where id='$u_id'"; $pdo->query($sql1); }else{ $msg = $result; } $data['msg'] = $msg; }else{ $data['mess'] = "接收失败!"; $data['email'] = ""; $data['id'] = ""; $data['token'] = ""; $time = date('Y-m-d H:i:s'); $data['time'] = $time; $data['success'] = 0; $data['msg'] = ''; } }else{ $data['email'] = ""; $data['id'] = ""; $data['token'] = ""; $time = date('Y-m-d H:i:s'); $data['time'] = $time; $data['mess'] = "该邮箱并未注册!"; $data['success'] = 0; $data['msg'] = ''; } echo json_encode($data); } getemail(); function sendemail($time,$email,$url){ // 引入PHPMailer的核心文件 require_once("PHPMailer/src/PHPMailer.php"); require_once("PHPMailer/src/SMTP.php"); // 实例化PHPMailer核心类 $mail = new PHPMailer(); // 是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式 $mail->SMTPDebug = 1; // 使用smtp鉴权方式发送邮件 $mail->isSMTP(); // smtp需要鉴权 这个必须是true $mail->SMTPAuth = true; // 链接qq域名邮箱的服务器地址 $mail->Host = 'smtp.qq.com'; // 设置使用ssl加密方式登录鉴权 $mail->SMTPSecure = 'ssl'; // 设置ssl连接smtp服务器的远程服务器端口号 $mail->Port = 465; // 设置发送的邮件的编码 $mail->CharSet = 'UTF-8'; // 设置发件人昵称 显示在收件人邮件的发件人邮箱地址前的发件人姓名 $mail->FromName = '残阳'; // smtp登录的账号 QQ邮箱即可 $mail->Username = '[email protected]'; // smtp登录的密码 使用生成的授权码 $mail->Password = 'uudwdedzxbhmhjhb'; // 设置发件人邮箱地址 同登录账号 $mail->From = '[email protected]'; // 邮件正文是否为html编码 注意此处是一个方法 $mail->isHTML(true); // 设置收件人邮箱地址 $mail->addAddress($email); // 添加多个收件人 则多次调用方法即可 //$mail->addAddress('[email protected]'); // 添加该邮件的主题 $mail->Subject = "找回密码"; // 添加邮件正文 $mail->Body = "亲爱的".$email.":
您在".$time."提交了找回密码请求。请点击下面的链接重置密码 (按钮24小时内有效)。
".$url.""; // 为该邮件添加附件 //$mail->addAttachment('./example.pdf'); // 发送邮件 返回状态 $result = $mail->send(); return $result; /* require_once("smtp.class.php"); $smtpserver = "smtp.qq.com"; //SMTP服务器,如smtp.163.com $smtpserverport = 465; //SMTP服务器端口 $smtpusermail = "[email protected]"; //SMTP服务器的用户邮箱 $smtpuser = "[email protected]"; //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.":
您在".$time."提交了找回密码请求。请点击下面的链接重置密码 (按钮24小时内有效)。
".$url.""; $result = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); return $result; */ } ?>

当系统发送邮件至你邮箱之后,登录自己邮箱查看,发现一封来自系统的邮件并附上了一个链接,该链接就是上面的$url;

Ajax+PHPMailer实现邮箱找回密码功能_第4张图片

点击链接进行密码修改,在这个过程中,需要对链接地址进行判断reset.php:

query($sql);
$row = $smt->fetch(PDO::FETCH_BOTH);
if($row){
    $mt = md5($row['id'].$row['user'].$row['password']);
    if($mt==$token){
        if((time()-$row['update_time'])>24*60*60){
            $msg = "该链接已过期!";
        }else{
            $msg = 1;
            setcookie('email',$email,time()+3600,'/');
        }
    }else{
        $msg = "无效的链接!";
    }
}else{
    $msg = "错误的链接!";
}
echo "";

?>

如果用户信息以及链接未过期,则进入reset_pwd_ui.php界面:

Ajax+PHPMailer实现邮箱找回密码功能_第5张图片





重置密码





重置密码

返回登录界面

修改密码后,reset_pwd_check.php会对密码进行判断:

alert('请输入密码!');location='reset_pwd_ui.php';";
    }else{
        $password = trim($_POST['password']);
        $repassword = trim($_POST['repassword']);
        /* echo $_COOKIE['email']."
"; echo $password."
"; echo $repassword."
"; */ if($password == $repassword){ $pwd = md5($password); $email = $_COOKIE['email']; $time = date('Y-m-d H:i:s'); $sql = "update users set password='$pwd',reset_time='$time' where email='$email'"; if($pdo->query($sql)){ echo ""; setcookie('email','',time()-1,'/'); }else{ echo ""; } }else{ echo ""; } } }else{ echo ""; } ?>

以上就是整个邮箱找回密码功能实现的流程,核心代码都有注释,网上也有很多,我也是从别人那里看的;其次,密码判断这些还不够严谨,这需要自己想办法去涉及验证规则;我只是把这整个流程跑通了而已,更多的东西需要后面自己实现。

不忘初心,放得始终!

你可能感兴趣的:(php)