前期準備:
- 開發環境:homestead(Ubuntu 18.04 LTS+php 7.2.30+mysql 5.7.22)
確保安裝了redis擴充套件,如無安裝,請執行:composer require predis/predis
- 配置資訊
在config/queue.php
的connections
中配置:
在.env檔案中配置傳送郵件的郵箱:'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, ],
在此有個需要注意的地方,MAIL_PASSWORD不是郵箱的登入密碼,而是POP3/SMTP服務密碼(設定方法)。MAIL_MAILER=smtp #郵箱伺服器地址 MAIL_HOST=smtp.163.com MAIL_PORT=25 #郵箱賬號 MAIL_USERNAME=XXX@163.com #POP3/SMTP服務密碼 MAIL_PASSWORD=XXXX MAIL_ENCRYPTION=null #可以隨便填寫字串,但是一定不能為空 MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}"
注意:本例子中使用的是網易郵箱和SMTP,不同驅動下的伺服器地址、埠號均不同:
- 伺服器地址:
POP3伺服器: pop.163.com
SMTP伺服器: smtp.163.com
IMAP伺服器: imap.163.com
安全支援:
POP3/SMTP/IMAP服務全部支援SSL連線 - 埠:
開發階段:
- 生成生成任務類
執行命令:
php artisan make:job SendEmail
執行成功在app/Jobs目錄下生成SendEmail類。修改類的內容後如下:
namespace App\Jobs;
use App\Models\UserInfo;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(UserInfo $user)
{
//
$this->user = $user;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(Mailer $mailer)
{
//
$user = $this->user;
$mailer->send('emails.reminder',['user'=>$user],function($message) use ($user){
$message->to($user->email)->subject('新功能釋出');
});
}
}
參考資料:Laravel 佇列系列 —— 基於 Redis 實現任務佇列的基本配置和使用
- 編寫呼叫函式:
加上測試路由:<?php namespace App\Admin\Controllers; use App\Http\Controllers\Controller; use App\Jobs\SendReminderEmail; use App\Models\UserInfo; use Illuminate\Http\Request; use Illuminate\Support\Facades\Redis; class ApiController extends Controller { private $redis; public function __construct(){ $this->redis = Redis::connection('default'); } public function test(Request $request){ //方便測試,寫死 $user = UserInfo::find(1); $this->dispatch(new SendReminderEmail($user)); } }
Route::group([ 'prefix' => 'admin', 'middleware' => ['web'], ], function (Router $router) { $router->any('api/{action}', function ($action) { $ctrl = \App::make("\\App\\Admin\\Controllers\\ApiController"); return \App::call([$ctrl, $action]); }); });
測試階段:
呼叫xxx.test/api/test
得出結果:
進入檢視郵件:
至此,郵件傳送成功完成!
本作品採用《CC 協議》,轉載必須註明作者和本文連結