Laravel 4.2 记录来自 Swift Mailer 的电子邮件

Laravel 4.2 Loging Mails from Swift Mailer

在我的项目中,我需要记录从应用程序发送的每封邮件。

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

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

所有getter,这里return Null.
注意:我所有的消息都在这里签名。

如何访问这些值或记录邮件的最佳方式是什么?

我做了更多研究,发现这种非常灵活的技术可以记录所有邮件。

即使使用 sync 队列驱动程序,也无法通过 getter 在该级别读取使用队列发送的邮件的值,因为事情是在延迟模式下准备的。

做到这一点的关键是事件订阅者。 Laravel 的默认邮件程序在发送邮件之前触发 mailer.sending 事件。

如果您使用某些第三方服务提供商注册邮件程序,请确保邮件程序构造函数将第三个参数作为 $app['events'],例如

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

在 (app/library)

中创建事件订阅者 class
class MyEventHandler{
  public function onMailSent($message) {
    LogModel::log($message);
  }

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

}

正在将此 class 注册为 global.php

中的事件订阅者
Event::subscribe(new MyEventHandler);

最后 LogModel 为

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