# Send and Schedule e-mails from a Node.js app

As an application developer, how often do we sense the need for 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 side-project or an app for fun, don't we 😁?

In this article, I will 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 the 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, we have mentioned the `service` as `gmail`. It is just an example. You can specify the name of the e-mail services you want to use.

- Use the `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, and 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 every day at 7 p.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
It is an optional part for you if you are not interested in creating a REST API for Scheduling and Sending e-mails. In case your 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 the `routes.js` file of your sails.js app
 ```js
  'post /api/sendemail': 'EmailController.sendEmail'
 ```
- Create an `EmailController` with the `sendEmail` method. This method should have the code discussed above for scheduling and sending emails.

Wow, that was quick. 

👉 Note: With sails.js, you can also use other cron libraries like `sails-hook-cron` as well. You can find the details [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 use to serve the same purpose, i.e., *Scheduling and Sending e-mails* from a node.js app.  After all, *Sharing is Caring....!!* 😊😊😊

I hope you enjoyed this article or found it helpful. Let's connect. You can find me on [Twitter(@tapasadhikary)](https://twitter.com/tapasadhikary), sharing thoughts, tips, and code practices. Please hit the ***Subscribe*** button at the top of the page to get an email notification on my latest posts.
