在expressjs中使用Nodemailer的正确方法是什么?

我正在尝试在expressjs应用程序中使用nodemailer 。 我应该不断创build传输对象的路由处理程序或在路由处理程序内创build传输对象就好了吗?

var express = require('express') , app = express() , nodemailer = require('nodemailer'); smtpTrans = nodemailer.createTransport('SMTP', { service: 'Gmail', auth: { user: "me@gmail.com", 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: "me@gmail.com", pass: "application-specific-password" } }); smtpTrans.sendMail(mailOptions); }); 

你必须考虑你的用例做出select。

nodemailer的SMTP传输创build一个连接池,您必须closures。 这样做很好,因为连接始终保持打开状态:在应用程序启动时,您只会遇到连接延迟(包括TLS协商等)。

如果您发送大量消息,那么您的第一个解决scheme就很好:通过保持连接打开,您将通过使用连接池将延迟和资源利用率降至最低。

另一方面,如果您发送的邮件很less,则您的第二个解决scheme是很好的:如果每小时发送一封电子邮件,则无需保持连接。 要小心,因为你目前的代码有点不对,你需要明确地closures连接池。 如果不这样做,即使您丢失对该对象的引用,连接池也将保持打开状态。

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

从这个问题看来,所有的错误都是在smtpTrans.sendMailcallback的err参数中报告的。

编辑:这个答案是为Nodemailer 0.7编写的。 1.0现在已经出来,并且有一些重大的改变,包括如何处理传输和连接。 看到这个博客文章了解更多信息。