2017-01-16 67 views
0

標題說明了這一切。我正嘗試創建一個應用程序,用戶可以在其中定義自己的smtp並使用我的應用程序向他們的客戶發送電子郵件。我如何手動更改Mailable類將使用的smtp信息?使用用戶定義的smtp在通過Mailable類與Laravel 5.3發送電子郵件時使用5.3

隊列中的消息也很重要,所以我想可郵寄類應該somhow有SMTP信息。我能想到的

一種解決方案是創建一個電子郵件模型,並保存到發送電子郵件,包括從用戶到數據庫SMTP設置所需的所有數據。然後,我可以創建一個檢索此模型的排隊作業,並只調用Email對象的發送方法。該發送方法消息郵寄課程,設置與Config :: set()併發送它的smtp配置。

將它的工作或我的想法是有缺陷的......

回答

0

如果你看一看的\Illuminate\Mail\TransportManager類,在createSmtpDriver()方法,你會發現其中的SMTP設置在從配置拉昇。在您的配置中,如果您將驅動程序設置爲smtp,則Laravel將調用此方法。

Laravel Mailer類包含一個公共方法來設置Swift Mailer實例。所以,你基本上可以創建自己的實例,並將通過您在發送郵件前(我沒有測試過這一點):

public function yourMethod(Mailer $mailer) 
{ 
    $transport = Swift_SmtpTransport::newInstance(
     'YourHost', 'YourPort' 
    ); 
    $transport->setUsername('YourPassword'); 
    $transport->setPassword('YourPassword'); 
    $swift = new Swift_Mailer($transport); 

    $mailer->setSwiftMailer($swift); 

    $mailer->send(...); 
} 

通常,如果你想介紹一些自定義的功能集成到像梅勒一個Laravel類,你將能夠定義你自己的驅動程序(在這種情況下你自己的傳輸),並使用Laravel的API來擴展它並添加你自己的發送郵件的方法。

同樣,我沒有測試過這一點,但你可能延長TransportManager類添加自己的驅動程序。你可以把下面的代碼說AppServiceProvider

$manager = app('swift.transport'); // Will get you an instance of TransportManager 
$manager->extend('customsmtp', function() { 
    // Your custom code to create your own transport for the mailer. Just like the createSmtpDriver method in TransportManager. 
    $transport = Swift_SmtpTransport::newInstance(
     'YourHost', 'YourPort' 
    ); 
    $transport->setUsername('YourPassword'); 
    $transport->setPassword('YourPassword'); 

    return $transport; 
}); 
+0

謝謝,會試試! – user1365447

相關問題