Приложению не удается отправить электронное письмо с помощью Mail :: ... queue () - PullRequest
1 голос
/ 06 августа 2020

У меня проблема с почтой при использовании queue. Если я использую Почту с send(), все работает нормально.

Контроллер:

Mail::to($order_data->client_email)
    ->cc([
        ['email' => $order_data->seller->email],
        ['email' => auth()->user()->email]
    ])
    ->queue(new SendOrderConfirmation($order_data));

Почтовый ящик:

class SendOrderConfirmation extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Defines a public variable $order_data that we will be using to pass in parameters from our controller.
     */
    public $order_data;

    /**
     * Create a new message instance.
     */
    public function __construct($data)
    {
        // set email data
        $this->order_data = $data;

        // Set Reply to address
        // Basically, the name and email from who's sending this email
        $this->replyto(auth()->user()->email, auth()->user()->name);

        // Set from
        $this->from(auth()->user()->email, auth()->user()->name);

        // set email subject
        $this->subject('Laminar - Confirmação da Encomenda N.º '.$this->order_data->order_nr);
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('send_emails.Lamimail.SendOrderConfirmation');
    }
}

Если я инициирую электронное письмо с очередью (), Я получаю сообщение об ошибке в заданиях телескопа:

Trying to get property 'name' of non-object 
(View: path\resources\views\send_emails\Lamimail\SendOrderConfirmation.blade.php)

Но в представлении почты имя простое auth()->user()->name.

Кто-нибудь знает, что я отсутствует в очереди?

С уважением

РЕШЕНИЕ , на основе отзывов @Ersoy. Обратите внимание на public $sender_name; Отправляемое по почте:

{
    use Queueable, SerializesModels;

    /**
     * Defines a public variable $order_data that we will be using to pass in parameters from our controller.
     */
    public $order_data;

    /**
     * Will be used to save the sender name
     */
    public $sender_name;

    /**
     * Create a new message instance.
     */
    public function __construct($data)
    {
        // set email data
        $this->order_data = $data;

        // Set sender name to be used on mail view
        $this->sender_name = auth()->user()->name;

        // Set Reply to address
        // Basically, the name and email from who's sending this email
        $this->replyto(auth()->user()->email, auth()->user()->name);

        // Set From
        $this->from(auth()->user()->email, auth()->user()->name);

        // set email subject
        $this->subject('subject...');
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('view...');
    }
}

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Когда задание или адрес электронной почты queued, вы больше не можете получить доступ к сеансу (переменным в сеансе), потому что нет доступа HTTP, когда задание обрабатывается "асинхронно". Из-за этого вы не можете получить аутентифицированного пользователя (при обработке задания нет c user).

Вам необходимо отправить аутентифицированного пользователя (как объект или массив) в конструктор SendOrderConfirmation, тогда вы можете использовать его внутри класса.

Будет работать без очереди, потому что это будет sync, и все же сеанс можно использовать.

0 голосов
/ 06 августа 2020

Вы пробовали просто отправить имя в виде данных, добавив его в свой $order_data и отобразив его в почтовой колонке, чтобы увидеть, решит ли это проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...