有没有办法在每封电子邮件发送之前使用Laravel的“Event”类来运行一些代码?我也希望能够取消Mail::send();
。
当然,在发送电子邮件之前,我可以这样做:
Event::fire('email.beforeSend');
然后我可以这样听:
Event::listen('email.beforeSend', function()
{
//my code here
});
这个问题是我必须记得运行Event::fire()
我不想做的事情。在我的情况下,我在取消订阅列表中弹出电子邮件地址,以确保我不发送任何垃圾邮件。
答案 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
}
}