详解thinkphp5+swoole实现异步邮件群发(SMTP方式)


Posted in PHP onOctober 13, 2017

本文介绍了thinkphp5+swoole实现异步邮件群发(SMTP方式),分享给大家,具体如下:

1、环境说明

  • 阿里云centos7
  • thinkphp5.0.11
  • swoole2.0.8

2、tp实现邮件发送

在项目下建立如下的文件目录:

详解thinkphp5+swoole实现异步邮件群发(SMTP方式)

其中SendMail.php是我们实际调用的发送邮件的文件。以下是主要代码:

namespace app\library\utils\mail;
use app\library\utils\mail\PhpMailer;
use app\library\utils\mail\Smtp;
use think\Log;

error_reporting(E_STRICT);
date_default_timezone_set('Asia/Shanghai');

class SendMail
{
 static function postmail($to,$subject = '',$body = ''){
  $mail = new PhpMailer();
  $mail->CharSet = config('mail.CharSet');
  $mail->IsSMTP();
  $mail->SMTPDebug = config('mail.SMTPDebug');
  $mail->SMTPAuth = config('mail.SMTPAuth');
  $mail->SMTPSecure = config('mail.SMTPSecure');
  $mail->Host  = config('mail.Host');
  $mail->Port  = config('mail.Port');
  $mail->Username = config('mail.Username');
  $mail->Password = config('mail.Password');
  $mail->SetFrom(config('mail.From'), config('mail.Name'));
  $mail->Subject = $subject;
  $mail->MsgHTML($body);
  $address = $to;
  $mail->AddAddress($address, '');
  if(!$mail->Send()) {
   Log::write('send to '.$to.'error info:'.$mail->ErrorInfo);
   return false;
  } else {
   return true;
  }
 }
}

里面的config配置项,我们放在项目底下的config.php文件中,具体配置内容如下:

//邮箱设置
 'mail'=>[
  'CharSet'=>'UTF-8',
  'SMTPDebug'=>0,// 启用SMTP调试功能 0关闭
  'SMTPAuth'=>true,// 启用 SMTP 验证功能
  'SMTPSecure'=>'ssl',// 安全协议
  'Host'=>'smtp.163.com',// SMTP 服务器
  'Port'=>465,// SMTP服务器的端口号
  'Username'=>'**********',// SMTP服务器用户名
  'Password'=>'**********',// SMTP服务器密码
  'From'=>'*********@163.com',// 发件人邮箱
  'Name'=>'blue',// 发件人邮箱
 ]

2.1这里我们只是实现了smtp协议发送的demo,所以在封装的层面上没有做到很全面,不是很灵活。图中其他两个文件(PhpMailer.php和Smtp.php)是Phpmailer邮件发送类的核心文件,为了简化调用,抽取了出来,详细的用法和参数设置,可以参考gayhub的使用说明phpmailer

2.2 注意点

在此步骤中,我们需要注意几点:1是你设置的邮件发送的账号是否已经开启SMTP并且找对对应的安全协议和端口号。2、当前服务器是否支持SMTP服务,这边很多时候会受一些socket函数的影响,遇到问题的时候,我们应该把SMTPDebug参数设置为1,然后根据debug信息去细心调试。3、发出的邮件有些会被放入垃圾箱,注意查收。

2.3 调用

建立如下的文件目录结构:详解thinkphp5+swoole实现异步邮件群发(SMTP方式)

在Index.php中调用发送邮件的方法,具体代码如下

public function sendMail(){
  if(SendMail::postmail('937069176@qq.com','test','123')){
   echo 'send success';
  }else{
   echo 'send fail';
  }
 }

2.4 调用结果

详解thinkphp5+swoole实现异步邮件群发(SMTP方式)

我们可以在QQ邮箱的垃圾箱中找到我们刚刚发送的一封邮件

3、结合swoole实现异步群发3.1安装swoole

swoole扩展安装的详细步骤官网上面都有,不再赘述,swoole文档传送门

安装完swoole之后,建议为自己的IDE加上swoole的代码提示,配置IDE提示swoole代码的传送门

3.2实现异步群发

我们先实现异步的服务端:

