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

时间:2014-01-14 10:39:43

标签: node.js nodemailer

我正在尝试在expressjs app中使用nodemailer。我应该继续在路由处理程序之外创建传输对象,还是在路由处理程序中创建传输对象就好了?

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);
  });

1 个答案:

答案 0 :(得分:7)

你必须考虑你的用例做出选择。

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的外观来看,似乎所有错误都在err回调的smtpTrans.sendMail参数中报告。

编辑:这个答案是为Nodemailer 0.7编写的。 1.0现在已经出局并且有一些重大变化,包括它如何处理传输和连接。有关详细信息,请参阅此blog post