在后台发送电子邮件:Laravel 5.4

时间:2017-02-14 13:54:04

标签: laravel laravel-5.3 laravel-5.4

我在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);
    }
}

3 个答案:

答案 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。队列文档说明了如何使用它。