Laravel 4.2 Loging Mails from Swift Mailer

跟風遠走 提交于 2019-12-12 02:24:28

问题


In my project I need to log each mail I send from my application.

Mail::queue('email.template', $vars, function($message) {
    $message->to('someone', 'Her name')->subject("<3");
    LogModel::log($message);
});

and in LogModel

public static function log(Message $message) {
    $msg = $message->getSwiftMessage();
    $log = new self;

    $log->to = $msg->getTo();
    $log->subject = $msg->getSubject();
    $log->cc = $msg->getCc();
    $log->bcc = $msg->getBcc();
    $log->body = $msg->getBody();
    $log->headers = serialize($msg->getHeadres());

    $log->save();
}

All getters, here return Null.
Note: All of my messages are signed here.

How can I access these values or what is the best way to log mails?


回答1:


I did a little more research and find this very flexible technique to log all mails.

Mail sent using queue can't be read for values via getter at that level as things are prepared in deferred mode even with sync queue driver.

The key to do that is Event subscriber. Laravel's default mailer triggers mailer.sending event just before sending the message.

If you are using some third party service provider to register mailer then make sure Mailer constructor is getting third parameter as $app['events'] e.g.

$mailer = new Mailer($app['view'], $app['swift.mailer'], $app['events']);

Creating an event subscriber class in (app/library)

class MyEventHandler{
  public function onMailSent($message) {
    LogModel::log($message);
  }

  public function subscribe($events) {
    $events->listen('mailer.sending', 'MyEventHandler@onMailSent');
  }

}

Registering this class as event subscriber in global.php

Event::subscribe(new MyEventHandler);

And finally LogModel as

public static function log($msg) {
    // if $msg is instance of Illuminate\Mail\Message
    $msg = $msg->getSwiftMessage();
    $log = new self;

    $to = array_keys($msg->getTo());        
    $log->to = array_shift($to);
    $log->subject = $msg->getSubject();
    $log->cc = $msg->getCc();
    $log->bcc = $msg->getBcc();
    $log->body = $msg->getBody();
    $log->headers = serialize($msg->getHeaders());

    $log->save();
}


来源:https://stackoverflow.com/questions/34187367/laravel-4-2-loging-mails-from-swift-mailer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!