DEV Community

Cover image for Send mails using NodeJS
Abayomi Ogunnusi
Abayomi Ogunnusi

Posted on • Edited on

Send mails using NodeJS

Hey, fams! today we are going to learn how to send e-mails, right from our IDE using NodeJS. The module of interest is called Nodemailer.

puppy

Prerequisites

πŸ”— NodeJs
πŸ”— Nodemailer
πŸ”— Email account


🎯 Steps
Open editor (VSCode 😁), initialize your project with the command below

npm init -y 
Enter fullscreen mode Exit fullscreen mode

This command initiates a package.json, package.json.lock, and index.js (main entry file). The index.js will house all our logic.

Dependencies

πŸ“ŒInstall Nodemailer

npm i nodemailer
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Import the package inside index.js

const nodemailer = require('nodemailer');
Enter fullscreen mode Exit fullscreen mode

πŸ‘¨πŸ½β€πŸ« For security reasons, make sure you install and use dot.env package to prevent your password from being exposed or pushed to GitHub.
Install dotenv

npm i dotenv -S
Enter fullscreen mode Exit fullscreen mode

ignor

Require dotenv in your index.js file. I didn't require it in this project because I am using dummy data.

require('dotenv').config();
Enter fullscreen mode Exit fullscreen mode

Then, create a .env file your email and password

Email= ***********@gmail.com
Password= ******
Enter fullscreen mode Exit fullscreen mode

env


Logic

🎯 Your auth logic in index.js with dotenv

// Gmail account info
const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: process.env.EMAIL,
        pass: process.env.PASSWORD
    }
});
Enter fullscreen mode Exit fullscreen mode

🎯 Your auth logic in index.js without dotenv. Write the logic below and of course change the email to your own and the password to yours too.

// Gmail account info
const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'dsimple@gmail.com',
        pass: 'ilovemymama'
    }
});
Enter fullscreen mode Exit fullscreen mode

🎯 Next use the mailOption to send your message.

// Email info
const mailOptions = {
    from: 'dsimple@gmail.com',
    to: 'fams@gmail.com',
    subject: 'How to send emails using NodeJS',
    text: 'Follow the instructions and you will be fine'
};
Enter fullscreen mode Exit fullscreen mode

🎯 Lastly, write:

// Send email πŸ“§  and retrieve server response
transporter.sendMail(mailOptions, function(error, info) {
    if (error) {
        console.log(error);
    } else {
        console.log('Email sent: ' + info.response);
    }
});
Enter fullscreen mode Exit fullscreen mode

When done properly, you should have the following logic in your index.js. That is if you choose not to use the dotenv
carbon (28)

To run: type πŸ‘‡πŸΌ in your terminal

node index
Enter fullscreen mode Exit fullscreen mode

Note: On your Gmail, do not forget to accept and allow the "Less secure apps" access to use your scripts with your Gmail SMTP connection. Gmail will alert you with an error if this option is off, you need to turn it on.
alert

Disable Less App Here

Multiple emails, CC and BCC

const mailOptions = {
    from: 'dsimple@gmail.com',
    to: 'fams@gmail.com,myrealfams@gmail.com',
    cc: 'lexus@gmail.com',
    bcc: 'sugar@gmail.com',
    subject: 'How to send emails using NodeJS',
    text: 'Follow the instructions and you will be fine'
};
Enter fullscreen mode Exit fullscreen mode

Send attachment

const mailOptions = {
    from: 'dsimple@gmail.com',
    to: 'fams@gmail.com,myrealfams@gmail.com',
    cc: 'lexus@gmail.com',
    bcc: 'sugar@gmail.com',
    subject: 'How to send emails using NodeJS',
    text: 'Follow the instructions and you will be fine',
    attachments: [{
    filename: "robocop.jpg", path: "./img/robocop.jpg"}]
};
Enter fullscreen mode Exit fullscreen mode

