Laravel Mail Listener(发送前 - 能够取消)

时间:2015-01-06 20:44:23

标签: laravel-4 listeners

有没有办法在每封电子邮件发送之前使用Laravel的“Event”类来运行一些代码?我也希望能够取消Mail::send();

当然,在发送电子邮件之前,我可以这样做:

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

然后我可以这样听:

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

这个问题是我必须记得运行Event::fire()我不想做的事情。在我的情况下,我在取消订阅列表中弹出电子邮件地址,以确保我不发送任何垃圾邮件。

2 个答案:

答案 0 :(得分:5)

Laravel的Mail类会在发送过程中触发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();来阻止发送。

答案 1 :(得分:3)

对于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
    }
}
相关问题