详解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操作文件方法问答
Mar 16 PHP
php array_merge下进行数组合并的代码
Jul 22 PHP
PHP strtok()函数的优点分析
Mar 02 PHP
检查php文件中是否含有bom的函数
May 31 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
PHP实现一个简单url路由功能实例
Nov 05 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
利用ajax和PHP实现简单的流程管理
Mar 23 PHP
使用PHPWord生成word文档的方法详解
Jun 06 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
php 多继承的几种常见实现方法示例
Nov 18 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数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
Javascript快速实现浏览器系统通知
2017/08/26 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
Python random模块常用方法
2014/11/03 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
详解如何使用Python编写vim插件
2017/11/28 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
成功的餐厅经营创业计划书
2014/01/15 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
护士节慰问信
2015/02/15 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
Python中request的基本使用解决乱码问题
2022/04/12 Python