使用Queue进行邮件但laravel 5.4似乎没有响应

Mur*_*dia 5 laravel-5.4

我是第一次使用队列,我似乎没有让它工作,laravel似乎没有任何错误.

我正在尝试将用户注册的邮件排队,即应立即将用户重定向到仪表板,并将电子邮件排队.我怎么知道队列是否工作?在点击注册时我必须等待8秒才能看到仪表板,我在注册时收到电子邮件,但队列似乎失败了.

注册时我在mysql作业表上看不到任何队列作业.

以下是我的设置:

使用以下命令创建的作业和作业失败表:

php artisan queue:table
php artisan queue:failed-table
php artisan migrate
Run Code Online (Sandbox Code Playgroud)

.ENV

QUEUE_DRIVER=database

MAIL_DRIVER=smtp

MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=dummy@gmail.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=hello@example.com
MAIL_FROM_NAME="App name"
Run Code Online (Sandbox Code Playgroud)

RegisterController create()函数

在创建函数结束之前 return $user;

dispatch(new NewRegisteredUser($user));
Run Code Online (Sandbox Code Playgroud)

作业文件:NewRegisteredUser

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Mail;
use App\User;
use App\Mail\RegisteredUserWelcome;

class NewRegisteredUser implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $user;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $email = new RegisteredUserWelcome($this->user);
        Mail::to($this->user->email)->queue($email);
    }
}
Run Code Online (Sandbox Code Playgroud)

邮件文件:RegisteredUserWelcome

namespace App\Mail;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class RegisteredUserWelcome extends Mailable
{
    use Queueable, SerializesModels;

    protected $user;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->markdown('emails.registered')
            ->with([
                        'firstname' => $this->user->firstname,
                        'lastname' => $this->user->lastname,
                    ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?我没有收到错误并且发送了邮件,但在mysql中没有观察到队列作业,注册时间很长.

我也很困惑这个:https://laravel.com/docs/5.4/mail#queueing-mail符合这个https://laravel.com/docs/5.4/queues为什么我们已经有了单独的队列在邮件排队?

我应该使用什么以及如何使用?我需要做的就是减少用户的等待时间并在场景后发送邮件.此外,我在某些情况下发送多封电子邮件.我想如果我排队多个电子邮件的工作,这将有所帮助.

Mur*_*dia 7

我使用markdown作为邮件模板

我让队列工作,输出就可以了php artisan queue:listen.

问题是.env文件没有明确缓存.php artisan config:clear让它发挥作用.通过简单地延迟工作,可以使队列更有效率.

我把工作推迟了60秒(1分钟),事情很顺利.

我将发布我必须创建的所有代码和文件以使其工作.

设置.env文件

QUEUE_DRIVER=database

MAIL_DRIVER=smtp

MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=dummy@gmail.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION="tls or ssl"  (double quotes not required)
MAIL_FROM_ADDRESS="email address to be shown to email receiver" (double quotes not required)
MAIL_FROM_NAME="App Name" (double quotes not required only if you have blank space between the name)
Run Code Online (Sandbox Code Playgroud)

这行代码确保考虑.env文件中的新值

php artisan config:clear
Run Code Online (Sandbox Code Playgroud)

在我的Controller文件中

use Mail;
use App\Jobs\NewprofileCreated;
use App\Mail\ProfileCreated;
Run Code Online (Sandbox Code Playgroud)

控制器代码

dispatch((new NewprofileCreated($user))->delay(60));
Run Code Online (Sandbox Code Playgroud)

使用以下命令创建的两个文件

php artisan make:job NewprofileCreated
php artisan make:mail ProfileCreated
Run Code Online (Sandbox Code Playgroud)

NewprofileCreated作业文件

use Mail;
use App\User;
use App\Mail\ProfileCreated;

class NewprofileCreated implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $user;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
         $email = new ProfileCreated($this->user);
        Mail::to($this->user->email)->queue($email);
    }
}
Run Code Online (Sandbox Code Playgroud)

ProfileCreated邮件文件

class ProfileCreated extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->markdown('emails.profile_created');
    }
}
Run Code Online (Sandbox Code Playgroud)

profile_created markdown template(文件夹:view/emails/profile_created)

@component('mail::message')

<h1>Your new profile is created</h1>

You have received this email because your profile was created for {{ config('app.name') }}


Thanks,<br>
{{ config('app.name') }}
@endcomponent
Run Code Online (Sandbox Code Playgroud)