Отправка почты без метода `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, и я не знаю, как это сделать.


person rap-2-h    schedule 24.04.2017    source источник
comment
какая-то конкретная причина, почему вы хотите это сделать? и что вы подразумеваете под методом build?   -  person imrealashu    schedule 24.04.2017
comment
@imrealashu метод сборки моего почтового класса: laravel.com/docs/5.4/mail# generate-mailables Причина в том, что я не знаю получателя, прежде чем делать что-то в своем почтовом классе   -  person rap-2-h    schedule 24.04.2017


Ответы (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. Вы можете использовать свои пользовательские переменные в методе сборки, но, учитывая, что класс уже имеет эти свойства, пользовательские переменные не нужны.

person Gerard Reches    schedule 24.04.2017

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

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

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

person rap-2-h    schedule 24.04.2017