10

我正在尝试在 expressjs 应用程序中使用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);
  });
4

1 回答 1

8

您必须考虑您的用例才能做出选择。

SMTP 传输nodemailer会创建一个您必须明确关闭的连接池。这很好,因为连接始终保持打开状态:您只会在应用启动时遭受连接延迟(包括 TLS 协商等)。

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

另一方面,如果您发送少量消息,则第二种解决方案很好:如果您每小时发送一封电子邮件,则无需保持连接。小心,因为您当前的代码有点错误:您需要显式关闭连接池。如果你不这样做,即使你失去了对对象的引用,连接池也会保持打开状态。

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

这个问题的外观来看,似乎所有错误都在回调的err参数中报告。smtpTrans.sendMail

编辑:这个答案是为 Nodemailer 0.7 编写的。1.0 现在已经发布,并且有一些重大更改,包括它如何处理传输和连接。有关更多信息,请参阅此博客文章

于 2014-01-14T13:30:12.177 回答