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