【问题标题】:Queueing mails in Laravel在 Laravel 中排队邮件
【发布时间】:2019-08-22 06:45:33
【问题描述】:

我想在我的网站上创建帐户后向用户发送邮件,我想使用队列来发送邮件。我正在使用 PHP Laravel 框架。

我的控制器在点击“创建帐户”后处理请求:

class LoginController extends Controller
{
   ...
   public function register(Request $request) {
      ...
      $mail = (new RegisterRequest($user))->onConnection("database")->onQueue("emailsQueue");
      Mail::queue($mail);
      ...
   }
}

然后我有这个 RegisterRequest(可邮寄)类:

class RegisterRequest extends Mailable
{
    use Queueable, SerializesModels;

    protected $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function build()
    {

        return $this->from('user@example.com')
            ->to($this->user->email)
            ->subject("Confirm your Email Address")
            ->view('emails.register.request')
            ->with("registration_token", $this->user->registration_token);
    }
}

如您所见,我使用关系数据库来存储作业。实际上,在调用 LoginController 的 register 方法之后,一个作业被保存到数据库中。但无法处理。我也开始php artisan queue:work,但数据库中的作业没有做任何事情。有什么帮助吗?

编辑:

所以我刚刚发现从队列中挑选作业是通过 SQL 选择“默认”队列名称来完成的。但我正在向队列“emailsQueue”发送邮件。所以我现在像这样运行 Queue Worker:php artisan queue:work --queue=emailsQueue,现在一切正常。但是我怎样才能从数据库中的每个队列中挑选工作呢?这可能不是最好的尝试,对吧?命名队列没有任何意义,对吧?但是假设我有一个用于处理注册帐户请求的队列,另一个用于更改密码请求的队列等等......所以我认为处理每个队列确实有意义。那么我该怎么做呢?像这样列出队列就可以做到吗?

php artisan queue:work --queue=registerAccountEmailQueue,changePasswordEmailQueue...

运行php artisan queue:work 到底是什么?我认为这是运行所有队列的命令。

【问题讨论】:

  • 失败的作业中有条目吗?
  • 不,所做的一切都是将记录保存到数据库表'jobs'。什么都没有做。
  • 您在 env 数据库或同步中的队列驱动程序是什么?
  • 它是“数据库”
  • 试试这个方法:Mail::to($user)->send(new RegisterRequest);

标签: php laravel email queue


【解决方案1】:

使用队列驱动数据库。

在控制器中你应该写

    $this->dispatch(new SendNotifyMail($data));

这会将您的$data 传递给队列。这里 SendNotifyMail 用作 Job Class。所以你也应该像use App\Jobs\SendNotifyMail;这样在Controller中使用它。

然后在文件夹作业中创建一个文件,命名为 SendNotifyMail

    <?php

namespace App\Jobs;

use App\Jobs\Job;
use DB;
use Mail;
use Artisan;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendNotifyMail extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;
    public $timeout = 300; // default is 60sec. You may overwrite like this
    protected $data;
    public function __construct($data)
    {
        $this->data = $data;
    }

public function handle(Mailer $mailer)
{
    $data = $this->data; // retrieve your passed data to variable
    // your mail code here
  }
}

在你的命令中你需要写

php artisan queue:listen

php artisan queue:work

然后执行代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2023-03-30
    • 2020-03-08
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多