在 Laravel 中发送没有 `to` 方法的邮件

Sending a mail without `to` method in Laravel

我想通过 laravel 发送邮件。出于某种原因,我只想在调用 send 方法之前设置 cc

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

然后我直接在我的 Mailable class:

build 方法中定义收件人 (to)
$this->subject($subject)->to($to_email)->view('my-mail');

但是失败了:

Symfony\Component\Debug\Exception\FatalThrowableError: Call to undefined method Illuminate\Mail\Mailer::cc()

如何在 build 方法发送邮件之前不知道收件人的情况下发送邮件?换句话说,我想直接在 build 方法中设置收件人 (to),但我不知道该怎么做。

这里有一个解决这个问题的技巧:

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

因此只需添加一个带有空数组的 to() 方法即可。它仍然是一个 hack,我不确定它在未来是否会起作用。

cc 记录在 Laravel Docs, but I can't find the method or property in the Illuminate\Mail\Mailer source code, neither in the Laravel API Documentation 中。所以你不能这样使用它。

但是 Illuminate\Mail\Mailablecc 属性。所以,如果你想在发送之前添加 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

注意构建方法使用了可邮寄实例的subjectto属性,所以你必须在发送前设置它。

我不确定您从哪里检索构建方法示例中的 $subject$to_email,但对于我的示例,您必须将这些值提供给 $myMailAlert->subject$myMailAlert->to。您可以在构建方法中使用自定义变量,但鉴于 class 已经具有这些属性,因此不需要自定义变量。