470,590 Members | 2,195 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Share your developer knowledge by writing an article on Bytes.

How to Send an Email with Nodemailer

Nodemailer creators say that it makes sending an email a piece of cake. Letís see if they are talking about cooking or eating 🙂 The idea of this article is to explain how to use Nodemailer for email sending. We will focus mainly on SMTP and HTML aspects but will also do an overview of all Nodemailer capabilities. Besides, this tutorial will help you prepare and test email messages to send out with your Node.js application.

How to use Nodemailer


The only thing required to start using Nodemailer is Node.js version 6.0 or above. You should also install Nodemailer itself but itís really easy with the npm or Yarn package manager. Execute the following command in the Node.js command prompt:

Expand|Select|Wrap|Line Numbers
  1. npm install nodemailer
Expand|Select|Wrap|Line Numbers
  1. yarn add nodemailer
Once completed, include it into your application like this:

Expand|Select|Wrap|Line Numbers
  1. var nodemailer = require('nodemailer');
or this if you are using ES modules:

Expand|Select|Wrap|Line Numbers
  1. import nodemailer from Ďnodemailerí;
Sending messages

To send a message with Nodemailer, there are three main steps.

Step 1. Create Nodemailer transporter

SMTP is the most common transporter, and below we will describe it in more detail, as well as demonstrate some examples. But there is a list of other available options:

- Built-in transports
- sendmail, a regular sendmail command for simple messages. Itís similar to the mail() function in PHP
- SES , to handle large traffic of emails by sending them using Amazon SES
- stream, a buffer for testing purposes, to return messages.

External transport. To put it simply, you can create your own transportation method.

For more details, refer to the Nodemailer documentation.

With SMTP, everything is pretty straightforward. Set host, port, authentication details and method, and thatís it. Itís also useful to verify that SMTP connection is correct at this stage: add verify(callback) call to test connection and authentication.

Expand|Select|Wrap|Line Numbers
  1. transporter.verify(function(error, success) {
  2.    if (error) {
  3.         console.log(error);
  4.    } else {
  5.         console.log('Server is ready to take our messages');
  6.    }
  7. });
How to test emails in Nodemailer?

To test emails sent with Nodemailer, we will use Mailtrap, an online tool for complex email testing in a pre-production environment. It will catch our messages, display how they look in a real email client, and help analyze and debug them. Mailtrap also provides Bcc testing options and allows you to share your email testing results with other team members, as well as forward emails to the real verified addresses.

Even If you donít have an account yet, the whole set up process takes just a couple of minutes. Mailtrap integrates as a regular SMTP server. Quickly sign up (itís free), go to the SMTP settings tab in your Inbox, copy the necessary settings, and insert them to your application script.

Mailtrap offers a ready-to-use integration with Nodemailer: select it from the Integrations section and insert it into your application code. It already contains transporter and syntaxis attributes:

Expand|Select|Wrap|Line Numbers
  1. var transport = nodemailer.createTransport({
  2.   host: "smtp.mailtrap.io",
  3.   port: 2525,
  4.   auth: {
  5.     user: "1a2b3c4d5e6f7g", //generated by Mailtrap
  6.     pass: "1a2b3c4d5e6f7g" //generated by Mailtrap
  7.   }
  8. });

Otherwise, you can use auto-generated email test accounts on Ethereal, which is also a fake SMTP service, mostly aimed at Nodemailer users.

Recently, Nodemailer has introduced NodemailerApp. It provides Sendmail replacement, but first of all, is designed to debug emails. NodemailerApp has SMTP and POP3 local servers, a catchall email domain service, along with email preview capabilities.

Step 2. Set Nodemailer message options

At this point, we should specify the sender, message recipients, and the content of our message.

Remember, Unicode is supported, so you can include emojis as well!

To send a text formatted as HTML, no extra attributes are required, just put your HTML body into the message with an html attribute. For advanced templates, you can add attachments and embed images. Letís take a look at this example of simple message options first:

Expand|Select|Wrap|Line Numbers
  1. var mailOptions = {
  2.     from: '"Example Team" <from@example.com>',
  3.     to: 'user1@example.com, user2@example.com',
  4.     subject: 'Nice Nodemailer test',
  5.     text: 'Hey there, itís our first message sent with Nodemailer ;) ',
  6.     html: '<b>Hey there! </b><br> This is our first message sent with Nodemailer'
  7. };
Attachments in Nodemailer

You can add different types of data to your message in Nodemailer using the following main properties:

