Отправка почты без `to` метода в Laravel

Я хочу отправить письмо через laravel. По какой-то причине я только хочу установить cc перед вызовом send метод:

Mail::cc($cc_mail)->send(new MyMailAlert());

Затем я определяю получателя (to) прямо в build метод моего класса Mailable:

$this->subject($subject)->to($to_email)->view('my-mail');

Но это не удается:

Symfony \ Component \ Debug \ Exception \ FatalThrowableError: вызов неопределенного метода Illuminate\Mail\Mailer::cc()

Как я могу отправить письмо, не зная получателя, прежде чем отправлять его в build метод? Другими словами, я хочу установить получателя (в) непосредственно в build метод, и я не знаю, как это сделать.

2 ответа

Решение

cc задокументировано в Документах Laravel, но я не могу найти метод или свойство в Illuminate\Mail\Mailer исходный код, ни в документации Laravel API. Таким образом, вы не можете использовать это таким образом.

Но Illuminate\Mail\Mailable имеет cc имущество. Итак, если вы хотите добавить cc перед отправкой и добавьте to в методе сборки вам нужно что-то вроде этого:

MyMailAlert.php

class MyMailAlert extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

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

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

В вашем контроллере:

$myMailAlert = new MyMailAlert();
$myMailAlert->cc = $cc_mail;

// At this point you have cc already setted.

Mail::send($myMailAlert); // Here you sends the mail

Обратите внимание, что метод сборки использует subject а также to свойства почтового экземпляра, поэтому вы должны установить его перед отправкой.

Я не уверен, откуда вы берете ваши $subject а также $to_email в вашем примере метода сборки, но для моего примера вы должны дать эти значения $myMailAlert->subject а также $myMailAlert->to, Вы можете использовать свои пользовательские переменные в методе сборки, но, учитывая, что у класса уже есть эти свойства, пользовательские переменные не нужны.

Вот хак для решения этой проблемы:

Mail::to([])->cc($cc_mail)->send(new MyMailAlert());

Так что просто добавьте to() метод с пустым массивом, и это работает. Это все еще хак, я не совсем уверен, что это сработает в будущем.

Другие вопросы по тегам