使用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

posted @ 2021-04-13 21:53  Conqueror·  阅读(371)  评论(0编辑  收藏  举报