【问题标题】:How Send emails in queue in Laravel如何在 Laravel 中按队列发送电子邮件
【发布时间】:2018-08-22 22:15:03
【问题描述】:

我尝试在队列中发送电子邮件,但没有成功。

Mail::queue('emails.mailsubscribe', ['email'=>$email], 
    function($message) use($email)
    {
       $message->to('user@xxx.in')->subject('Subscribe: XXXXX');
    });

【问题讨论】:

  • 你是通过php artisan queue:work命令启动队列的吗?
  • 不,我没有运行那个命令

标签: laravel email


【解决方案1】:

为了使Laravel 5/6 完全排队,您需要执行以下步骤:

  1. php artisan queue:table(求职)
  2. php artisan queue:failed-table(用于失败的作业)
  3. php artisan migrate
  4. 在.env中设置QUEUE_DRIVER=database
  5. 火:php artisan config:cache
  6. 消防排队:php artisan queue:work database --tries=1(在所有未完成的尝试之后,它将在失败的作业表中注册)

由于发送电子邮件消息会大大延长应用程序的响应时间,因此许多开发人员选择将电子邮件消息排队以进行后台发送。 Laravel 使用其内置的统一队列 API 使这变得容易。要对邮件消息进行排队,请在指定消息的收件人后使用 Mail 门面的 queue 方法:

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->queue(new OrderShipped($order));

此方法会自动将作业推送到队列中,以便在后台发送消息。当然,您需要在使用此功能之前配置您的队列。

如果您希望延迟发送排队的电子邮件,您可以使用后一种方法。作为它的第一个参数,后面的方法接受一个 DateTime 实例,指示应该何时发送消息:

$when = now()->addMinutes(10);

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->later($when, new OrderShipped($order));

如果您有希望始终排队的可邮寄类,您可以在该类上实现 ShouldQueue 协定。现在,即使你在发送邮件时调用了 send 方法,由于它实现了合约,mailable 仍然会被排队:

use Illuminate\Contracts\Queue\ShouldQueue;

class OrderShipped extends Mailable implements ShouldQueue
{
    //
}

【讨论】:

  • 很好的答案:)
  • 从 Laravel Doc 中逐字复制?它有什么了不起的?如果您复制/粘贴,至少应该指出来源? laravel.com/docs/5.8/mail
  • 我知道这是复制粘贴,但只显示摘要真的很整洁
  • 不确定这更改了哪个版本,但在 L6 中,它现在是 QUEUE_CONNECTION=database,而不是 QUEUE_DRIVER。我最初在您的帖子中使用了 QUEUE_DRIVER 属性,然后运行 ​​config:cache 命令发现它不起作用,当我意识到新的 .env 属性名称并将其更改为 QUEUE_CONNECTION 时,我没想到要重置配置再次缓存,这导致了几个小时的邮件刚刚发送而没有进入队列
  • 是的,在 Laravel 6 及以上版本中,您可以在 QUEUE_CONNECTION 中指定您的驱动程序类型。
猜你喜欢
  • 2022-08-13
  • 2019-03-09
  • 2023-04-05
  • 2019-07-17
  • 2018-10-08
  • 2019-11-21
  • 2021-06-26
  • 1970-01-01
  • 2019-09-25
相关资源
最近更新 更多