【问题标题】:Laravel Mail Listener (Before Send - Ability to Cancel)Laravel 邮件监听器(发送前 - 可以取消)
【发布时间】:2015-03-04 14:29:59
【问题描述】:

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

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

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

然后我可以这样听:

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

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

【问题讨论】:

    标签: laravel-4 listeners


    【解决方案1】:

    对于 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
        }
    }
    

    【讨论】:

    • 谢谢,我能根据你的例子弄清楚。我确实注意到您使用的是 env() 而不是 config() 函数。根据文档,如果您使用 config:cache,则 env 在配置类之外不起作用
    • 我不认为我使用它,但您可以将其作为配置变量来满足这些需求,并为您的配置变量使用 env() 函数
    • 如果提供了多封电子邮件,有没有办法过滤掉电子邮件?就像开发一样,我只想给自己发邮件
    • @NielsLucas 您可以在操作后返回$event 以更改收件人。我自己没试过,但理论上应该工作
    • @MikeHarrison 感谢您的回复,我确实尝试过。但是该对象中有很多数据+很多我无法访问的私有属性。一个多小时后我放弃了。沮丧,因为我真的认为我可以让它工作。
    【解决方案2】:

    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(); 来阻止发送。

    【讨论】:

    • 有趣。所以我的听众看起来像Event::listen('mailer.sending', function(){});?不熟悉Mail::pretend(); 我猜这与配置中的'pretend' =&gt; false 做同样的事情。我会解决这个问题并回复你。
    • 我认为Mail::pretend(); 会“假装”发送另一封电子邮件,但不会取消当前的电子邮件。我对吗? laravel.com/docs/4.2/mail#mail-and-local-development
    • 它会打开“假装”模式。 sendSwiftMessage 中的下一行检查该模式并跳过发送。
    • 哦,明白了。没有阅读上面的所有代码。听起来这可能是唯一的方法。但我不认为我只想为一封电子邮件更改全局设置。我会继续寻找。
    • 好吧,它只会为一个网页浏览打开它。它不会更改应用程序的整体配置设置。如果你愿意,你可以抛出一个异常。
    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多