2014-01-14 61 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

相关问题