How to send emails using Amazon SES in Node.js

Amazon SES (Simple Email Service) is a popular cloud-based service for sending transactional and marketing emails. It integrates well with all popular programming languages.

In this tutorial, I shall explain how to use this email service for sending transactional (or even marketing) emails in an Express.js/Node.js project.

Want to integrate AWS SES in Spring Boot project? Follow this tutorial for step-by-step instructions.

AWS SES Setup

To use AWS SES in your project, you must have:

  • An AWS account with full access to SES service (you need to create a support ticket to remove sandbox restrictions)
  • A verified email address or domain name you want to use for sending emails

If you need help, follow these instructions to complete the setup.

👉 Try Amazon SES with EmailOctopus — A low-cost email marketing platform offering high deliverability, customized reports, and the ability to drip email sequences, import contacts, and integrate with forms.

Create a Node.js Project

Let us create a new Node.js project and install all the required dependencies. We will use the official AWS SDK for JavaScript to call SES email service API.

$ npm init -y
$ npm install express body-parser aws-sdk --save

The -y flag will skip the questionnaire and create a default package.json file project in the root directory.

Sending Emails using AWS SES API

Create a ses-client.js file in your project root directory with the following content:

ses-client.js

const AWS = require('aws-sdk');

const config = require('./config'); // load configurations file

AWS.config.update({
    accessKeyId: config.aws.key,
    secretAccessKey: config.aws.secret,
    region: config.aws.ses.region
});

const ses = new AWS.SES({apiVersion: '2010-12-01'});

const sendEmail = (to, subject, message, from) => {
    const params = {
        Destination: {
            ToAddresses: [to]
        },
        Message: {
            Body: {
                Html: {
                    Charset: 'UTF-8',
                    Data: message
                },
                /* replace the Html attribute with the following if you want to send plain text emails. 
                Text: {
                    Charset: "UTF-8",
                    Data: message
                }
             */
            },
            Subject: {
                Charset: 'UTF-8',
                Data: subject
            }
        },
        ReturnPath: from ? from : config.aws.ses.from.default,
        Source: from ? from : config.aws.ses.from.default,
    };

    ses.sendEmail(params, (err, data) => {
        if (err) {
            return console.log(err, err.stack);
        } else {
            console.log("Email sent.", data);
        }
    });
};

module.exports = {sendEmail};

In the above file, we have created a function called sendEmail that can be invoked from anywhere in the Node.js application to send an email via SES API.

Now create a config.js file in the root directory and specify the AWS access key, access secret, and other required information.

config.js

module.exports = {
    'aws': {
        'key': 'YOUR_ACCESS_KEY',
        'secret': 'YOUR_ACCESS_SECRET',
        'ses': {
            'from': {
                // replace with an actual email address
                'default': '"Example.com" <noreply@example.com>', 
            },
            // e.g. us-west-2
            'region': 'YOUR_ACCESS_REGION' 
        }
    }
};

Create server.js File

Let us create a server.js file in our project root directory that will be used to run our Node.js application:

server.js

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

const sesClient = require('./ses-client');

app.use(bodyParser.urlencoded({ extended: false }));  
app.use(bodyParser.json());

app.get('/', (req, res) => {
    // call sesClient to send an email
    sesClient.sendEmail('user@example.com', "Hey! Welcome", "This is the body of email");
    
    res.send('Email is sent!');
});

app.listen(3000, () => {
    console.log('App is listening on port 3000');
});

Source code: Download the complete source code from GitHub available under MIT license.

Run the Application

To execute the project, run the following command in the terminal:

$ npm run start

It will start the application server listening on port 3000 for connections. To test the solution, open the following URL in your browser window: http://localhost:3000. It is only a basic example to test the solution.

✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.

You might also like...

Digital Ocean

The simplest cloud platform for developers & teams. Start with a $200 free credit.

Buy me a coffee ☕

If you enjoy reading my articles and want to help me out paying bills, please consider buying me a coffee ($5) or two ($10). I will be highly grateful to you ✌️

Enter the number of coffees below:

✨ Learn to build modern web applications using JavaScript and Spring Boot

I started this blog as a place to share everything I have learned in the last decade. I write about modern JavaScript, Node.js, Spring Boot, core Java, RESTful APIs, and all things web development.

The newsletter is sent every week and includes early access to clear, concise, and easy-to-follow tutorials, and other stuff I think you'd enjoy! No spam ever, unsubscribe at any time.