Laravel 4.2从Swift Mailer记录邮件 [英] Laravel 4.2 Loging Mails from Swift Mailer

查看:105
本文介绍了Laravel 4.2从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);
});

以及在LogModel中

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

所有吸气剂,在这里返回Null.
注意:我所有的消息都在这里签名.

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

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

推荐答案

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

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

即使使用sync队列驱动程序,也要以延迟模式进行准备,所以无法通过getter在该级别读取使用队列发送的邮件的值.

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.

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

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

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

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

}

在global.php中将此类注册为事件订阅者

Registering this class as event subscriber in global.php

Event::subscribe(new MyEventHandler);

最后是LogModel作为

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

这篇关于Laravel 4.2从Swift Mailer记录邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