[搭建邮件服务器,过程非常简单](https://blog.csdn.net/gyxuehu/article/details/78500645) 使用队列方式异步发送邮件防页面卡死,学完就知道强大之处 一、邮件发送原理 ![](https://img.kancloud.cn/e4/87/e4873044d411b5731e0bd7e03f1fc62d_918x500.png) 二、利用[phpmailer](https://github.com/PHPMailer/PHPMailer)类实现邮件发送 // Import PHPMailer classes into the global namespace // These must be at the top of your script, not inside a function use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // Load Composer's autoloader require 'vendor/autoload.php'; // Instantiation and passing `true` enables exceptions $mail = new PHPMailer(true); try { //Server settings $mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output $mail->isSMTP(); // Send using SMTP $mail->Host = 'smtp1.example.com'; // Set the SMTP server to send through $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'user@example.com'; // SMTP username $mail->Password = 'secret'; // SMTP password $mail->charset ='UTF-8'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted $mail->Port = 587; // TCP port to connect to //Recipients $mail->setFrom('from@example.com', 'Mailer'); $mail->addAddress('joe@example.net', 'Joe User'); // Add a recipient $mail->addAddress('ellen@example.com'); // Name is optional $mail->addReplyTo('info@example.com', 'Information'); $mail->addCC('cc@example.com'); $mail->addBCC('bcc@example.com'); // Attachments $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name // Content $mail->isHTML(true); // Set email format to HTML $mail->Subject = '主题'; $mail->Body = 'This is the HTML message body in bold!'; $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; $mail->msgHTML(file_get_contents('./test.html')); $mail->send(); echo 'Message has been sent'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; 三、为什么需要队列 我们需要给网站所有用户发送一封系统通知邮件,假设网站有10000个注册用户,发送每封邮件需要0.1秒,执行一次发送通知操作需要多长时间?10000 x 0.1 = 1000 四、在phpcli模式下测试队列 create table users ( user_id int(5) not null auto_increment, user_email varchar(40) not null, user_password char(32) not null, primary key(user_id) )engine=myisam default charset=utf8; create table task_list ( task_id int(5) not null auto_increment, user_email varchar(40) not null, status int(2) not null, create_time datetime not null, update_time datetime not null, primary key(task_id) )engine=myisam default charset utf8; insert into task_list(user_email,status,create_time,update_time) VALUES( 'phpjiaoxuedev@sina.com', 0, now(), now() ); insert into task_list(user_email,status,create_time,update_time) VALUES( 'phpjiaoxuedev1@sina.com', 0, now(), now() ); 五、Ajax异步触发队列 1. 建立用户表存储注册的用户 2. 实现注册功能,当注册成功之后,把用户email插入邮件队列表中 3. 使用ajax触发队列 ![](https://img.kancloud.cn/81/b8/81b8eb35f8c369496fed5d1106f7cde2_944x472.png) ![](https://img.kancloud.cn/d5/c7/d5c7f71e33897bdf04f4415eb73316f2_583x103.png) ![](https://img.kancloud.cn/a7/09/a7094cff806668b4267d156fbafe99cf_692x461.png) do_queue.php exec("/php7/php.exe queue.php"); queue.php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // Load Composer's autoloader require 'vendor/autoload.php'; function sendEmail($host, $fromEmail, $fromPwd, $fromName, $toEmail, $toName, $subject, $content){ $mail = new PHPMailer(true); try { //Server settings $mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output $mail->isSMTP(); // 设置邮件使用 SMTP $mail->Host = 'smtp1.example.com'; // 邮箱服务器地址 $mail->SMTPAuth = true; // 启用 SMTP 身份验证 $mail->charset = 'UTF-8'; $mail->Username = 'user@example.com'; // SMTP 邮箱地址 $mail->Password = 'secret'; // 邮箱密码 $mail->Encoding = 'base64'; // 使用base64加密邮箱和密码 //Recipients $mail->setFrom('from@example.com', 'Mailer'); //发件人邮件地址 $mail->addAddress('joe@example.net', 'Joe User'); // 增加一个收件人 $mail->addAddress('ellen@example.com'); // 再增加一个收件人,名称是可选的 // Content $mail->isHTML(true); // Set email format to HTML $mail->Subject = 'Here is the subject'; $mail->Body = 'This is the HTML message body in bold!'; $mail->send(); } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; $link=mysql_connect('localhost','root','root'); mysql_select_db($link,$dbname); mysql_query("set names utf8"); while (true) { $sql="select * from tast_list where status = 0 order by task_id asc limit 5"; $res=mysql_query($sql); $mailList=[]; while ($row=mysql_fetch_assoc($res)) { $mailList[]=$row; if (empty($mailList)) { break; }else{ foreach ($mailList as $key => $value) { if (sendMail ("smtp.aliyun.com","phpjiaoxuedev@aliyun.com", "aliemail123","aliyun", $v['email'], 'sina', "php+mysql模拟队列发送邮件课程",file_get_contents( "new_course.html" ) )){ mysql_query( "UPDATE task_list SET status = 1 WHERE task_id =". Svalue['taskid'] ); sleep(3);
  • socket_wsaprotocol_info_export
  • socket_wsaprotocol_info_import
  • socket_wsaprotocol_info_release
  • cURL(*)
  • curl_setopt
  • Event(*)
  • Gearman
  • Gopher
  • Gupnp
  • Hyperwave API(过时)
  • LDAP(+)
  • Memcache
  • Memcached(+)
  • mqseries
  • ScoutAPM
  • Stomp
  • SVN(试验性的)
  • TCP扩展
  • Varnish
  • YP/NIS
  • 0MQ(ZeroMQ、ZMQ)消息系统
  • 0mq例子
  • ZooKeeper
  • 搜索引擎扩展
  • mnoGoSearch
  • Sphinx
  • Swish(实验性)
  • 针对服务器的扩展
  • Apache
  • FastCGI 进程管理器
  • NSAPI
  • Session 扩展
  • Msession
  • Sessions
  • Session PgSQL
  • BBCode
  • CommonMark(markdown解析)
  • cmark函数
  • cmark类
  • Parser
  • IVisitor接口
  • Node基类与接口
  • Document
  • Heading(#)
  • Paragraph
  • BlockQuote
  • BulletList
  • OrderedList
  • Strong
  • Emphasis
  • ThematicBreak
  • SoftBreak
  • LineBreak
  • CodeBlock
  • HTMLBlock
  • HTMLInline
  • Image
  • CustomBlock
  • CustomInline
  • Parle
  • PCRE( 核心)
  • POSIX Regex
  • ssdeep
  • 字符串(核心)
  • 变量与类型相关扩展
  • 数组(核心)
  • 类/对象(核心)
  • Classkit(未维护)
  • Ctype
  • Filter扩展
  • 过滤器函数
  • 函数处理(核心)
  • quickhash扩展
  • 反射扩展(核心)
  • Variable handling(核心)
  • Web 服务
  • OAuth
  • SCA(实验性)
  • XML-RPC(实验性)
  • Windows 专用扩展
  • 额外补充:Wscript
  • win32service
  • win32ps(停止更新且被移除)
  • XML 操作(也可以是html)
  • libxml(内置 默认开启)
  • DOM(内置,默认开启)
  • xml介绍
  • 扩展类与函数
  • DOMNode
  • DOMDocument(最重要)
  • DOMAttr
  • DOMCharacterData
  • DOMText(文本节点)
  • DOMCdataSection
  • DOMComment(节点注释)
  • DOMDocumentFragment
  • DOMDocumentType
  • DOMElement
  • DOMEntity
  • DOMEntityReference
  • DOMNotation
  • DOMProcessingInstruction
  • DOMXPath
  • DOMException
  • DOMImplementation
  • DOMNamedNodeMap
  • DOMNodeList
  • SimpleXML(内置,5.12+默认开启)
  • XMLReader(5.1+内置默认开启 用于处理大型XML文档)
  • XMLWriter(5.1+内置默认开启 处理大型XML文档)
  • SDO(停止维护)
  • SDO-DAS-Relational(试验性的)
  • SDO DAS XML
  • XMLDiff
  • XML 解析器(Expat 解析器 默认开启)
  • XSL(内置)
  • 图形用户界面(GUI) 扩展
  • PHP SPL(PHP 标准库)
  • SplDoublyLinkedList(双向链表)
  • SplStack(栈 先进后出)
  • SplQueue(队列)
  • SplHeap(堆)
  • SplMaxHeap(最大堆)
  • SplMinHeap(最小堆)
  • SplPriorityQueue(堆之优先队列)
  • SplFixedArray(阵列【数组】)
  • SplObjectStorage(映射【对象存储】)
  • ArrayIterator
  • RecursiveArrayIterator(支持递归)
  • DirectoryIterator类
  • FilesystemIterator
  • GlobIterator
  • RecursiveDirectoryIterator
  • EmptyIterator
  • IteratorIterator
  • AppendIterator
  • CachingIterator
  • RecursiveCachingIterator
  • FilterIterator(遍历并过滤出不想要的值)
  • CallbackFilterIterator
  • RecursiveCallbackFilterIterator
  • RecursiveFilterIterator
  • ParentIterator
  • RegexIterator
  • RecursiveRegexIterator
  • InfiniteIterator
  • LimitIterator
  • NoRewindIterator
  • MultipleIterator
  • RecursiveIteratorIterator
  • RecursiveTreeIterator
  • SplFileInfo
  • SplFileObject
  • SplTempFileObject
  • 接口 interface
  • Countable
  • OuterIterator
  • RecursiveIterator
  • SeekableIterator
  • 各种类及接口
  • SplSubject
  • SplObserver
  • ArrayObject(将数组作为对象操作)
  • SPL 函数
  • 预定义接口
  • Traversable(遍历)接口
  • Iterator(迭代器)接口
  • IteratorAggregate(聚合式迭代器)接口
  • ArrayAccess(数组式访问)接口
  • Serializable 序列化接口
  • JsonSerializable
  • Closure 匿名函数(闭包)类
  • Generator生成器类
  • 生成器(php5.5+)
  • yield
  • 一、反射(reflection)类
  • 二、Reflector 接口
  • ReflectionClass 类报告了一个类的有关信息。
  • ReflectionObject 类报告了一个对象(object)的相关信息。
  • ReflectionFunctionAbstract
  • ReflectionMethod 类报告了一个方法的有关信息
  • ReflectionFunction 类报告了一个函数的有关信息。
  • ReflectionParameter 获取函数或方法参数的相关信息
  • ReflectionProperty 类报告了类的属性的相关信息。
  • ReflectionClassConstant类报告有关类常量的信息。
  • ReflectionZendExtension 类返回Zend扩展相关信息
  • ReflectionExtension 报告了一个扩展(extension)的有关信息。
  • 三、ReflectionGenerator类用于获取生成器的信息
  • 四、ReflectionType 类用于获取函数、类方法的参数或者返回值的类型。
  • 五、反射的应用场景
  • phpRedis
  • API详细
  • redis DB 概念:
  • 通用命令:rawCommand
  • Connection
  • Server
  • string
  • 流streams
  • Geocoding 地理位置
  • lua脚本
  • Introspection 自我检测
  • biMap
  • php-redis 操作类 封装
  • redis 队列解决秒杀解决超卖:
  • swoole+框架笔记
  • 安装及常用Cli操作
  • 4种回调函数的写法
  • easyswoole
  • Linux+Nginx
  • linux
  • 开源网站镜像及修改yum源
  • 下载linux
  • Liunx中安装PHP7.4 的三种方法(Centos8)
  • yum安装
  • 源码编译安装
  • LNMP一键安装
  • 查看linux版本号
  • 设置全局环境变量
  • 查看php.ini必须存放的位置
  • 防火墙与端口开放
  • nohup 后台运行命令
  • linux 查看nginx,php-fpm运行用户及用户组
  • CentOS中执行yum update时报错
  • 关闭防火墙
  • 查看端口是否被占用
  • 查看文件夹大小
  • nginx相关
  • 一个典型的nginx配置
  • nginx关于多个项目的配置(易于管理)
  • nginx.config配置文件的结构
  • 1、events
  • 2、http
  • nginx的location配置详解
  • Nginx相关命令
  • Nginx安装
  • 配置伪静态
  • 为静态配置例子
  • apache
  • nginx
  • pathinfo模式
  • Shell脚本
  • shell 语言中 0 代表 true,0 以外的值代表 false。
  • shell字符串
  • shell数组
  • shell注释
  • 向Shell脚内传递参数
  • 显示命令执行结果
  • printf
  • test 命令
  • 流程控制与循环
  • while
  • until
  • break和continue
  • select 结构
  • shell函数
  • shell函数的全局变量和局部变量
  • 将shell输出写入文件中(输出重定向)
  • Shell脚本中调用另一个Shell脚本的三种方式
  • PHP实现定时任务的五种方法
  • ab压力测试
  • opcache
  • memcache
  • php操作
  • 数据库锁机制
  • 数据库设计
  • 字段类型的选择
  • SET FOREIGN_KEY_CHECKS
  • 字符集与乱码
  • SQL插入 去除重复记录的实现
  • nginx 主从配置
  • nginx 负载均衡的配置
  • 手动搭建Redis集群和MySQL主从同步(非Docker)
  • Redis Cluster集群
  • mysql主从同步
  • 用安卓手机搭建 web 服务器
  • url重写
  • 大流量高并发解决方案
  • RBAC0
  • RBAC1(角色上下级分层)
  • RBAC2(用户角色限约束)
  • RBAC3
  • Rbac.class.php
  • Rbac2
  • Auth.class.php
  • fastadmin Auth
  • tree1
  • ABAC 基于属性的访问控制
  • 总结:SAAS后台权限设计案例分析
  • casbin-权限管理框架
  • casbinAPI
  • casbin管理API
  • RBAC API
  • Think-Casbin
  • 单点登录(SSO)
  • OAuth授权
  • OAuth 2.0 的四种方式
  • 例子:第三方登录
  • 微服务架构下的统一身份认证和授权
  • 漏洞挖掘的思路
  • XSS 反射型漏洞
  • XSS 存储型漏洞
  • xss过滤
  • HTML Purifier文档
  • class规则
  • AutoFormat
  • Cache
  • Filter
  • Output
  • 嵌入YouTube视频
  • 加快HTML净化器的速度
  • URI过滤器
  • xss例子
  • 本地包含与远程包含
  • sql注入
  • information_schema
  • sql注入的分类
  • CSRF 跨站请求伪造
  • 计动态函数执行与匿名函数执行
  • unserialize反序列化漏洞
  • 覆盖变量漏洞
  • 文件管理漏洞
  • 文件上传漏洞
  • URL编码对照表
  • 前端、移动端
  • html5
  • meta标签
  • flex布局
  • javascript
  • jquery
  • on事件无效:
  • jquery自定义事件
  • select
  • checkbox
  • radio
  • js正则相关
  • js中判断某字符串含有某字符出现的次数
  • js匹配指定字符
  • $.getjson方法配合在url上传递callback=?参数,实现跨域
  • pajax入门
  • jquery的extend插件制作
  • jquery的兼容
  • jquery的连续调用:
  • $ 和 jQuery 及 $() 的区别
  • 页面响应顺序及$(function(){})等使用
  • 匿名函数:
  • 获取js对象所有方法
  • dom加载
  • ES6函数写法
  • ES6中如何导入和导出模块
  • 数组的 交集 差集 补集 并集
  • phantomjs
  • js数组的map()方法操作json数组
  • js精确计算CalcEval 【价格计算】 浮点计算
  • js精确计算2
  • js数组与对象的遍历
  • bootstrap
  • class速查
  • 常见data属性
  • data-toggle与data-target的作用
  • bootstrapTable
  • 数据格式(json)
  • 用法(row:行,column:列)
  • Bootstrap-table使用footerFormatter做统计列功能
  • JQuery-Jquery的TreeGrid插件
  • 服务器端分页
  • 合并单元格1
  • 合并单元格2
  • 合并单元格3
  • 合并单元格4
  • 合并单元格5(插件)
  • 添加行,修改行、扩展行数据
  • PhpSpreadsheet
  • 会员 数据库表设计
  • API接口
  • API接口设计
  • json转化
  • app接口
  • 三方插件库
  • 检测移动设备(包括平板电脑)
  • curl封装
  • Websocket
  • 与谷歌浏览器交互
  • Crontab管理器
  • 实用小函数
  • PHP操作Excel
  • SSL证书
  • sublime Emmet的快捷语法
  • 免费翻译接口
  • 架构师必须知道的26项PHP安全实践
  • 个人支付平台
  • RPC(远程调用)及框架
  •