2014-01-14 43 views
7

我正在嘗試在expressjs應用程序中使用nodemailer。我應該不斷創建傳輸對象出路由處理程序或在路由處理程序內創建傳輸對象就好了嗎?在expressjs中使用Nodemailer的正確方法是什麼?

var express = require('express') 
    , app = express() 
    , nodemailer = require('nodemailer'); 

    smtpTrans = nodemailer.createTransport('SMTP', { 
     service: 'Gmail', 
     auth: { 
      user: "[email protected]", 
      pass: "application-specific-password" 
     } 
    }); 
    app.post('/register', function(req, res){ 
    smtpTrans.sendMail(mailOptions); 
    }); 

var express = require('express') 
    , app = express() 
    , nodemailer = require('nodemailer'); 

    app.post('/register', function(req, res){ 
    smtpTrans = nodemailer.createTransport('SMTP', { 
     service: 'Gmail', 
     auth: { 
      user: "[email protected]", 
      pass: "application-specific-password" 
     } 
    }); 
    smtpTrans.sendMail(mailOptions); 
    }); 
+0

該文檔指出*「相同的傳輸對象可以並應該多次重複使用。」*(請參閱[這裏](https://github.com/andris9/Nodemailer#setting-up-a-transport-method )),所以我想正確的方法是你的第一個例子。 –

+0

這將保持SMTP連接始終正確? – Yalamber

+0

確實。如果您發送大量消息以減少連接時間開銷,那麼這就是您想要的。 –

回答

6

你要想想你的使用情況做出選擇。

nodemailer中的SMTP傳輸會創建一個連接池,您必須關閉該連接池。這很好,因爲連接始終保持打開狀態:應用程序啓動時,您只會遇到連接延遲(包括TLS協商等)。

如果您發送大量消息,那麼您的第一個解決方案就很好:通過保持連接打開,您可以通過使用連接池來最大程度地減少延遲和資源利用率。

另一方面,如果您發送的消息很少,那麼您的第二個解決方案就很好:如果每小時發送一封電子郵件,則無需保持連接。請小心,因爲您當前的代碼有點不對:您需要顯式關閉連接池。如果不這樣做,即使您丟失對該對象的引用,連接池也將保持打開狀態。

smtpTrans = nodemailer.createTransport('SMTP', { … }); 
smtpTrans.sendMail(mailOptions, function (err, responseStatus) { 
    smtpTrans.close(); // Don't forget to close the connection pool! 
}); 

this issue看起來,似乎所有的錯誤都在smtpTrans.sendMail回調err參數的報道。

編輯:本答案是爲Nodemailer 0.7編寫的。 1.0現在已經出來,並且有一些重大改變,包括它如何處理傳輸和連接。有關更多信息,請參見blog post

+0

它會是smtpTransport.close();或smtpTrans.close();? – Yalamber

+0

這是一個錯字,修復了代碼。 –

+2

節點編輯器連接池是「懶惰」的,只有在發送一些郵件時連接纔會保持活動狀態。這也意味着如果你沒有明確地關閉傳輸,那麼打開SMTP連接將停留在服務器關閉這些處於非活動狀態 - 最終達到與transport.close()相同的關閉狀態。雖然很可能你不想要未使用的連接。 – Andris

相關問題