【问题标题】:Laravel 5.3 Mail not sending to queue job after submit dataLaravel 5.3 提交数据后邮件未发送到队列作业
【发布时间】:2017-10-20 10:34:34
【问题描述】:

几天来我一直在尝试解决队列邮件,但我仍然找不到解决方案。 请查看我的控制器、工作、邮件

控制器

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Contact;
use App\Jobs\SendEmail;

class MailController extends Controller
{
public function getContact(){
    return view ('mail');
}

public function postContact(Request $request){

        $contact = new Contact;
        $contact->email = $request['email'];
        $contact->name = $request['name'];
        $contact->subject = $request['subject'];
        $contact->save(); 

        dispatch(new SendEmail($contact));
        return back();
}
}

工作

<?php
namespace App\Jobs;
use App\Contact;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Contracts\Mail\Mailer;
Use App\Mail\EmailContact;

class SendEmail implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;

public $contact;

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

public function handle(Mailer $mailer)
{
    $email = new EmailContact($this->contact);
    $mailer->to($this->contact->email)->send($email);
}
}

邮件

<?php
namespace App\Mail;
use App\Contact;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class EmailContact extends Mailable
{
use Queueable, SerializesModels;

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

public function build()
{
    return $this->view('emails.contact')->with([
        'email' => $this->contact->email,
        'name' => $this->contact->name,
        'subject' => $this->contact->subject,
    ]);
}
}

之后我添加 php artisan queue:work 但结果仍然与使用 SEND 相同。 我的编码有什么问题吗?

【问题讨论】:

    标签: php email laravel-5.3


    【解决方案1】:

    在您的可邮寄类中实现ShouldQueue

    use Illuminate\Contracts\Queue\ShouldQueue;
    
    class EmailContact extends Mailable implements ShouldQueue
    

    还要验证您的队列驱动程序。默认情况下,laravel 将队列驱动程序设置为 sync。这意味着任何队列作业都将像普通代码一样运行,即使您尝试对其进行排队。您需要先实现一个队列才能使其工作。尝试数据库或 redis 队列。

    QUEUE_DRIVER=sync

    【讨论】:

    • 嗨,谢谢,我终于解决了这个问题。在我的 .env 文件中,我的 QUEUE_DRIVER=database。第一次我检查 dd(config('queue.default'));它的输出仍然是同步的。所以我通过 php artisan config:clear 清除缓存,最后它工作了!我真的需要在我的可邮寄课程中实现 ShouldQueue 吗?因为没有实现它,它仍然可以工作
    • 是的,我注意到你已经在你的工作类中实现了ShouldQueue。因此,它应该在您发送工作而不是直接发送邮件时起作用。但是你甚至可以直接从你的控制器调用 mailable,在这些场景中你可能需要实现它。
    猜你喜欢
    • 2016-05-21
    • 2014-08-04
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多