在Laravel中排队邮件

时间:2019-04-01 06:46:24

标签: php laravel email queue

在网站上创建帐户后,我想向用户发送邮件,并且我希望使用队列发送邮件。我正在使用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”。因此,我现在正在像这样运行队列工作器:php artisan queue:work --queue=emailsQueue,目前一切正常。但是,如何从数据库的每个队列中选择作业?这可能不是最佳尝试,对吧?命名队列没有任何意义,对吧?但是,假设我有一个队列用于处理注册帐户请求,另一个队列用于更改密码请求,依此类推……因此,我认为处理每个队列确实有意义。那我该怎么做呢?可以这样列出队列来完成吗?

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

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

1 个答案:

答案 0 :(得分:0)

使用队列驱动程序数据库。

您应该在控制器中编写

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

这会将您的$data传递到队列中。这里 SendNotifyMail 用作作业类别。因此,您还应该像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

然后执行代码。