Maximize Email Efficiency: A Step-by-Step Guide to Sending 50,000 Emails at Once with Node.js and a Queue

Suneel Kumar
3 min readFeb 1, 2023
Photo by Mediamodifier on Unsplash

Sending a large number of emails can be a time-consuming task, especially if you want to send a high volume of emails at once. If you don’t handle this process carefully, it can quickly become overwhelming and lead to server timeouts, slow response times, and unreliable delivery. Fortunately, with Node.js, you can build an efficient email sending system that can handle a high volume of emails without sacrificing performance.

In this article, we will walk through the process of building an email sending system that can send up to 50,000 emails at once using Node.js and a queue.

Prerequisites

Before we get started, you’ll need to have the following tools installed:

  • Node.js and npm
  • A text editor or IDE of your choice
  • An email provider (such as Sendgrid, Mailgun, or Amazon SES) that supports SMTP or API integration.

Step 1: Setting up the Project

Create a new directory for your project and run npm init to create a package.json file. Then, install the following dependencies:

npm install nodemailer bull
  • nodemailer is a popular NPM package for sending emails in Node.js. It supports many different email providers, including SMTP and API-based services.
  • bull is a popular Node.js package for managing background jobs, including email sending.

Step 2: Setting up the Email Provider

Next, you’ll need to set up an email provider. In this example, we’ll be using Sendgrid, but the process is similar for other providers such as Mailgun or Amazon SES.

First, create an account with Sendgrid. Then, create an API key. This will be used to authenticate your application with Sendgrid.

Step 3: Setting up the Queue

We’ll use bull to create a queue for sending emails. In your project directory, create a new file called queue.js and add the following code:

const Queue = require('bull');
const emailQueue = new Queue('email', 'redis://127.0.0.1:6379');

emailQueue.process(async (job) => {
console.log(`Sending email to ${job.data.to}`);
});

module.exports = emailQueue;

This code creates a new queue called email and sets it to use Redis as the data store. The process method is called whenever a new job is added to the queue, and it will be used to send the email.

Step 4: Sending Emails

Next, create a new file called send-email.js and add the following code:

const nodemailer = require('nodemailer');
const emailQueue = require('./queue');

const transporter = nodemailer.createTransport({
host: 'smtp.sendgrid.net',
port: 587,
auth: {
user: 'apikey',
pass: 'SG.your_api_key_here'
}
});

async function sendEmail(to, subject, text) {
const mailOptions = {
from: 'your_email@example.com',
to: to,
subject: subject,
text: text
};

return emailQueue.add({ to: to, mailOptions: mailOptions }, {
removeOnComplete: true
});
}

module.exports = sendEmail;

This code sets up a `transporter` using the Sendgrid SMTP server. The `sendEmail` function takes in the recipient’s email address, the subject, and the text of the email, and adds it to the email queue as a job. The `mailOptions` object contains the email details, including the sender’s email address, the recipient’s email address, the subject, and the text. The `removeOnComplete` option is set to `true` so that the job will be removed from the queue once it is complete.

Step 5: Sending a Large Volume of Emails

Finally, we can use the `sendEmail` function to send a large volume of emails. Create a new file called `index.js` and add the following code:

const sendEmail = require('./send-email');

async function main() {
const emails = [
{ to: 'email1@example.com', subject: 'Subject 1', text: 'Text 1' },
{ to: 'email2@example.com', subject: 'Subject 2', text: 'Text 2' },
// ...
];

for (const email of emails) {
await sendEmail(email.to, email.subject, email.text);
}
}

main();

This code creates an array of emails and sends each one using the sendEmail function.

Now, run the following command to start the email sending process:

node index.js

As the emails are sent, you should see the status messages in the console.

Conclusion

In this article, we’ve walked through the process of building an efficient email sending system using Node.js, a queue, and an email provider. By using a queue, we can handle a high volume of emails without sacrificing performance, ensuring that all emails are sent in a timely and reliable manner. Whether you’re sending 50,000 emails or just a few, this process can be easily adapted to your needs.

--

--