Index
实现思路
开发中无法避免有要发送邮件的情况,在开发或测试环节,一般都需要对邮件发送操作进行拦截,仅对指定的邮箱发送邮件,避免用户收到测试邮件。在 Laravel 中有一个非常简单的办法实现这一功能,其原理如下:
无论是通过 Mail 或 Notification 的方式来发送邮件,最后都会执行到 Illuminate\Mail\Mailer::class 类的 send() 方法:
1 | public function send($view, array $data = [], $callback = null) |
在通过一系列的操作之后,得到了一个 $swiftMessage 对象,通过 shouldSendMessage() 方法来检查该对象是否应该发送邮件。此处会触发一个 MessageSending 事件,通过监听这个事件,并做出相应的返回,达到控制邮件是否发送的目的。
监听事件
在 App\Providers\EventServiceProvider::class 类中定义事件监听:
1 |
|
然后通过 php artisan event:generate 命令生成监听类 App\Listeners\SendMailFilter::class
过滤
在事件监听器中写入邮箱过滤的逻辑,比如通过添加白名单的方式:
1 | class SendMailFilter |
需要注意的是,在 return false 处可以直接抛出异常,也可达到过滤效果,区别在于,通过 return false 的方式不会打断程序原始的执行流程。