Sending Custom emails with NodeJS from 🪄scratch and for no cost whatsoever🗡
Tags: node, javascript, tutorial, programming
Published: 2022-01-21 23:34:43

In this tutorial, I'm going to show you how you can send custom emails with just NodeJS, two sweet npm packages, and a single email address.

The best part?  No email hosting is required, you can do this for no cost at all, and all in under 50 lines of code!

Let's get started!

---

In this example, I'll be using gmail to get an email.  You may do this anywhere else, but I would prefer google due to how easy it is to get an alternate email account.

After signing up for google, go to https://myaccount.google.com/, go to the Security section and scroll to the **Signing in to Google** section.

![Signing into Google](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ztvby82mbnjccqxcujm.png)

To be able to send emails, you'll need an app password from your google account.  You can obtain this after setting up two-step verification.  If you are not using google, use the password for that email account and keep it somewhere safe since we'll need it again.

![Click on App Passwords](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hokfh1bmy9ojby2lltgi.png)

After turning on two-step verification, click on App Passwords and create a new one for Mail.  As for the device, click on **Other (custom name)** and name it anything you want.

![Setting up the password](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q7b1j3rjqjug94fnhsk9.png)
 
After that, copy the 16-digit app password, save it, and we're ready to start getting into the code.

---

First, install two packages from npm - **nodemailer** and **nodemailer-juice**

```javascript
const nodemailer = require('nodemailer');
const inLineCss = require('nodemailer-juice');
```

Why do we need nodemailer-juice?  Emails typically only accept inline styles and not any styling from CSS.  If you don't want to sweat your brain to pieces, it's a good option to use nodemailer juice - it automatically converts css within `<style></style>` tags into inline CSS for you.

Now for the emailing function.  I've already made it, so all you have to do is call it to send an email.

```javascript
function sendEmail(to, subject, message) {
  let transporter = nodemailer.createTransport({
    service: 'gmail', //change if not using gmail
    host: 'smtp.gmail.com', // also change if not using gmail
    port: 465,
    secure: true,
    auth: {
      user: "<you@email.com>",
      pass: "<your-app-password>"
    }
  });
  transporter.use('compile', inLineCss()); //makes your email nice and full of css

  let mailDetails = {
    from: "<you@email.com>",
    to: to,
    subject: subject,
    html: message,
  };

  transporter.sendMail(mailDetails, function (err, data) {
    if (err) console.error(err)
  });
}
```
 
For the sendEmail function, you _will_ have to pass in an html document for the parameter `message`.  Just to let you know, hover states, css listeners, and literally anything that won't run in inline styles **will not run**.

Unfortunately, I'm too lazy to write an entire document here for you.  I do have a template email at https://replit.com/@IroncladDev/Noseletter in case you wanted to use it.

To make things a bit easier, I would store the html document in a function (as a template string) and have some parameters in which I could pass title, body, and some other options.

```javascript
const emailTemplate = (title, body) => `<!DOCTYPE html>
<html lang="en">
  <head>
    ...
    <style>
      ...
    </style>
  </head>
  <body>
    <h1>${title}</h1>
    <p>${body}</p>
  </body>
</html>`;
``` 

To pass the email template function into the sendEmail function, simply do like so:

`sendEmail("someone@email.com", "Email Title", emailTemplate("Email Title", "This is the body of the email"));`
 
That, my friend, is all it takes to send emails in NodeJS.

---

Liked this post?
Don't forget to subscribe to my [newsletter](https://www.connerow.dev) (located on my website footer) for new posts, new projects, recaps, and more!

Join my [discord](https://discord.gg/TZCc8P2cyH) to get in touch and hang out!

Also, be sure to support this post with a couple reactions!