Почему отправка электронной почты с использованием почты laravel не работает, если она использует очередь?

Моя почта laravel выглядит так:

<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderReceivedMail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;
    public $order;
    public $store;
    public function __construct($order, $store)
    {
        $this->order = $order;
        $this->store = $store;
        $this->subject('subject');
    }
    public function build()
    {
        $company_email = explode(',',config('app.mail_company'));
        return $this->view('vendor.notifications.mail.email-order-received',['number'=>$this->order->number, 'store_name' => $this->store->name])->bcc($company_email);
    }
}

Мой env, как это:

BROADCAST_DRIVER=pusher
CACHE_DRIVER=redis
SESSION_DRIVER=file
QUEUE_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Если код выполняется, он не работает. Письмо не отправлено или почтовый код не выполнен

Но если я уберу implements ShouldQueue, это сработает. Электронная почта успешно отправлена

Почему, если я использую shouldqueue, он не работает?


person Success Man    schedule 28.11.2017    source источник
comment
Вы используете усадьбу?   -  person lewis4u    schedule 28.11.2017
comment
@ lewis4u, как узнать, использую ли я усадьбу или нет? Где я могу это проверить?   -  person Success Man    schedule 29.11.2017
comment
Homestead — это виртуальная машина, на которой предустановлено все программное обеспечение, необходимое для Laravel. Как вы работаете с Laravel? Какую операционную систему вы используете (Windows, MAC OS, Linux)?   -  person lewis4u    schedule 29.11.2017
comment
@lewis4u, на моем локальном хосте я использую Windows   -  person Success Man    schedule 06.12.2017
comment
Извините, я не использую Windows, поэтому я не могу вам больше помочь.   -  person lewis4u    schedule 06.12.2017
comment
@lewis4u, хорошо. Нет проблем. В моем локальном хосте используйте windows. На моем сервере, похоже, используется Linux   -  person Success Man    schedule 06.12.2017


Ответы (1)


При использовании ShouldQueue ваши электронные письма не отправляются мгновенно. Вам нужно запустить обработчик очереди php artisan queue:work, как описано здесь https://laravel.com/docs/5.5/queues#running-the-queue-worker

person lchachurski    schedule 28.11.2017
comment
Но если он не использует усадьбу, то и это не сработает! Особенно, если он использует Windows и XAMPP. - person lewis4u; 28.11.2017
comment
Я предполагаю, что он перенастроил часть env, которую он предоставил. Кстати. усадьба - это не святой Грааль, он тоже мог бы использовать ларадок :) - person lchachurski; 28.11.2017
comment
Я предполагаю, что он даже не знает, что такое Redis или Homestead. - person lewis4u; 29.11.2017
comment
@veNuker, какая польза от очереди? В чем преимущество использования shoulqueue и каковы потери, если не использовать shouldqueue - person Success Man; 06.12.2017
comment
Если вы удалите его, письмо будет отправлено мгновенно. Он обрабатывается тем же процессом php и работает быстрее. Недостатком является то, что если происходит что-то неожиданное, например, исключение, электронная почта не отправляется, а ее данные теряются, так как они хранились в памяти. ShouldQueue сохраняет содержимое электронной почты в указанное место, например, в Redis или на жестком диске. Он отправляется другим процессом, когда вы запускаете свою очередь с помощью команды, указанной в ответе. - person lchachurski; 06.12.2017
comment
@veNuker, хорошо. Спасибо за Ваш ответ. Итак, если вы используете очередь, в локальном хосте электронная почта не отправляется автоматически? Он должен запускаться php artisan queue:work для отправки электронной почты. Верно? Что, если на промежуточном или производственном сервере это будет автоматически? - person Success Man; 06.12.2017
comment
Верно. Для производства и подготовки вам также необходимо выполнить эту команду artisan queue:work. Обычно вы делаете это с помощью crontab, для laravel это рекомендуемый способ - laravel.com/docs/5.5/scheduling - person lchachurski; 07.12.2017