一.安装redis扩展。

二.打开redis服务

打开cmd进入redis安装目录执行以下命令:

redis-server.exe redis.windows.conf

三. 注册腾讯企业邮箱(该过程会收费)

四.向tp5中导入前端页面

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="__PUBLIC__/layui/css/layui.css" /><script src="__PUBLIC__/layui/layui.js"></script>
</head>
<body>
<form id="myform" class="layui-form" action="##"><div class="layui-form-item"><label class="layui-form-label">邮箱框</label><div class="layui-input-block"><input type="text" name="email" required  lay-verify="required" placeholder="请输入邮箱号" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><div class="layui-input-block"><button onclick="ajaxPost()" class="layui-btn" lay-submit lay-filter="formDemo" type = "button">立即提交</button><button type="reset" class="layui-btn layui-btn-primary">重置</button></div></div>
</form>
<script type="text/javascript" src="__PUBLIC__/js/jquery.min.js"></script>
</body>
<script type="text/javascript">function ajaxPost(){// alert(123);var formData = $("#myform").serialize();//serialize() 方法通过序列化表单值,创建 URL 编码文本字符串,这个是jquery提供的方法// alert(formData);$.ajax({type:"POST",url:"{:url('/index/Index/send')}",data:formData,//这里data传递过去的是序列化以后的字符串success:function(data){//获取成功以后输出返回值console.log(data);// alert(123);alert(data);window.location.href = "{:url('/index/Index/yanzhengy')}";},error:function(data){console.log(data);alert(345);alert(data);}});}</script>
</html>

yanzheng.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="__PUBLIC__/layui/css/layui.css" /><script src="__PUBLIC__/layui/layui.js"></script>
</head>
<body>
<form id="myform" class="layui-form" action="##"><div class="layui-form-item"><label class="layui-form-label">账号框</label><div class="layui-input-block"><input type="text" name="title" required  lay-verify="required" placeholder="请输入账号" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><label class="layui-form-label">密码框</label><div class="layui-input-inline"><input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input"></div><div class="layui-form-mid layui-word-aux">辅助文字</div></div><div class="layui-form-item"><label class="layui-form-label">再次输入密码框</label><div class="layui-input-inline"><input type="password" name="passwordf" required lay-verify="required" placeholder="请再次输入密码" autocomplete="off" class="layui-input"></div><div class="layui-form-mid layui-word-aux">辅助文字</div></div><div class="layui-form-item"><label class="layui-form-label">验证码</label><div class="layui-input-block"><input type="text" name="yanzheng" required  lay-verify="required" placeholder="请输入验证码" autocomplete="off" class="layui-input"></div></div><div class="layui-form-item"><div class="layui-input-block"><button onclick="ajaxPost()" class="layui-btn" lay-submit lay-filter="formDemo" type = "button">立即提交</button><button type="reset" class="layui-btn layui-btn-primary">重置</button></div></div>
</form>
<script type="text/javascript" src="__PUBLIC__/js/jquery.min.js"></script>
</body>
<script type="text/javascript">function ajaxPost(){// alert(123);var formData = $("#myform").serialize();//serialize() 方法通过序列化表单值,创建 URL 编码文本字符串,这个是jquery提供的方法// alert(formData);$.ajax({type:"POST",url:"{:url('/index/Index/yanzheng')}",data:formData,//这里data传递过去的是序列化以后的字符串success:function(data){//获取成功以后输出返回值// console.log(data);// alert(data);if(data==1){alert("密码修改成功!");}else{alert("密码修改失败");}}});}</script>
</html>

前端页面中引用了layui需要引入,使用layui还需引入jquery.min.js,可以到官网下载

放入public/static目录下

五.引入邮箱发送类

<?php
/*** 邮件发送类* 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送,带附件的邮件* 需要的php扩展,sockets和Fileinfo。* @example* */
namespace email;class email {/*** @var string 邮件传输代理用户名* @access private*/private $_userName;/*** @var string 邮件传输代理密码* @access private*/private $_password;/*** @var string 邮件传输代理服务器地址* @access protected*/protected $_sendServer;/*** @var int 邮件传输代理服务器端口* @access protected*/protected $_port=25;/*** @var string 发件人* @access protected*/protected $_from;/*** @var string 收件人* @access protected*/protected $_to;/*** @var string 抄送* @access protected*/protected $_cc;/*** @var string 秘密抄送* @access protected*/protected $_bcc;/*** @var string 主题* @access protected*/protected $_subject;/*** @var string 邮件正文* @access protected*/protected $_body;/*** @var string 附件* @access protected*/protected $_attachment;/*** @var reource socket资源* @access protected*/protected $_socket;/*** @var string 错误信息* @access protected*/protected $_errorMessage;/*** 设置邮件传输代理,如果是可以匿名发送有邮件的服务器,只需传递代理服务器地址就行* @access public* @param string $server 代理服务器的ip或者域名* @param string $username 认证账号* @param string $password 认证密码* @param int $port 代理服务器的端口,smtp默认25号端口* @return boolean*/public function setServer($server, $username="", $password="", $port=25) {$this->_sendServer = $server;$this->_port = $port;if(!empty($username)) {$this->_userName = base64_encode($username);}if(!empty($password)) {$this->_password = base64_encode($password);}return true;}/*** 设置发件人* @access public* @param string $from 发件人地址* @return boolean*/public function setFrom($from) {$this->_from = $from;return true;}/*** 设置收件人,多个收件人,连续调用多次.* @access public* @param string $to 收件人地址* @return boolean*/public function setReceiver($to) {if(isset($this->_to)) {if(is_string($this->_to)) {$this->_to = array($this->_to);$this->_to[] = $to;return true;}elseif(is_array($this->_to)) {$this->_to[] = $to;return true;}else {return false;}}else {$this->_to = $to;return true;}}/*** 设置抄送,多个抄送,连续调用多次.* @access public* @param string $cc 抄送地址* @return boolean*/public function setCc($cc) {if(isset($this->_cc)) {if(is_string($this->_cc)) {$this->_cc = array($this->_cc);$this->_cc[] = $cc;return true;}elseif(is_array($this->_cc)) {$this->_cc[] = $cc;return true;}else {return false;}}else {$this->_cc = $cc;return true;}}/*** 设置秘密抄送,多个秘密抄送,连续调用多次* @access public* @param string $bcc 秘密抄送地址* @return boolean*/public function setBcc($bcc) {if(isset($this->_bcc)) {if(is_string($this->_bcc)) {$this->_bcc = array($this->_bcc);$this->_bcc[] = $bcc;return true;}elseif(is_array($this->_bcc)) {$this->_bcc[] = $bcc;return true;}else {return false;}}else {$this->_bcc = $bcc;return true;}}/*** 设置邮件信息* @access public* @param string $body 邮件主题* @param string $subject 邮件主体内容,可以是纯文本,也可是是HTML文本* @param string $attachment 附件,文件地址* @return boolean*/public function setMailInfo($subject, $body, $attachment="") {$this->_subject = $subject;$this->_body = base64_encode($body);if(!empty($attachment)) {$this->_attachment = $attachment;}return true;}/*** 发送邮件* @access public* @return boolean*/public function sendMail() {$command = $this->getCommand();$this->socket();foreach ($command as $value) {if($this->sendCommand($value[0], $value[1])) {continue;}else{return false;}}//其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放$this->close();echo 'Mail OK!';return true;}/*** 返回错误信息* @return string*/public function error(){if(!isset($this->_errorMessage)) {$this->_errorMessage = "";}return $this->_errorMessage;}/*** 返回mail命令* @access protected* @return array*/protected function getCommand() {$command = array(array("HELO sendmail\r\n", 250));if(!empty($this->_userName)){$command[] = array("AUTH LOGIN\r\n", 334);$command[] = array($this->_userName . "\r\n", 334);$command[] = array($this->_password . "\r\n", 235);}$command[] = array("MAIL FROM:<" . $this->_from . ">\r\n", 250);$separator = "----=_Part_" . md5($this->_from . time()) . uniqid(); //分隔符//设置发件人$header = "FROM: test<" . $this->_from . ">\r\n";//设置收件人if(is_array($this->_to)) {$count = count($this->_to);for($i=0; $i<$count; $i++){$command[] = array("RCPT TO: <" . $this->_to[$i] . ">\r\n", 250);if($i == 0){$header .= "TO: <" . $this->_to[$i] .">";}elseif($i + 1 == $count){$header .= ",<" . $this->_to[$i] .">\r\n";}else{$header .= ",<" . $this->_to[$i] .">";}}}else{$command[] = array("RCPT TO: <" . $this->_to . ">\r\n", 250);$header .= "TO: <" . $this->_to . ">\r\n";}//设置抄送if(isset($this->_cc)) {if(is_array($this->_cc)) {$count = count($this->_cc);for($i=0; $i<$count; $i++){$command[] = array("RCPT TO: <" . $this->_cc[$i] . ">\r\n", 250);if($i == 0){$header .= "CC: <" . $this->_cc[$i] .">";}elseif($i + 1 == $count){$header .= ",<" . $this->_cc[$i] .">\r\n";}else{$header .= ",<" . $this->_cc[$i] .">";}}}else{$command[] = array("RCPT TO: <" . $this->_cc . ">\r\n", 250);$header .= "CC: <" . $this->_cc . ">\r\n";}}//设置秘密抄送if(isset($this->_bcc)) {if(is_array($this->_bcc)) {$count = count($this->_bcc);for($i=0; $i<$count; $i++){$command[] = array("RCPT TO: <" . $this->_bcc[$i] . ">\r\n", 250);if($i == 0){$header .= "BCC: <" . $this->_bcc[$i] .">";}elseif($i + 1 == $count){$header .= ",<" . $this->_bcc[$i] .">\r\n";}else{$header .= ",<" . $this->_bcc[$i] .">";}}}else{$command[] = array("RCPT TO: <" . $this->_bcc . ">\r\n", 250);$header .= "BCC: <" . $this->_bcc . ">\r\n";}}$header .= "Subject: " . $this->_subject ."\r\n";if(isset($this->_attachment)) {//含有附件的邮件头需要声明成这个$header .= "Content-Type: multipart/mixed;\r\n";}elseif(false){//邮件体含有图片资源的需要声明成这个$header .= "Content-Type: multipart/related;\r\n";}else{//html或者纯文本的邮件声明成这个$header .= "Content-Type: multipart/alternative;\r\n";}//邮件头分隔符$header .= "\t" . 'boundary="' . $separator . '"';$header .= "\r\nMIME-Version: 1.0\r\n";$header .= "\r\n--" . $separator . "\r\n";$header .= "Content-Type:text/html; charset=utf-8\r\n";$header .= "Content-Transfer-Encoding: base64\r\n\r\n";$header .= $this->_body . "\r\n";$header .= "--" . $separator . "\r\n";//加入附件if(isset($this->_attachment)){$header .= "\r\n--" . $separator . "\r\n";$header .= "Content-Type: " . $this->getMIMEType() . '; name="' . basename($this->_attachment) . '"' . "\r\n";$header .= "Content-Transfer-Encoding: base64\r\n";$header .= 'Content-Disposition: attachment; filename="' . basename($this->_attachment) . '"' . "\r\n";$header .= "\r\n";$header .= $this->readFile();$header .= "\r\n--" . $separator . "\r\n";}$header .= "\r\n.\r\n";$command[] = array("DATA\r\n", 354);$command[] = array($header, 250);$command[] = array("QUIT\r\n", 221);return $command;}/*** 发送命令* @access protected* @param string $command 发送到服务器的smtp命令* @param int $code 期望服务器返回的响应吗* @return boolean*/protected function sendCommand($command, $code) {echo 'Send command:' . $command . ',expected code:' . $code . '<br />';//发送命令给服务器try{if(socket_write($this->_socket, $command, strlen($command))){//当邮件内容分多次发送时,没有$code,服务器没有返回if(empty($code))  {return true;}//读取服务器返回$data = trim(socket_read($this->_socket, 1024));echo 'response:' . $data . '<br /><br />';if($data) {$pattern = "/^".$code."/";if(preg_match($pattern, $data)) {return true;}else{$this->_errorMessage = "Error:" . $data . "|**| command:";return false;}}else{$this->_errorMessage = "Error:" . socket_strerror(socket_last_error());return false;}}else{$this->_errorMessage = "Error:" . socket_strerror(socket_last_error());return false;}}catch(Exception $e) {$this->_errorMessage = "Error:" . $e->getMessage();}}/*** 读取附件文件内容,返回base64编码后的文件内容* @access protected* @return mixed*/protected function readFile() {if(isset($this->_attachment) && file_exists($this->_attachment)) {$file = file_get_contents($this->_attachment);return base64_encode($file);}else {return false;}}/*** 获取附件MIME类型* @access protected* @return mixed*/protected function getMIMEType() {if(isset($this->_attachment) && file_exists($this->_attachment)) {$mime = mime_content_type($this->_attachment);if(! preg_match("/gif|jpg|png|jpeg/", $mime)){$mime = "application/octet-stream";}return $mime;}else {return false;}}/*** 建立到服务器的网络连接* @access private* @return boolean*/private function socket() {if(!function_exists("socket_create")) {$this->_errorMessage = "Extension sockets must be enabled";return false;}//创建socket资源$this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));if(!$this->_socket) {$this->_errorMessage = socket_strerror(socket_last_error());return false;}socket_set_block($this->_socket);//设置阻塞模式//连接服务器if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) {$this->_errorMessage = socket_strerror(socket_last_error());return false;}socket_read($this->_socket, 1024);return true;}/*** 关闭socket* @access private* @return boolean*/private function close() {if(isset($this->_socket) && is_object($this->_socket)) {$this->_socket->close();return true;}$this->_errorMessage = "No resource can to be close";return false;}
}

放到vendor/email下

六.写index控制器

<?php
namespace app\index\controller;use email\email;
use think\Controller;class Index extends Controller
{public function index(){return view('index');}public function send(){$data = ['email' => input('email'),];
//        return $data['email'];$randController = new Rand();$rand = $randController->rand();$redisController = new Redis();$redisController->redis($rand);$mail = new email();$mail->setServer("smtp.exmail.qq.com", "#1", "#2"); //设置smtp服务器 #1:腾讯企业邮箱账号 #2密码$mail->setFrom("1806955026@nyist.edu.cn"); //设置发件人$mail->setReceiver($data['email']); //设置收件人,多个收件人,调用多次
//      $mail->setCc("XXXX"); //设置抄送,多个抄送,调用多次
//      $mail->setBcc("XXXXX"); //设置秘密抄送,多个秘密抄送,调用多次$mail->setMailInfo("验证码", "<b>$rand</b>"); //设置邮件主题、内容$result = $mail->sendMail(); //发送return $result;}public function yanzheng(){$data = ['yanzheng' => input('yanzheng'),];
//        return $data;$redisController = new Redis();$rand = $redisController->redisGet();if($data['yanzheng'] == $rand){return 1;}}public function yanzhengy(){return view('yanzheng/yanzheng');}
}

七.配置composer.json文件

在autoload中添加:"email\\": "vendor/email"

打开cmd进入项目目录输入:composer dump-autoload

八.编写redis控制器

<?phpnamespace app\index\controller;use think\Controller;class Redis extends Controller
{public function redis($rand){$redis = new \Redis();$redis -> connect('127.0.0.1',端口号);$auth = $redis->auth('密码');$redis->set('rand',$rand);
//        echo '用户名:'.$redis -> get('rand');}public function redisGet(){$redis = new \Redis();$redis -> connect('127.0.0.1',6379);$auth = $redis->auth('13939525831');$rand = $redis->get('rand');return $rand;
//        echo '用户名:'.$redis -> get('rand');}
}

九.编写生成验证码控制器Rand.php

<?php
namespace app\index\controller;class rand
{public function rand(){$i = rand(1000,9999);return $i;}
}

10.测试

提交之后进入修改密码界面

输入qq邮箱获得的验证码即可修改密码成功

tp5利用redis缓存制作qq邮箱验证相关推荐

  1. (手机,qq,QQ邮箱验证格式)正则表达式

    //手机格式String NUM=scanner1.next();boo=NUM.matches("^1[3456789]\\d{3,9}$");if (boo==false){S ...

  2. java实现邮箱验证QQ邮箱验证和Foxmail验证

    这两天公司要求做个Android端邮箱认证,android端还是很简单的,主要难点在后台链接邮箱并发送邮件. 思路:android端传送邮箱地址给后台,后台获取邮箱地址后,链接公司邮箱,并发送验证码邮 ...

  3. JavaWeb实现qq邮箱验证(一)

    需求:用户注册时给邮箱发送邮件,得到验证码并填写,进行激活邮箱. 有基础的可以直接看下篇 JavaWeb实现qq邮箱验证(二):https://blog.csdn.net/BlackPlus28/ar ...

  4. dz邮箱验证怎么设置_如何设置discuz qq邮箱验证

    展开全部 1.进入管理中心32313133353236313431303231363533e59b9ee7ad9431333335306166--全局--注册与访问-注册,新用户注册验证 选择:Ema ...

  5. Java实现QQ邮箱验证

    对于新手来说,qq邮箱短信验证是最佳选择啦,之前写了一个在本地测试ok但是到了服务器就不行了,今天就随便分享一下 前台js: $("#sendidcode").click(func ...

  6. Springboot进行qq邮箱验证

    一.前提准备 1.在qq邮箱中打开POP3/SMTP服务 步骤:点击qq邮箱--->设置--->账户--->向下滑找到POP3/SMTP服务--->开启并用手机发送验证码 -- ...

  7. 利用redis缓存对 list集合中的数据 进行分页操作(一)

    先说 存储的结构: 这里做了两块缓存  绿色是存储索引的缓存  黑色是存数据的缓存 翻页时需要两个参数  向上查询/或向下查询    还一个是   从第二页开始查询时需要一个索引的参数 有了这两个参数 ...

  8. javaWeb实现qq邮箱验证(二)

    上篇写的实现基本上是一个工具类,并没封装成下图这样方式(梨视频注册界面),现在开始完善上篇的java邮箱激活验证功. java邮箱验证地址:https://blog.csdn.net/BlackPlu ...

  9. Java实现QQ邮箱验证激活 Java简单发送邮箱

    Java简单发送邮箱 1.首先要去qq邮箱 设置–账户–把所有服务都开启 (记住其中任意一个授权码就OK了) 如下图: 2. 导入jar包 创建测试类 (复制即可) 如下: package testE ...

最新文章

  1. 关于正则表达式 \1 \2之类的问题
  2. java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
  3. python字符串find函数-Python内置的字符串处理函数整理
  4. 2019.2.20异常
  5. Erlang China 大会 - CN Erlounge III - 发起
  6. jBPM3.12用户指南中文翻译----第二章 起步
  7. 汇编语言——十种寻址方式
  8. 【Python实战】机型自动化标注(搜狗爬虫实现)
  9. 大内高手—共享内存与线程局部存储
  10. Hibernate关联关系配置(一对多、一对一和多对多)
  11. pythonpip使用方法_Python: pip常见的使用方法
  12. PyQt5菜单添加+事件+状态栏-7
  13. Discuz在Firefox下无法切换至编辑器状态解决(Z)
  14. 页面加载速度优化的建议
  15. java流 视频_java如何对视频文件处理?包括拉流推流视频截取等?
  16. VB.net单exe文件内MP3和WAV音乐文件播放
  17. 芯片程序保护-常规芯片加密方式
  18. dbo sysadmin和db_owner的区别
  19. Android - 集成高德地图API(搜索,地图,定位)
  20. 数据挖掘的十大经典算法

热门文章

  1. 关于蓝墨云班课,视频不能拖动,但想快速搞完的解决方法
  2. 3DMAX渲染慢技巧分享,建模初学者必看
  3. 什么是同城商超配送系统
  4. STL 容器详解——string 类
  5. 运营数据分析步骤与方法解读
  6. minigui学习笔记四
  7. 英雄联盟萌萌哒小锤子波比台词
  8. 微信小程序直接上传文件到阿里云OSS组件封装
  9. 汽车电子——常见的英文缩写(更新中)
  10. 阿里天池比赛——街景字符编码识别