【发布时间】:2020-12-26 22:24:31
【问题描述】:
我正在使用 laravel 7,我想记录系统发送的每封电子邮件。我为此创建了一个表。所以我需要在创建电子邮件时插入一条记录,然后在成功发送后,用发送日期更新该记录。
我使用 Mail 类来制作和发送邮件。因此,为了防止修改类(避免创建一个新类,因为该类无处不在),我认为我需要将发送方法“绑定”到我的自定义日志操作。那可能吗?我认为在中间件中但我需要修改 Mail 类,或者不需要?
我该怎么办?
【问题讨论】:
我正在使用 laravel 7,我想记录系统发送的每封电子邮件。我为此创建了一个表。所以我需要在创建电子邮件时插入一条记录,然后在成功发送后,用发送日期更新该记录。
我使用 Mail 类来制作和发送邮件。因此,为了防止修改类(避免创建一个新类,因为该类无处不在),我认为我需要将发送方法“绑定”到我的自定义日志操作。那可能吗?我认为在中间件中但我需要修改 Mail 类,或者不需要?
我该怎么办?
【问题讨论】:
# Events
Laravel 在发送邮件消息的过程中会触发两个事件。 MessageSending 事件在消息发送之前触发,而 MessageSent 事件在消息发送后触发。请记住,这些事件是在发送邮件时触发的,而不是在排队时触发的。您可以在 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 应用程序中发生的事情。
【讨论】: