我在Laravel中使用内置代码发送电子邮件通知。代码如下。我正在使用smtp发送电子邮件
class RegisterNotification extends Notification
{
use Queueable;
public function __construct($token)
{
$this->token = $token;
}
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->line('hi');
}
public function toArray($notifiable)
{
return [
//
];
}
}
问题在于,完成整个过程需要大约5秒钟,而且控制权不会再回来。我假设如果它回来并在背景中发送电子邮件...这将节省大量时间。
有没有内置工作做同样的事情?我的意思是,控制应该回来,应该说发送电子邮件......然后它应该在后台进行工作。
电子邮件在控制器中发送代码
class apiRegisterController extends Controller
{
public function Register(RegisterRequest $request) {
$RegisterNotification = new RegisterNotification($Token);
$User->notify($RegisterNotification);
}
}
队列代码
控制器代码
$job = (new SendForgotPasswordEmail($Data))->onConnection('database');
dispatch($job);
作业
class SendForgotPasswordEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $Data;
public $tries = 5;
public function __construct($Data)
{
$this->Data = $Data;
}
public function handle()
{
$Token = $this->Data["Token"];
$User = $this->Data["User"];
$RegisterNotification = new RegisterNotification($Token);
$User->notify($RegisterNotification);
}
}
答案 0 :(得分:3)
第1步:将class RegisterNotification extends Notification
更改为class RegisterNotification extends Notification implements ShouldQueue
第2步:实施队列驱动程序。在config/queue.php
中,请确保您的驱动程序未设置为同步:'default' => env('QUEUE_DRIVER', 'sync'),
并确保您的.env没有QUEUE_DRIVER=sync
。您可以查看Laravel documentation for queues以选择适当的队列驱动程序
答案 1 :(得分:0)
您可以使用laravel作业队列https://laravel.com/docs/5.4/queues
Mail::queue(
答案 2 :(得分:0)
您可以使用build-in API。
$user = User::findOrFail($id);
Mail::queue('emails.welcome', $data, function ($message) use ($user){
$message->from('hello@app.com', 'Your Application');
$message->to($user->email, $user->name)->subject('Your Reminder!');
});
但首先你需要configure the queues。
在.env文件中添加第QUEUE_DRIVER=sync
行,然后在终端php artisan queue:listen
上写字。
如果您希望队列在服务器上永久运行,请使用Supervisor
。队列文档说明了如何使用它。