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
的方式不会打断程序原始的执行流程。