Search code examples
phplogginglaravel-4swiftmailer

Laravel 4.2 Loging Mails from Swift Mailer


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?


Solution

  • 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();
    }