/**
  * description:服务端
  */
 public function syncSend(){
  $serv = new \swoole_server('0.0.0.0',8082);

  $serv->set(array('task_worker_num' => 4));

  $serv->on('receive', function($serv, $fd, $from_id, $data) {
   $task_id = $serv->task($data);
   echo "开始投递异步任务 id=$task_id\n";
  });

  $serv->on('task', function ($serv, $task_id, $from_id, $data) {
   echo "接收异步任务[id=$task_id]".PHP_EOL;
   for ($i = 0 ; $i<20;$i++){
    if(SendMail::postmail('937069176@qq.com','test',$data)){
     echo 'send'.$i.' success'."\n";
    }else{
     echo 'send'.$i.' fail'."\n";
    }
  }
  $serv->finish('');
  });

  $serv->on('finish', function ($serv, $task_id, $data) {
   echo "异步任务[id=$task_id]完成".PHP_EOL;
  });

  $serv->start();
 }

在服务端,我们用了一个20的loop来模拟了群发,实际换成不同的email地址就可。

下面我们实现客户端

/**
  * description:客户端
  */
 public function index()
 {
  $client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
  $ret = $client->connect("127.0.0.1", 8082);
  if(empty($ret)){
   echo 'error!connect to swoole_server failed';
  } else {
   $client->send('blue');//这里只是简单的实现了发送的内容
  }
 }

3.3开启服务端

这里必须要用CLI方式,我们进入项目的根目录。

执行

netstat -apn | grep 8082

先监测一下8082端口是否被占用,如果占用则

kill -9 PID(进程号)

杀死进程

然后我们执行

php public/index.php index/index/syncSend

这条命令的作用是用cli模式来使我们的8082端口处于监听状态。且保持这个终端处于活跃状态,这样方便我们查看发送的结果。

接着我们可以用CLI或者浏览器访问的方式来访问我们的客户端

php public/index.php index/index/index

当我们执行一次的时候客户端的时候,我们可以在服务端的终端看到屏幕上面出现如下的画面:

详解thinkphp5+swoole实现异步邮件群发(SMTP方式)

说明我们已经正常群发了。

下面,我们就来测试异步,因为163服务器会对IP进行检测,如果在某个时间发送也别频繁的话,会出现发送失败的情况,所以我们测试的时候,采用连续执行4次客户端的方式

下面是执行的结果:

详解thinkphp5+swoole实现异步邮件群发(SMTP方式)

详解thinkphp5+swoole实现异步邮件群发(SMTP方式)

从图中发送的顺序来看,我们可以很容易的判断,我们已经实现了异步的发送。

邮箱里面也接收到了刚刚发送的邮件。

详解thinkphp5+swoole实现异步邮件群发(SMTP方式)

4、后记~

swoole是一种想要熟悉和熟练使用的扩展,但是限于网络编程知识的不足,所以还是要多多测试和学习,demo中有不足的地方,还请指出QAQ

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
BBS(php &amp; mysql)完整版(六)
Oct 09 PHP
如何开发一个虚拟域名系统
Oct 09 PHP
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
深入php list()函数的详解
Jun 05 PHP
php 在windows下配置虚拟目录的方法介绍
Jun 26 PHP
php在linux下检测mysql同步状态的方法
Jan 15 PHP
PHP SESSION的增加、删除、修改、查看操作
Mar 20 PHP
php计算到指定日期还有多少天的方法
Apr 14 PHP
php解析xml方法实例详解
May 12 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
Nov 19 PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
详解PHP字符串替换str_replace()函数四种用法
Oct 13 #PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 #PHP
PHP长网址与短网址的实现方法
Oct 13 #PHP
如何直接访问php实例对象中的private属性详解
Oct 12 #PHP
thinkphp中的多表关联查询的实例详解
Oct 12 #PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 #PHP
利用PHP实现开心消消乐的算法示例
Oct 12 #PHP
You might like
对Session和Cookie的区分与解释
2007/03/16 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
jQuery 使用个人心得
2009/02/26 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
jQuery ajax实现省市县三级联动
2021/03/07 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
Python绘制的二项分布概率图示例
2018/08/22 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
感恩节红领巾广播稿
2014/02/11 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
求职自我推荐信
2014/06/25 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
违章停车检讨书
2014/10/21 职场文书
mysql配置SSL证书登录的实现
2021/09/04 MySQL
MySQL Server 层四个日志
2022/03/31 MySQL
Python中的socket网络模块介绍
2022/07/23 Python