Laravel 邮件侦听器(发送前 - 能够取消)

Laravel Mail Listener (Before Send - Ability to Cancel)

有没有办法使用 Laravel 的 "Event" class 在发送每封电子邮件之前运行一些代码?我还想要取消 Mail::send();.

的功能

我当然可以在发送电子邮件之前执行此操作:

Event::fire('email.beforeSend');

然后我可以这样听:

Event::listen('email.beforeSend', function()
{
    //my code here
});

这个问题是我必须记住运行 Event::fire() 我不想这样做。在我的例子中,我将电子邮件地址退回到取消订阅列表,以确保我不会发送任何垃圾邮件。

Laravel 的邮件 class 作为发送过程的一部分触发 mailer.sending

protected function sendSwiftMessage($message)
{
    if ($this->events)
    {
        $this->events->fire('mailer.sending', array($message));
    }

    if ( ! $this->pretending)
    {
        $this->swift->send($message, $this->failedRecipients);
    }
    elseif (isset($this->logger))
    {
        $this->logMessage($message);
    }
}

您可以捕获此事件并调整 $message 对象,或者您可以通过在事件处理程序中调用 Mail::pretend(); 来阻止发送。

对于Laravel 5你可以监听Illuminate\Mail\Events\MessageSending事件,如果你想取消发送消息return false

将此添加到您的 EventServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'Illuminate\Mail\Events\MessageSending' => [
            'App\Listeners\CheckEmailPreferences',
        ],
    ];
}

这是我在 App\Listeners\CheckEmailPreferences

的事件侦听器
<?php

namespace App\Listeners;

use App\User;
use Illuminate\Mail\Events\MessageSending;
use Illuminate\Support\Facades\App;

class CheckEmailPreferences
{
    public function handle( MessageSending $event )
    {
        //if app is in prod and we don't want to send any emails
        if(App::environment() === 'production' && ! env('SEND_MAIL_TO_CUSTOMERS')){
            return false;
        }

        //you can check if the user wants to receive emails here
    }
}