這裏是兩個功能融合在一起:發送郵件和隊列排序,我們分兩步完成。
一.發送郵件
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.效果