这里是两个功能融合在一起:发送邮件和队列排序,我们分两步完成。
一.发送邮件
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.效果