php发送邮箱重置密码链接,并在重置成功后使链接失效 (ThinkPHP5)
/** * 重置密码页,验证链接有效性,页面发送邮件调用sendResetPwdEmail()方法 */ public function resetPwd() { $param = input(''); $bool = $this->verifyUrl($param); if ($bool) { $this->assign("param", $param); return $this->fetch('resetpwd'); } else { abort(404, '链接失效或错误'); } } /** * 执行重置密码 */ public function doResetPwd() { $param = input('param.'); // 验证链接有效性 $bool = $this->verifyUrl($param); if ($bool) { $validateRes = is_pwd($param['password']); if (!$validateRes) { return info(lang("密码必须包含大小写字母,数字,长度为8~16"), 0); } if ($param['password'] != $param['rpassword']) { return info('两次密码输入不一致', 1); } else { $c = explode('+', base64_decode($param['c'])); try { model('User')->where(['email' => $c[0]])->update(['password' => mduser($param['password'])]); return info('密码重置成功'); } catch (Exception $e) { return info('密码重置失败,请联系管理员'); } } } else { abort(404, '链接失效或错误'); } } /** * 重置密码发送邮箱 */ public function sendResetPwdEmail() { $param = input('post.email'); if (empty($param)) { return false; } $data = model('user')->getRow(['email' => $param], 'id,it_code,password'); if (empty($data)) { return info('邮箱未注册', 0); } $time = time(); $key1 = base64_encode($param . '+' . $time); $key2 = md5($data['id'] . $data['it_code'] . $data['password'] . $time . config('user_auth_key')); $url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . url('/resetPwd', ['c' => $key1, 'k' => $key2]); $body = "<b>" . $data['it_code'] . ',您好:</b></br></br></n>' . ' 感谢您使用门户平台!</br></br>' . ' 请<a href="' . $url . '">点击这里重置密码</a>。'; $receiver = array($param); // 发送邮件方法另见下一篇文章 $res = send_mail($receiver, '门户平台密码重置', $body); if ($res) { return info('邮件发送成功,请查收邮件', 1); } else { return info('邮件发送失败,请联系管理员', 0); } } /** * 验证链接有效性 */ private function verifyUrl($param) { if (empty($param['c']) || empty($param['k'])) { return false; } $c = explode('+', base64_decode($param['c'])); if (count($c) != 2) { return false; } // 用户数据不存在 页面失效 $userData = model('user')->getRow(['email' => $c[0]], 'id,it_code,password'); if (empty($userData)) { return false; } // 密码重置后 页面失效 $key = md5($userData['id'] . $userData['it_code'] . $userData['password'] . $c[1] . config('user_auth_key')); if ($key != $param['k']) { return false; } // 时间过1800s 页面失效 if ($c[1] + 1800 < time()) { return false; } return true; }
php发送邮箱重置密码链接,并在重置成功后使链接失效 (ThinkPHP5)的更多相关文章
- AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码
AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之 ...
- Microsoft.AspNet.Identity 重置密码
重置密码:先生成重置密码的Token,然后调用ResetPassword方法重置密码,密码要符合规则.. ApplicationUserManager UserManager => _userM ...
- Java实现发送邮箱验证码/注册验证链接
本文以163邮箱为例 1.准备(邮箱账号,邮箱必须设置POP3/SMTP/IMAP,设置步骤如下:) >>步骤:1 开启授权码服务 >>步骤:2 手机获取验证码 >> ...
- wordpress新注册用户或重置密码链接失效
在网上找了好多个博客,一个比一个不要脸,要更改的是两个文件,最后都抄成一个文件了. 原文链接https://www.cnblogs.com/liudecai/p/6474611.html 我是按照这个 ...
- Java实现邮箱找回密码 --转载
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- Java实现邮箱找回密码
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- python发送邮箱
一.Python发送邮件 import smtplib from email.mime.text import MIMEText def send(email_to,title,content): m ...
- [py][mx]django通过邮箱找回密码
忘记密码处理流程 注意: 这个文章里的找回密码页面截取有问题. 找回密码页应该是让输入邮箱 直接上代码 class ActiveView(View): # 主要功能是修改user_profile里的i ...
- django用户认证系统——重置密码7
当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...
随机推荐
- LinQ简单增、删、改、查
一.简单介绍 1.LinQ to Sql类(NET Language Integrated Query (LINQ) ) LINQ定义了大约40个查询操作符,如select.from.in.where ...
- Python中应该使用%还是format来格式化字符串?
转载自http://www.cnblogs.com/liwenzhou/p/8570701.html %的特点是,前面有几个%,后面的括号里就得有几个参数,如果只有一个%,括号可以省略 基本格式 'a ...
- codeblocks1712设置中文
下载汉化包:百度网盘,密码:7rrz 下载后放到安装目录:D:\Program Files (x86)\CodeBlocks\share\CodeBlocks\locale\zh_CN(根据个人安装目 ...
- 用户态与内核态 & 文件流与文件描述符 简介
用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平台都支持该库函数,因此依赖该库的程序可移植性好: System Function:系统调用函数,与系统内 ...
- Codeforces 877E - Danil and a Part-time Job 线段树+dfs序
给一个有根树,1e5个节点,每个节点有权值0/.1,1e5操作:1.将一个点的子树上所有点权值取反2.查询一个点的子树的权值和 题解: 先深搜整颗树,用dfs序建立每个点对应的区间,等于把树拍扁成 ...
- lnmp 1.5 mysql数据库开启远程访问
LNMP默认是禁止远程连接数据库的,但是有时候为了方便,我们想要远程,下面是开启远程的方法 sudo su # 切换为root用户模式,省的接下来操作的时候出现权限问题 mysql -u root - ...
- James Munkres Topology: Theorem 19.6
Theorem 19.6 Let \(f: A \rightarrow \prod_{\alpha \in J} X_{\alpha}\) be given by the equation \[ f( ...
- git命令详解( 六 )
此为git命令的第六篇 远程跟踪分支 不知道大家有没有发现在前面几篇中Git 好像知道 master 与 o/master 是相关的.当然这些分支的名字是相似的,可能会让你觉得是依此将远程分支 mas ...
- C语言中使用bool
声明 C语言中是没有bool类型的. 使用方法 参考: https://stackoverflow.com/q/1921539.
- django——form组件
1.html表单概述 Django开发的是动态Web服务,而非单纯提供静态页面.动态服务的本质在于和用户进行互动,接收用户的输入,根据输入的不同,返回不同的内容给用户.返回数据是我们服务器后端做的,而 ...