2015-12-09 43 views
0

在我的項目中,我需要記錄從應用程序發送的每封郵件。Laravel 4.2從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(); 
} 

所有干將,回到這裏Null
注意:我的所有消息都在這裏簽名。

如何訪問這些值或者記錄郵件的最佳方式是什麼?

回答

1

我做了一些更多的研究,並找到這個非常靈活的技術來記錄所有郵件。

使用隊列發送的郵件無法通過該級別的getter讀取,因爲即使使用sync隊列驅動程序,事件仍以延遲模式準備。

要做到這一點的關鍵是Event訂閱者。在發送消息之前,Laravel的默認郵件程序觸發mailer.sending事件。

如果您使用某個第三方服務提供商註冊郵件程序,請確保郵件程序構造函數獲取第三個參數,例如$app['events']

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

在創建(APP /庫)

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

    public function subscribe($events) { 
    $events->listen('mailer.sending', '[email protected]'); 
    } 

}

註冊這個類作爲事件訂戶在global.php

Event::subscribe(new MyEventHandler); 

最後一個事件訂戶類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(); 
}