详解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 相关文章推荐
PHP4实际应用经验篇(6)
Oct 09 PHP
一些关于PHP的知识
Nov 17 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 PHP
解读PHP中的垃圾回收机制
Aug 10 PHP
php数组冒泡排序算法实例
May 06 PHP
PHP 常用时间函数资料整理
Oct 22 PHP
php数值转换时间及时间转换数值用法示例
May 18 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
Jul 20 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 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中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
2018/08/30 PHP
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
简单说明Python中的装饰器的用法
2015/04/24 Python
python排序方法实例分析
2015/04/30 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
Python判断有效的数独算法示例
2019/02/23 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
如何通过python实现全排列
2020/02/11 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
幼儿园教师演讲稿
2014/05/06 职场文书
家长学校工作方案
2014/05/07 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技