使用redis实现邮件发送
return [ 'connector' => 'Redis', // Redis 驱动 'expire' => null, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null 'default' => 'default', // 默认的队列名称 'host' => '127.0.0.1', // redis 主机ip 'port' => 6379, // redis 端口 'password' => '', // redis 密码 'select' => 0, // 使用哪一个 db,默认为 db0 'timeout' => 0, // redis连接的超时时间 'persistent' => false, // 是否是长连接 ];
extra->queue.php 配置文件中加入上面内容
<?php namespace app\admin\controller; use think\Queue; class Test { public function actionWithHelloJob(){ // 1.当前任务将由哪个类来负责处理。 // 当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法 $jobHandlerClassName = 'app\admin\controller\Demo'; // 2.当前任务归属的队列名称,如果为新队列,会自动创建 $jobQueueName = "helloJobQueue"; // 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串 // ( jobData 为对象时,需要在先在此处手动序列化,否则只存储其public属性的键值对) $jobData = [ 'name'=>'zhangsan'.time()] ; // 4.将该任务推送到消息队列,等待对应的消费者去执行 $isPushed = Queue::push( $jobHandlerClassName , $jobData , $jobQueueName ); // database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false if( $isPushed !== false ){ echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ"."<br>"; }else{ echo 'Oops, something went wrong.'; } } }
<?php namespace app\admin\controller; use PHPMailer\PHPMailer\PHPMailer; use think\Db; use think\Loader; use think\queue\Job; class Demo { /** * fire方法是消息队列默认调用的方法 * @param Job $job 当前的任务对象 * @param array|mixed $data 发布任务时自定义的数据 */ public function fire(Job $job,$data){ $isJobDone = $this->doHelloJob($data); if ($isJobDone) { //如果任务执行成功, 记得删除任务 $job->delete(); print("<info>Hello Job has been done and deleted"."</info>\n"); }else{ if ($job->attempts() > 3) { //通过这个方法可以检查这个任务已经重试了几次了 print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n"); $job->delete(); } } } /** * 根据消息中的数据进行实际的业务处理 * @param array|mixed $data 发布任务时自定义的数据 * @return boolean 任务执行的结果 */ private function doHelloJob($data) { // 根据消息中的数据进行实际的业务处理... Loader::import('PHPMailer.PHPMailer');//加载extend中的自定义类 $mail = new PHPMailer(); //实例化 header("content-type:text/html;charset=utf-8"); // 使用SMTP方式发送 $mail->IsSMTP(); // 设置邮件的字符编码 $mail->CharSet='UTF-8'; // 企业邮局域名 $mail->Host = 'smtp.qq.com'; //---------qq邮箱需要的------//设置使用ssl加密方式登录鉴权 $mail->SMTPSecure = 'ssl'; //设置ssl连接smtp服务器的远程服务器端口号 可选465或587 $mail->Port = 465;//---------qq邮箱需要的------ // 启用SMTP验证功能 $mail->SMTPAuth = true; //邮件发送人的用户名(请填写完整的email地址) $mail->Username = '729347004@qq.com' ; // 邮件发送人的 密码 (授权码) $mail->Password = 'lxiiemuacxjgbbeb'; //修改为自己的授权码 //邮件发送者email地址 $mail->From ="729347004@qq.com"; //发送邮件人的标题 $mail->FromName ="购买成功"; //收件人的邮箱 给谁发邮件 // $email_addr = "519660157@qq.com"; $email_addr = "729347004@qq.com"; //收件人地址,可以替换成任何想要接收邮件的email信箱,格式是AddAddress("收件人email","收件人姓名") $mail->AddAddress("$email_addr", substr( $email_addr, 0 , strpos($email_addr ,'@'))); //回复的地址 $mail->AddReplyTo('729347004@qq.com' , "" ); $mail->AddAttachment("./mail.rar"); // 添加附件 //set email format to HTML //是否使用HTML格式 $mail->IsHTML(true); //邮件标题 $mail->Subject = '购买成功通知'; //邮件内容 $mail->Body = "<p style='color:red;font-size: 20px'>" . '恭喜您!预约成功,请您按时就诊哦!' . '</p>'."<p></p>"; //附加信息,可以省略 $mail->AltBody = ''; // 添加附件,并指定名称 $mail->AddAttachment( './error404.php' ,'php文件'); //设置邮件中的图片 $mail->AddEmbeddedImage("shuai.jpg", "my-attach", "shuai.jpg"); if( !$mail->Send() ){ $mail_return_arr['mark'] = false ; $str = "邮件发送失败. <p>"; $str .= "错误原因: " . $mail->ErrorInfo; $mail_return_arr['info'] = $str ; }else{ $mail_return_arr['mark'] = true ; $str = "邮件发送成功"; $mail_return_arr['info'] = $str ; } } }
调用一次
php think queue:listen --queue helloJobQueue
一直执行
php think queue:work --daemon --queue helloJobQueue
访问
http://www.medical.com/admin/Test/actionWithHelloJob
http://www.bakk.com/index.php/admin/Test/actionWithHelloJob