将 headers 添加到作为 Laravel 通知发送的电子邮件

Adding headers to email sent as a Laravel Notification

有人知道如何在通过 Laravel Notification System 发送的电子邮件中添加 header 吗?

我说的不是Mailable 类 我可以通过withSwiftMessage()方法设置header!

一旦我有大量使用 linegreetings 方法构建的电子邮件,我也想继续使用 MailMessage

有人知道吗?

这里有我的代码,以防有人需要查看任何内容!

<?php

namespace PumpMyLead\Notifications\Tenants\Auth;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;

class AccountActivation extends Notification
{
    use Queueable;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['mail'];
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('My email subject')
            ->greeting('Just a greeting')
            ->line('Line 1')
            ->line('Line 2')
            ->action('CTA wanted', 'http://www.pumpmylead.com')
            ->line('Byebye');
    }
}

提前致谢!

实际上我找到了 2 种附加 headers 的方法。

当通过邮件通道发送通知时,会触发 Illuminate\Mail\Events\MessageSending 事件。

为其添加一个监听器。在 handle() 你会得到 Swift_Message object.

或者在 AppServiceProviderregister() 方法中用您自己的覆盖 MailChannel 并在 send() 方法中附加 header。

$this->app->bind(
    \Illuminate\Notifications\Channels\MailChannel::class,
    MyMailChannel::class
);

在 ./app/Notifications/myNotification.php 中,将此代码添加到您的 __construct() 函数中:

$this->callbacks[]=( function($message){
    $message->getHeaders()->addTextHeader('x-mailgun-native-send', 'true');
});

将 "x-mailgun-native-send" 替换为您要添加的任何 header, 和 'true' 具有所需的值。

https://github.com/laravel/ideas/issues/475

Debbie V 的答案很接近,但不太正确。她引用的问题很清楚,但她错过了解决方案提供的必要上下文。

默认情况下,Laravel 中的通知使用 MailMessage,但您也可以将其 return 改为 Mailable。仅当您:a) 创建自定义可邮寄邮件,并且 b) 使用它而不是 MailMessage 时才会应用回调。

更完整的解决方案是:

  1. 创建自定义可邮寄 class php artisan make:mail MyMailable
  2. 更新您的 public function toMail($notifiable) 方法以利用新的 Mailable
  3. 将回调添加到 MyMailable class.
  4. 的构造函数

然后你应该一切都好。最难的部分是调整当前使用的 MailMessage 以适应 Mailable.

的 API

如果上述方法不起作用,这里有一个现代的 2022 替代方案,已在 Laravel 8 中测试。

使用withSwiftMessage()

public function toMail($notifiable)
{
    return (new MailMessage)
        ->subject($subject)
        ->greeting($greeting)
        ->line($line1)
        ->line($line2)
        ->withSwiftMessage(function($message) use ($value1, $value2) {
            $message->getHeaders()->addTextHeader('X-MJ-CustomID', json_encode([
                'key1' => $value1,
                'key2' => $value2,
            ]));
        })
}