- filename: the name of the attached file. Here you can use Unicode as well.
- content: the body of your attachment. It can be a string, a buffer, or a stream.
- path: path to the file, to stream it instead of including it in the message. It is a good option for big attachments.
- href: attachment URL. Data URIs are also supported.

Expand|Select|Wrap|Line Numbers
  1. list: {
  2.             // List-Help: <mailto:admin@example.com?subject=help>
  3.             help: 'admin@example.com?subject=help',
  5.             // List-Unsubscribe: <http://example.com> (Comment)
  6.             unsubscribe: [
  7.                 {
  8.                     url: 'http://example.com/unsubscribe',
  9.                     comment: 'A short note about this url'
  10.                 },
  11.                 'unsubscribe@example.com'
  12.             ],
  14.             // List-ID: "comment" <example.com>
  15.             id: {
  16.                 url: 'mylist.example.com',
  17.                 comment: 'my new list'
  18.             }
  19.         }
  20.     };
Optional properties let you add specific content types or inline images.

contentType: if you donít set it, it will be inferred from the filename property

Expand|Select|Wrap|Line Numbers
  1.  // An array of attachments
  2.         attachments: [
  3.             // String attachment
  4.             {
  5.                 filename: 'notes.txt',
  6.                 content: 'new important notes',
  7.                 contentType: 'text/plain' // optional, would be detected from the filename
  8.             },
CID: inline images in the HTML message. For more details on attaching images to HTML emails, read this post. Note that the CID value should be unique.

Expand|Select|Wrap|Line Numbers
  1. cid: 'note@example.com' // should be as unique as possible
  2.             },
  4.             // File Stream attachment
  5.             {
  6.                 filename: 'matrix neo.gif',
  7.                 path: __dirname + '/assets/neo.gif',
  8.                 cid: 'neo@example.com' // should be as unique as possible
  9.             }
  10.         ],
Encoding: can be added to the string type of content. It will encode the content to a buffer type according to the encoding value you set (base64, binary, etc.)

Expand|Select|Wrap|Line Numbers
  1. // Binary Buffer attachment
  2.             {
  3.                 filename: 'image.png',
  4.                 content: Buffer.from(
  6.                         '//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U' +
  7.                         'g9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC',
  8.                     'base64'
  9.                 )
Step 3. Deliver a message with sendMail()

Once we created a transporter and configured a message, we can send it using the _sendMail()_ method:

Expand|Select|Wrap|Line Numbers
  1. transport.sendMail(mailOptions, (error, info) => {
  2.         if (error) {
  3.             return console.log(error);
  4.         }
  5.         console.log('Message sent: %s', info.messageId);
  6. });
Nodemailer capabilities

We have covered the info on how to create and send an email in Nodemailer via SMTP, experimenting with different types of content: HTML, tables, lists, attachments, and embedded images.What is good about Nodemailer is that it offers a bunch of various options and settings, so you can customize every piece of your email.
Apr 11 '22 #1
2 6490
1 2Bits
Expand|Select|Wrap|Line Numbers
  1. const nodemailer = require('nodemailer');
  4. let mailTransporter = nodemailer.createTransport({
  5.     service: 'gmail',
  6.     auth: {
  7.         user: 'xyz@gmail.com',
  8.         pass: '*************'
  9.     }
  10. });
  12. let mailDetails = {
  13.     from: 'xyz@gmail.com',
  14.     to: 'abc@gmail.com',
  15.     subject: 'Test mail',
  16.     text: 'Node.js testing mail for GeeksforGeeks'
  17. };
  19. mailTransporter.sendMail(mailDetails, function(err, data) {
  20.     if(err) {
  21.         console.log('Error Occurs');
  22.     } else {
  23.         console.log('Email sent successfully');
  24.     }
  25. });
Apr 12 '22 #2
1 Bit
options Ė It is an object that is used to connect with any host.
defaults Ė It is an object combining into each message object. ...
port Ė if secure is false, it uses 587, by default, and 465 if true. ...
from Ė Sender's email address. ...
subject Ė Email's subject.
Apr 13 '22 #3

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

3 posts views Thread by Salim AfĢar | last post: by
9 posts views Thread by Bob Jones | last post: by
2 posts views Thread by Ron | last post: by
2 posts views Thread by ucasesoftware | last post: by
3 posts views Thread by =?Utf-8?B?SHVnaA==?= | last post: by
16 posts views Thread by =?Utf-8?B?Q2hlZg==?= | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.