Send Transactional Emails in Node.js with Nodemailer

Sending transactional emails—such as welcome messages, password resets, and order confirmations—is a core requirement for modern web applications. This article provides a quick, step-by-step guide on how to integrate and configure Nodemailer in a Node.js application to reliably deliver transactional emails using an SMTP server.

Step 1: Install Nodemailer

First, you need to install the Nodemailer package in your Node.js project. Run the following command in your terminal:

npm install nodemailer

Step 2: Configure the SMTP Transporter

Nodemailer uses a transporter object to define the mail delivery service. You will need your SMTP credentials (host, port, username, and password) from your email service provider (such as SendGrid, Mailgun, Postmark, or a standard Gmail account for testing).

Here is how to initialize the transporter:

const nodemailer = require('nodemailer');

// Create a transporter object using SMTP transport
const transporter = nodemailer.createTransport({
  host: 'smtp.your-email-provider.com', // e.g., smtp.mailtrap.io
  port: 587,                            // Port 587 is standard for secure TLS
  secure: false,                        // Use true for port 465, false for other ports
  auth: {
    user: 'your_smtp_username',         // Your SMTP username
    pass: 'your_smtp_password',         // Your SMTP password
  },
});

Step 3: Define Email Options and Send

Once the transporter is configured, define the email details including the sender, recipient, subject line, and the email body (in plain text, HTML, or both). Finally, use the sendMail method to send the message.

// Define email options
const mailOptions = {
  from: '"Your App Name" <no-reply@yourdomain.com>', // Sender address
  to: 'recipient@example.com',                      // List of receivers
  subject: 'Your Transactional Email Subject',       // Subject line
  text: 'Hello! This is a plain text transactional email.', // Plain text body
  html: '<h1>Hello!</h1><p>This is an <b>HTML</b> transactional email.</p>', // HTML body
};

// Send the email
transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    return console.log('Error sending email:', error);
  }
  console.log('Email sent successfully. Message ID:', info.messageId);
});

Best Practices for Transactional Emails