How to Send Recurring Emails in Node.js with SendGrid

December 01, 2021
Written by
Reviewed by
Sam Agnew
Twilion

Header

When building applications, there are often times when you need to create and run background tasks that run on a schedule such as checking for updates or backing up data.

There are many ways of scheduling recurring tasks in Node.js such as using Crontab or cloud based extensions. Another approach to scheduling recurring tasks is through npm packages such as node-cron and node-schedule which provide flexible cron scheduling to Node.js through libraries without the need to rely on infrastructure.

In this tutorial, you’ll learn how to use node-schedule and SendGrid to schedule recurring emails.

Prerequisites

Here is what you will need to follow along with this article:

Configure your environment

Start off by logging into your SendGrid account and heading to the API Keys section. Click the blue “Create API Key” button on the top right.

Screen Shot 2021-11-18 at 3.21.26 PM.png

Choose whatever name you’d like for your API key and click the blue “Create & View” button. Copy your API key and store it in a safe place.

Set up your Node.JS application

The next step is to create your scheduler. Inside your terminal or command prompt, navigate to your preferred directory and enter:

mkdir email-scheduler
cd email-scheduler

You will need the @sendgrid/mail package to send emails using the Twilio SendGrid API, the dotenv package to access environment variables, and the node-schedule package to schedule the recurring emails.

Your next step is to create two new files inside your main directory: index.js, and .env:

touch index.js .env

Open up the .env file using your preferred IDE and place the following lines into the file:

SENDGRID_API_KEY=XXXXXXXX

Replace the `SENDGRID_API_KEY` placeholder with the API key you copied earlier and save the file.\

Build your scheduler

Open the index.js file and place the following lines in the file:

require('dotenv').config()
const schedule = require('node-schedule');
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);

This code will initialize the packages you installed earlier and will configure the SendGrid package with your API key.

Test out the SendGrid API

For our scheduler, let's create a recurring email that gets sent every 24 hours. But before you do this let's test out the SendGrid API. Add the following code to the index.js file:

const msg = {
    to: RECIPIENT_EMAIL, // Change to your recipient
    from: SENDER_EMAIL, // Change to your verified sender
    subject: `Cheers to a new day!`,
    text: 'Hope your day has been well!',
}
sgMail.send(msg);

In production applications, it's recommended to verify your Sender Identity by completing Domain Authentication. A Sender Identity represents your 'From' email address—the address your recipients see as the sender of your emails. For a step-by-step tutorial on this check out: How to set up domain authentication for Twilio SendGrid.

Save the file and navigate back to your terminal and enter the following command:

node index

Check the inbox of the recipient email and the email should arrive shortly. Now that the SendGrid API has been tested, let's set up the scheduler.

Set up the scheduler

Node Schedule is a flexible job scheduler that allows you to execute functions at specific times with optional recurrence rules. For your scheduler, you’ll be using Cron-style scheduling. The format for a Cron expression is as follows:

*    *    *    *    *    *

┬    ┬    ┬    ┬    ┬    ┬

│    │    │    │    │    │

│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)

│    │    │    │    └───── month (1 - 12)

│    │    │    └────────── day of month (1 - 31)

│    │    └─────────────── hour (0 - 23)

│    └──────────────────── minute (0 - 59)

└───────────────────────── second (0 - 59, OPTIONAL)

For more info on cron-based scheduling or how to use the Node Schedule package check out the Node Schedule package on npm.

In the index.js file, replace the testing code from earlier with the following:

const job = schedule.scheduleJob('0 10 * * *', function () {
    const msg = {
        to: RECIPIENT_EMAIL, // Change to your recipient
        from: SENDER_EMAIL, // Change to your verified sender
        subject: `Cheers to a new day!`,
        text: 'Hope your day has been well!',
    }
    sgMail.send(msg);
});

The cron expression to schedule an email once a day will be: 0 10 * * *. This will have our function run every day at 10:00:00 which translates to 10 AM. For testing purposes, feel free to change it to your nearest hour. Don’t forget to replace and add in the recipient and sender emails.

Save the file, run the script again with node index in the terminal and you’re done! This script will continuously run and will recurringly send an email every 24 hours at the chosen hour.

What's Next?

In this tutorial, we went through how to send an email with SendGrid and how to schedule them using Node.js. Scheduling and automating tasks is easier than ever with Node.js and is even helpful when it comes to the development process of applications.

Start exploring more ways to harness the power of scheduling! Play around with the cron expressions or even expand the application by building more recurring jobs. To have better control of your scheduled jobs, implement a Node.js process manager - Packages such as PM2 and Forever run your script as a daemon and ensures your application is running 24/7.

For more solutions on scheduling tasks in Node.js check out: 4 ways to schedule Node.js code.

Happy Building!

Dhruv Patel is a Developer on Twilio’s Developer Voices team. You can find Dhruv working in a coffee shop with a glass of cold brew or he can either be reached at dhrpatel [at] twilio.com or LinkedIn.