【问题标题】:Do an action every time the system sends and email每次系统发送和发送电子邮件时执行一个操作
【发布时间】:2020-12-26 22:24:31
【问题描述】:

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

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

我该怎么办?

【问题讨论】:

    标签: laravel laravel-7


    【解决方案1】:

    根据7.x documentation

    # 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 编写处理每个与邮件相关的异常的方法。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多