laravel发送队列定时邮件

这篇博客介绍了如何在Laravel中结合队列和邮件功能实现定时发送邮件。首先,详细讲述了配置邮件服务,包括.env文件的设置和授权码获取。接着,讲解了配置数据库队列,并创建job表和job-fail表的迁移。然后,通过编写队列控制器QueueEmailController实现了邮件发送的Job类,包括重试策略和失败处理。最后,展示了如何在普通控制器中调度队列任务,以及如何查看jobs和failed_jobs表的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里是两个功能融合在一起:发送邮件和队列排序,我们分两步完成。

一.发送邮件

1.修改.env配置文件,

MAIL_DRIVER=smtp //驱动有很多种,免费好用的就这种
MAIL_HOST=smtp.163.com  //若是qq邮箱,则为smtp.qq.com
MAIL_PORT=465 //若MAIL_ENCRYPTION=ssl,否则2525不变
MAIL_USERNAME=159xxxx4304@163.com //邮箱号
MAIL_PASSWORD=zddxxx //授权码
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=159xxxx4304@163.com //邮箱号
MAIL_FROM_NAME=郑大人159 //随便

以上配置中,授权码是需要在邮箱设置中设置的,如图:

 

完成后:

到这里,邮箱设置完成。

二.配置队列

队列我们采用database方式,修改.env文件QUEUE_CONNECTION=database。

设置好.env,两个子配置文件config/mail.php和config/queue.php就不用了配置了。

三.代码逻辑

1.#按照官方文档,分别生成job表和job-fail表的迁移
php artisan queue:table
php artisan queue:failed-table
php artisan migrate
#生成Job基础文件夹和自定义的类
php artisan make:job QueueEmailController(队列控制器)
#开始监听队列,最好用管理员权限
php artisan queue:work --daemon

2.队列控制器内容如下:

<?php

namespace App\Jobs;

use Log;
use Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Http\Controllers\SmtpEmailController as SmtpEmail;

class QueueEmailController implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $email;//发送对象邮箱,非必填。
     /**
     * 任务可以尝试的最大次数。非必填。
     *
     * @var int
     */
    public $tries = 5;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    /**
     * 任务可以执行的最大秒数 (超时时间)。非必填。
     *
     * @var int
     */
    public $timeout = 120;
    
    public function __construct($email)
    {
        $this->email=$email;
    }
     /**
     * 定义任务超时时间,非必填。
     *
     * @return \DateTime
     */
    public function retryUntil()
    {
        return now()->addSeconds(5);
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
         Log::info('queue test'.date('H:i:s'));
         $name = '再别康桥'; 
         // Mail::send()的成功返回值为空,所以可以其他方法进行判断 

        //send三个参数,'email.sendEmail'为页面内容文件,即resource/views/email/sendEmail.html,也可设置纯文本内容;第二参数为邮件名;第三参数匿名函数,处理邮件内容。
         $flag = Mail::send('email.sendEmail',['name'=>$name],function($message){ 
         $message ->to($this->email)->subject('啊,再别康桥'); 
         //带附件并改名
         $attachment=storage_path('app\public\安装.txt');
         $message->attach($attachment,['as'=>'install.txt']);
         });
    }
    /**
     * 任务失败的处理过程,非必填。
     *
     * @param  Exception  $exception
     * @return void
     */
    public function failed(Exception $exception)
    {
        // 给用户发送任务失败的通知,等等……
    }
   
}

​3.普通控制器,调用发送邮箱

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Jobs\QueueEmailController;

class SmtpEmailController extends Controller
{
     public function queue()
    {
        dispatch(new QueueEmailController('568548473@qq.com'))->delay(now()->addMinutes(10));//延迟10分钟发送
    }
}
4.调用两次业务,会在jobs表中发现两个队列信息,等执行后会被清除

5.若队列执行失败,会显示在failed_jobs中。

6.效果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值