Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is correct way of using Nodemailer in expressjs?

I am trying to use nodemailer in expressjs app. Should I keep creating of transport object out of route handler or creating transport object inside route handler is just fine?

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

or

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);
  });
like image 567
Yalamber Avatar asked Jan 14 '14 10:01

Yalamber


Video Answer


1 Answers

You have to think about your use case to make a choice.

The SMTP transport in nodemailer creates a connection pool that you explicitly have to close. This is good because the connection always stays open: you only suffer the connection delays (including TLS negotiation, etc.) when the app starts up.

Your first solution is then good if you send a lot of messages: by keeping a connection open you'll minimize the delay and resource utilization by using the connection pool.

On the other hand, your second solution is good if you send few messages: there's no need to maintain a connection if you send one email per hour. Be careful, as your current code is a bit wrong: you need to explicitly close the connection pool. If you don't, the connection pool will stay open even if you loose the reference to the object.

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

From the looks of this issue, it seems that all errors are reported in the err parameter of the smtpTrans.sendMail callback.

Edit: This answer was written for Nodemailer 0.7. 1.0 is now out and has a few breaking changes, including on how it handles transports and connections. See this blog post for more information.

like image 148
Paul Mougel Avatar answered Sep 24 '22 09:09

Paul Mougel