详解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 相关文章推荐
php 求质素(素数) 的实现代码
Apr 12 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
基于php常用正则表达式的整理汇总
Jun 08 PHP
php中自定义函数dump查看数组信息类似var_dump
Jan 27 PHP
PHP微框架Dispatch简介
Jun 12 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
php中的mongodb select常用操作代码示例
Sep 06 PHP
php验证身份证号码正确性的函数
Jul 20 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
Nov 04 PHP
实例化php类时传参的方法分析
Jun 05 PHP
PHP大文件分割分片上传实现代码
Dec 09 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
用PHP的ob_start();控制您的浏览器cache!
2006/11/25 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
一些关于MySql加速和优化的面试题
2014/01/30 面试题
建筑系毕业生自我鉴定
2014/01/24 职场文书
高中生物教学反思
2014/02/05 职场文书
见义勇为事迹材料
2014/12/24 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
放牛班的春天观后感
2015/06/01 职场文书
音乐之声观后感
2015/06/04 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python