Send and Schedule e-mails from a Node.js app
Tags: node, javascript, tips
Published: 2019-09-19 13:42:09

As an application developer, how often we sense the need of a service that would send e-mails to specified or subscribed email ids? Even if there is no real need, we still fantasize about it while developing a pet-project or an app for fun, don't we 😁?

In this article, I am going to explain the simple steps to send emails from your node.js app. At the end of it, we will be able to schedule and send e-mails. Not only that, we will be creating a REST API to post required details to a node.js app for sending emails. 

**TL;DR**
Here is the working app
![action.gif](https://cdn.hashnode.com/res/hashnode/image/upload/v1568559587037/mYahNkH_i.gif)
*REST API to send e-mail from a node.js app*

You can find the code from my GitHub Repo: [Test REST app for Sending e-mails](https://github.com/atapas/test-rest-app)

# Setting the stage
 [Nodemailer](https://nodemailer.com/about/) is a super cool module for Node.js application to allow email sending so easily. Install it using `npm`

```javascript
npm install nodemailer --save
```

Import `Nodemailer` in your `.js`(app.js, email.js whatever) file:

```javascript
let nodemailer = require('nodemailer');
```

Next, follow these three simple steps to get things working:
- Setup a message option: This is to tell `Nodemailer` *who* is sending *what* message to *whom*?

 ```javascript
 let mailOptions = {
        from: '<FROM_EMAIL_ADDRESS>',
        to: '<TO_EMAIL_ADDRESS>',
        subject: 'Email from Node-App: A Test Message!',
        text: 'Some content to send'
  };
 ```
 👉 Note: The `to` property above can have multiple email ids separated by commas(,).

- Create a `Nodemailer` *transporter* using either SMTP(this is default) or  [some other transport](https://nodemailer.com/transports/) mechanism

 ```javascript
 let transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
          user: '<FROM_EMAIL_ADDRESS>',
          pass: '<FROM_EMAIL_PASSWORD>'
        }
  });
 ```
 👉 Note: In the above example, the `service` is mentioned as `gmail`. This is just an example. You can specify the name of the e-mail services you want to actually use.

- Use `sendMail()` method of your previously created transporter to deliver the message.

 ```javascript
 transporter.sendMail(mailOptions, function(error, info){
        if (error) {
          console.log(error);
        } else {
          console.log('Email sent: ' + info.response);
        }
  });
 ```

That's all, you are done. Now we have everything required to send e-mail from this node.js app.

# Hang on a Minute, We can schedule it!
Yeah, right! The real power of this app comes with the fact that, you will be able to schedule the emails like,
- Send now
- Send everyday at 7p.m.(19:00 hrs), like a daily-digest
- Send every 30 minutes.
- Send on 29th Feb!
- .... many many more desired ways.

You guessed it right, we need something like a cron job and for that we will be using a node module called, [node-cron](https://www.npmjs.com/package/node-cron).

- First install it.

 ```javascript
 node install node-cron --save
 ```
- Import `node-cron` and schedule a task
 
 ```javascript
 let cron = require('node-cron');
 
 cron.schedule('* * * * *', () => {
     console.log('running a task every minute');
  });
 ```
 👉 Note: You can read about several cron schedule patterns  [here](https://github.com/node-cron/node-cron). In the above example, we have scheduled a simple console log in every minute.

Here is the combined code where I am scheduling the e-mail to send every minute:

```js
  let cron = require('node-cron');
  let nodemailer = require('nodemailer');

  // e-mail message options
  let mailOptions = {
        from: '<FROM_EMAIL_ADDRESS>',
        to: '<TO_EMAIL_ADDRESS>',
        subject: 'Email from Node-App: A Test Message!',
        text: 'Some content to send'
   };

  // e-mail transport configuration
  let transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
          user: '<FROM_EMAIL_ADDRESS>',
          pass: '<FROM_EMAIL_PASSWORD>'
        }
    });
 
 cron.schedule('* * * * *', () => {
  // Send e-mail
  transporter.sendMail(mailOptions, function(error, info){
        if (error) {
          console.log(error);
        } else {
          console.log('Email sent: ' + info.response);
        }
    });
  });
```
TADAAA, Done!

![sent.gif](https://cdn.hashnode.com/res/hashnode/image/upload/v1568562815375/1hnouwcyL.gif)

# REST API to Schedule and Send e-mail
Well, this is an optional part for you, if your are not interested in creating a REST API for the purpose of Scheduling and Sending e-mails. In case you mind, we can do it in a minute using  [sails.js](https://sailsjs.com/). I have posted an article on *[How to Deploy your Sails.js app on Heroku and live longer](https://blog.greenroots.info/how-to-deploy-your-sailsjs-app-on-heroku-and-live-longer-cjzv8igb2001m6vs1qhg5pdnt)*. Take a quick look.

- Create a route in `routes.js` file of your sails.js app
 ```js
  'post /api/sendemail': 'EmailController.sendEmail'
 ```
- Create an `EmailController` with `sendEmail` method. This method should have the code discussed above for scheduling and sending email.

Wow, that was quick, isn't it? 

👉 Note: With sails.js, you can also use other cron libraries like `sails-hook-cron` as well. The details can be found  [here](https://www.npmjs.com/package/sails-hook-cron) .

<HR/>

Let me know if this was useful to you. 

Please feel free to comment on the alternate ways and methods you may be using for serving the same purpose, i.e, *Scheduling and Sending e-mails* from a node.js ap.