【问题标题】:How can I solve Call to undefined method Illuminate\Notifications\Messages\MailMessage::bcc() on laravel notification?如何在 laravel 通知上解决对未定义方法 Illuminate\Notifications\Messages\MailMessage::bcc() 的调用?
【发布时间】:2018-03-29 20:30:03
【问题描述】:

我使用 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');
    }
}

有效

【问题讨论】:

    标签: laravel email laravel-5 notifications laravel-5.3


    【解决方案1】:

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

    但是,在 Laravel 5.3 中,当您向一组收件人发送 MailMessage 时,它会在后台自动使用密件抄送。所以,你可以用原来的地址加上要密送的人员列表创建一个数组,然后使用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 返回。 Mailable 对象支持bcc(),当你从toMail() 函数返回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');
    }
    

    【讨论】:

    • 我这样调用控制器的通知:auth()-&gt;user()-&gt;notify(new ConfirmOrder($data));。用户的电子邮件未发送。它只在-&gt;to(...) 内发送电子邮件
    • 它有效。但在电子邮件中,视图看起来有点奇怪。看看这个:ibb.co/evfDD6。在电子邮件中,标签to: 不存在。它应该包含来自用户的电子邮件
    • @samueltoh 这是正确的。在后端,它根本没有设置收件人地址,它使用密件抄送地址发送给每个人。这是最容易使用的解决方案。如果这是不可接受的,你需要扩展和替换 Laravel 的 MailChannel 来做你需要的。
    • 我想收到你的答案,但是视图看起来有点奇怪。如果您有修复视图的解决方案,那么您可以更新您的答案。现在我尝试邮件类(laravel.com/docs/5.3/mail)来解决我的问题。因为它可以使用密件抄送
    • 看我的问题。我找到了解决方案
    猜你喜欢
    • 2018-08-14
    • 2017-09-28
    • 2021-09-01
    • 2023-04-07
    • 2017-05-28
    • 2019-10-20
    • 2018-10-03
    • 2015-11-15
    • 2018-06-25
    相关资源
    最近更新 更多