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
}
}
有没有办法使用 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
}
}