Thanks πŸ™ŒπŸ½ for reading
Read my Web Socket

GitHub logo drsimplegraffiti / drsimplegraffiti

Config files for my GitHub profile.

Calm Developer

Hi πŸ‘‹, I'm Abayomi.

A Software Engineer interested in Backend

Software Engineer

A

drsimplegraffiti

drsimplegraffiti

drsimplegraffi1

Languages and Tools:

aws bash docker express javascript linux mongodb mysql nginx nodejs postgresql rabbitMQ redis typescript

drsimplegraffiti

Β drsimplegraffiti

drsimplegraffiti

Dev.to Post

πŸ”— Improve your Github Profile

πŸ”— Download Browser Page as PDF

πŸ”— Send mails using NodeJS

πŸ”— Chat App using Socket.io

πŸ”— Expose a local web server to the internet

πŸ”— Web scraping using Node Js

πŸ”— Bash Terminal Guide

πŸ”— Best Practices: Node JS Security

πŸ”— Postman Hacks

πŸ”— Time Zone: Nodejs

πŸ”— Conditional Rendering : REACT





Discuss

What other email πŸ“¬ services can you use apart from Gmail without toggling off the Less Secure App setting?

Reference

Download NodeJs
npm Reference
Nodemailer site

Top comments (20)

Collapse
 
suchitra_13 profile image
Suchitra

Thank you so much.
But I am facing difficulty in attachment sending part, I have tried 3 times but couldn't send only text sent!

Collapse
 
jlong4223 profile image
Jared Long

@Suchitra try adding an 's' to attachment: attachments: [{

I ran into the same thing with just text showing up and checked the nodemailer documentation on attachements. That little mispelling fix should do the trick.

Also, if you want to learn how to do this with a React frontend and Google OAuth2, check out my nodemailer article as well :)

Collapse
 
suchitra_13 profile image
Suchitra

Thank you so much
It's working fine now:)

Collapse
 
drsimplegraffiti profile image
Abayomi Ogunnusi

@Suchitra

Do you have a folder where your image is stored?

Example:

attachment: [{
filename: "robocop.jpg", path: "./img/robocop.jpg"}]
};

Collapse
 
suchitra_13 profile image
Suchitra

I kept image file in same folder where my index.js is present.
So in this case I just wrote:

attachment: [{
filename: "robocop.jpg", path: "robocop.jpg"}]
};

But it is not working:(

Thread Thread
 
horomancer profile image
horomancer

shouldn't it be

path: "./robocop.jpg"
Enter fullscreen mode Exit fullscreen mode
Collapse
 
drsimplegraffiti profile image
Abayomi Ogunnusi

@xchavez94x i have not used sendgrid before but I will look into it too...thanks for your contribution

Collapse
 
njokudanielo profile image
NJOKU DANIEL • Edited

Good content...Thanks

Collapse
 
drsimplegraffiti profile image
Abayomi Ogunnusi
Collapse
 
brandonwallace profile image
brandon_wallace

Nice article! Thanks for posting it.

Collapse
 
drsimplegraffiti profile image
Abayomi Ogunnusi

@Reaper thanks for the contribution

Collapse
 
barelyhuman profile image
Reaper

Or you could use mailer.reaper.im to avoid setting this up in your code and instead let it do all the lifting.

Collapse
 
leandrodiascarvalho profile image
leandro dias de carvalho

Parabens pelo conteΓΊdo.

Collapse
 
drsimplegraffiti profile image
Abayomi Ogunnusi

obrigado muito apreciado

Collapse
 
mvoloskov profile image
Miloslav πŸ³οΈβ€πŸŒˆ πŸ¦‹ Voloskov

Kudos for teaching dotenv at the very beginning! I often see people pushing sensitive data into a public repo just because they treated environment security as an afterthought.

Collapse
 
drsimplegraffiti profile image
Abayomi Ogunnusi

@njokdan You are welcome 😊