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

11

我正在尝试在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);
  });

文档说明:“相同的传输对象可以和应该被多次重复使用。”(请参见此处),因此我认为你的第一个示例是正确的方式。 - Paul Mougel
那会一直保持SMTP连接,对吧? - Yalamber
确实。如果您发送大量消息以减少连接时间开销,这正是您想要的。 - Paul Mougel
1
如果我的SMTP服务器在某个时刻崩溃或在启动应用程序时出现问题会发生什么? - Yalamber
1个回答

10

要做出选择,您必须考虑您的用例。

nodemailer中的SMTP传输创建了一个连接池,您需要显式地关闭它。这是很好的,因为连接始终保持打开状态:只有在应用程序启动时才会遇到连接延迟(包括TLS协商等)。

如果您发送大量消息,则第一种解决方案很好:通过保持连接打开,您将通过使用连接池最小化延迟和资源利用率。

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

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

根据这个问题的情况,似乎所有错误都在smtpTrans.sendMail回调函数的err参数中报告。 编辑:此答案适用于Nodemailer 0.7。1.0现已发布,有一些重大变化,包括如何处理传输和连接。请参阅此博客文章获取更多信息。

是smtpTransport.close();还是smtpTrans.close();? - Yalamber
2
Nodemailer的连接池是“惰性”的,只有在有邮件需要发送时才会保持连接活动状态。这也意味着,如果您没有明确关闭传输,则打开的SMTP连接将一直保持到服务器因不活动而关闭它们 - 最终达到与transport.close()相同的关闭状态。尽管如此,您很可能不希望保留未使用的连接。 - Andris
2
那么最好在请求处理程序之外创建传输吗?此外,如果我的SMTP服务器在任何时候都处于离线状态,它会重新连接吗? - Yalamber
2
是的,如果在发送邮件时没有可用的连接,则连接池会自动创建一个新连接。只有在您尝试发送邮件的确切时刻服务器处于离线状态时才会出现错误,否则无论服务器是否在线都不重要。 - Andris
FYI,在Ubuntu上,我搭建了自己的SMTP邮件服务器,并使用Nginx发送邮件,几乎每3-5天发送一次邮件,下一次发送时出现了504(网关超时)错误,我认为是nodemailer在我的情况下无法保持SMTP连接。 - Imskull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接