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

ste*_*y68 5 listeners laravel-4

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

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

Event::fire('email.beforeSend');
Run Code Online (Sandbox Code Playgroud)

然后我可以这样听:

Event::listen('email.beforeSend', function()
{
    //my code here
});
Run Code Online (Sandbox Code Playgroud)

这个问题是我必须记住Event::fire()我不想做的事情.在我的情况下,我正在反对取消订阅列表的电子邮件地址,以确保我不发送任何垃圾邮件.

cee*_*yoz 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*son 5

对于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',
        ],
        ............
    ];
............
}
Run Code Online (Sandbox Code Playgroud)

这是我的事件监听器,位于 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
    }
}
Run Code Online (Sandbox Code Playgroud)