当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-30 01:15:29 PHP

1。环境说明Aliyuncentos7thinkphp5.0.11swoole2.0.82,tp实现邮件发送在项目下创建如下文件目录:其中SendMail.php就是我们实际调用的发送邮件文件。以下是主要代码:namespaceapp\library\utils\mail;useapp\library\utils\mail\PhpMailer;useapp\library\utils\mail\Smtp;usethink\Log;error_reporting(E_STRICT);date_default_timezone_set('Asia/Shanghai');classSendMail{staticfunctionpostmail($to,$subject='',$body=''){$mail=newPhpMailer();$mail->CharSet=config('mail.CharSet');$邮件->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);$地址=$到;$mail->AddAddress($addres小号,'');if(!$mail->Send()){Log::write('发送到'.$to.'错误信息:'.$mail->ErrorInfo);返回假;}else{返回真;}}}里面的config配置项,我们放在项目下的config.php文件中,具体配置内容如下://邮箱设置'mail'=>['CharSet'=>'UTF-8','SMTPDebug'=>0,//启用SMTP调试功能0Close'SMTPAuth'=>true,//启用SMTP认证功能'SMTPSecure'=>'ssl',//安全协议'Host'=>'smtp.163.com',//SMTP服务器'Port'=>465,//SMTP服务器端口号'Username'=>'**********',//SMTP服务器用户名'Password'=>'**********',//SMTP服务器密码'From'=>'**********@163.com',//发件人邮箱'姓名'=>'blue',//发件人邮箱]2.1这里只是实现了smtp协议发送的demo,所以封装层次不是很全面,也不是很灵活。图中另外两个文件(PhpMailer.php和Smtp.php)是Phpmailer的邮件发送类的核心文件。为了简化调用,将其提取出来。详细的使用方法和参数设置可以参考gayhub的使用说明phpmailer2.2注意事项这一步需要注意几点:1是你设置的发送邮件的账号是否启用了SMTP并找到了相应的安全协议和端口号。2、当前服务器是否支持SMTP服务,往往受一些socket函数的影响。遇到问题时,我们应该将SMTPDebug参数设置为1,然后根据调试信息仔细调试。3、部分已发邮件会被放入垃圾箱,请注意查收。2.3调用建立如下文件目录结构:调用Index.php中发送邮件的方法,具体代码如下publicfunctionsendMail(){if(SendMail::postmail('937069176@qq.com','test','123')){echo'发送成功';}else{echo'发送失败';}}2.4调用结果我们可以在QQ邮箱的垃圾箱里找到一封刚刚发送的邮件3.结合swoole实现异步群发3.1安装swooleswoole扩展安装的详细步骤官网有,就不去了进入细节。在swoole文档入口安装swoole后,建议在你的IDE中添加swoole代码提示,并配置IDE提示swoole代码入口。3.2实现异步群发先实现异步服务器:/***description:server*/publicfunctionsyncSend(){$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'发送'.$i.'成功'。"\n";}else{echo'发送'.$i.'失败'。"\n";}}$serv->finish('');});$serv->on('finish',function($serv,$task_id,$data){echo"异步任务[id=$task_id]完成".PHP_EOL;});$服务->开始();在服务器端,我们用20个循环来模拟群发,实际换成不同的邮箱地址。接下来我们实现client/***description:client*/publicfunctionindex(){$client=new\swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_SYNC);$ret=$client->connect("127.0.0.1",8082);if(empty($ret)){echo'error!connecttoswoole_serverfailed';}else{$client->send('blue');//这里只是发送内容的简单实现}}}3.3打开服务器这里必须使用CLI方式,我们进入项目根目录。执行netstat-apn|grep8082首先监控8082端口是否被占用。如果被占用,kill-9PID(进程号)杀死进程。然后我们执行phppublic/index.phpindex/index/syncSend。这个命令的作用是使用cli模式让我们的8082端口处于监听状态。并保持这个终端处于激活状态,方便我们查看发送的结果。然后我们就可以使用CLI或者浏览器访问来访问我们的客户端phppublic/index.phpindex/index/index当我们执行一次客户端,我们可以在服务端的屏幕上看到如下图:表示我们有群发消息正常。接下来我们来测试一下异步,因为163服务器会检测IP,如果不是在某个时间频繁发送,就会出现发送失败的情况,所以我们测试的时候采用的是执行客户端4次的方法一行如下是执行的结果:从图中发送的顺序,我们很容易判断我们实现了异步发送。邮箱里也收到了刚刚发送的邮件。4.后记~swoole是一个你想要熟悉并熟练使用的扩展,但是受限于网络编程知识的匮乏,所以还是需要多多去测试和学习。demo如有不足请指出QAQ