每次系统发送和发送电子邮件时执行一个操作

Do an action every time the system sends and email

我正在使用 laravel 7,我想记录系统发送的每一封电子邮件。我为此创建了一个 table。所以我需要在创建电子邮件时插入一条记录,然后在成功发送后,用发送日期更新该记录。

我使用 Mail class 来制作和发送邮件。因此,为了防止修改 class(避免制作新的,因为 class 无处不在)我认为我需要将发送方法“绑定”到我的自定义日志操作。那可能吗?我想在中间件中,但我需要修改邮件 class,或者不需要?

我该怎么办?

根据7.x documentation

# Events

Laravel fires two events during the process of sending mail messages. The MessageSending event is fired prior to a message being sent, while the MessageSent event is fired after a message has been sent. Remember, these events are fired when the mail is being sent, not when it is queued. You may register an event listener for this event in your EventServiceProvider:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Mail\Events\MessageSending' => [
        'App\Listeners\LogSendingMessage',
    ],
    'Illuminate\Mail\Events\MessageSent' => [
        'App\Listeners\LogSentMessage',
    ],
];

这个例子看起来很像你要找的东西。至于邮件不成功时的日志记录,您可以在 catch 块中进行。

try {
    Mail::to(...)->send(...);
} catch (\Exception $e) { // Maybe use a more specific mail-related exception.
    // Log failed mail. 
}

或使用 Exception handler 编写处理每个邮件相关异常的方法。

甚至您也可以避免为日志记录创建表。只需使用 Redis 永久存储这些类型的数据,并使用事件来捕获您的 Web 应用程序中发生的事情。