如何在 laravel 通知上解决 Call to undefined method Illuminate\Notifications\Messages\MailMessage::bcc() 问题?

How can I solve Call to undefined method Illuminate\Notifications\Messages\MailMessage::bcc() on laravel notification?

我用Laravel 5.3

我试试 cc,有效

但是我尝试密件抄送,存在这样的错误:

Call to undefined method Illuminate\Notifications\Messages\MailMessage::bcc()

我的代码是这样的:

<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class ConfirmOrder extends Notification implements ShouldQueue, ShouldBroadcast
{
    use Queueable;
    private $data;
    public function __construct($data)
    {
        $this->data = $data;
    }
    public function via($notifiable)
    {
        return ['mail'];
    }
    public function toMail($notifiable)
    {
        $mail_myshop = explode(',',config('app.mail_myshop'));
        return (new MailMessage)
                    ->bcc($mail_myshop)
                    ->subject('Thanks')
                    ->greeting('Hi '.$notifiable->name.',')
                    ->line('....')
                    ->line('...');
    }
}

似乎Laravel 5.3不支持密件抄送

如何解决错误?

更新

我找到了解决方案

在我的控制器中是这样的:

Mail::to(auth()->user())->send(new ConfirmOrder($data, auth()->user()));

在我的邮件中是这样的:

<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class ConfirmPaymentMail extends Mailable
{
    use Queueable, SerializesModels;
    public $data;
    public $user;
    public function __construct($data, $user)
    {
        $this->data = $data;
        $this->user = $user;
    }
    public function build()
    {
        $mail_myshop = explode(',',config('app.mail_myshop'));
        return $this->view('vendor.notifications.mail.email-confirm-order',['data'=>$this->data, 'name' => $this->user->name])
                    ->bcc($mail_myshop)
                    ->subject('Test');
    }
}

有效

如您所见,MailMessage 对象在 Laravel 5.3 中没有 bcc() 方法。它是在 5.4 中添加的。

但是,在 Laravel 5.3 中,当您向一组收件人发送 MailMessage 时,它会在后台自动使用密件抄送。所以,你可以用原来的收件人地址加上要密件抄送的人员列表来创建一个数组,然后使用to()方法,每个人都会被密件抄送。但是,这将使 "to" 地址留空。

// get the bcc list
$mail_myshop = explode(',',config('app.mail_myshop'));

// add the original recipient
array_unshift($mail_myshop, $notifiable->routeNotificationFor('mail'));

return (new MailMessage)
    ->to($mail_myshop) // if $mail_myshop is an array, will auto convert to bcc in 5.3
    ->...

不过,最好在此处做个注释,如果您确实将应用程序升级到 Laravel 5.4+,情况就不再如此,您的所有收件人都将添加到 to() 字段。

最后一个解决方案是创建一个 Mailable 对象。此 Mailable 对象可以从 toMail() 方法而不是 MailMessage 中 return 编辑。 Mailable对象支持bcc(),当你从toMail()函数中return一个Mailable对象时,它只是调用send()方法。

根据更新中提供的代码,您的 toMail() 方法如下所示:

public function toMail($notifiable)
{
    $data = /*whatever data is*/;
    $mail_myshop = explode(',', config('app.mail_myshop'));
    return (new ConfirmPaymentMail($data, $notifiable))
        ->to($notifiable->routeNotificationFor('mail'))
        ->bcc($mail_myshop)
        ->subject('Thanks');
}