laravel 队列之队列消息与发送邮件
前期准备:
- 开发环境: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\SendEmail; 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 SendEmail($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 协议》,转载必须注明作者和本文链接
推荐文章: