laravel發送隊列定時郵件

這裏是兩個功能融合在一起:發送郵件和隊列排序,我們分兩步完成。

一.發送郵件

1.修改.env配置文件,

MAIL_DRIVER=smtp //驅動有很多種,免費好用的就這種
MAIL_HOST=smtp.163.com  //若是qq郵箱,則爲smtp.qq.com
MAIL_PORT=465 //若MAIL_ENCRYPTION=ssl,否則2525不變
[email protected] //郵箱號
MAIL_PASSWORD=zddxxx //授權碼
MAIL_ENCRYPTION=ssl
[email protected] //郵箱號
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('[email protected]'))->delay(now()->addMinutes(10));//延遲10分鐘發送
    }
}
4.調用兩次業務,會在jobs表中發現兩個隊列信息,等執行後會被清除

5.若隊列執行失敗,會顯示在failed_jobs中。

6.效果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章