473,287 Members | 2,682 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes and contribute your articles to a community of 473,287 developers and data experts.

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

Installation


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
or
Expand|Select|Wrap|Line Numbers
  1. yarn add nodemailer
  2.  
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. });
  8.  
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. };
  8.  
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',
  4.  
  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.             ],
  13.  
  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.             },
  3.  
  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(
  5.                     'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/' +
  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 7450
webapp
2 2Bits
Expand|Select|Wrap|Line Numbers
  1. const nodemailer = require('nodemailer');
  2.  
  3.  
  4. let mailTransporter = nodemailer.createTransport({
  5.     service: 'gmail',
  6.     auth: {
  7.         user: 'xyz@gmail.com',
  8.         pass: '*************'
  9.     }
  10. });
  11.  
  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. };
  18.  
  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
puananiila99
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

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

Similar topics

3
by: Salim Afþar | last post by:
Hi, I'm using CDO object to send email but it doesn't send any email and it does not give an error. My code look like this: Dim iMsg2 Dim iConf2 Dim Flds2 Const cdoSendUsingPort = 2 set...
1
by: Jay McGrath | last post by:
Help - trying to send a simple text email with with as little user intervention. I am trying to create a button in my Access application that will automatically send a simple text email. It...
9
by: Bob Jones | last post by:
We have developed a commercial ASP.net application (personal nutrition management and tracking); we want to send smtp email from within it. For our development box, we use WinXP Pro, IIS 5.5,...
2
by: Ron | last post by:
hi guys, I am trying to send email using smtpMail. I can send emails inside the organization, but out of the organization I get an error "The server rejected one or more recipient addresses. The...
3
by: Gerard | last post by:
Hello I have created a windows service to monitor a database, it starts some checks when a timer elapses. The checks send emails depending on their findings. My issue is that when I created a...
2
by: ucasesoftware | last post by:
i start a process to send email via Outlook I have succes to build the email text, objet, sender... but i want to automate the "send"... i don't want my users to click on Send email button......
3
by: =?Utf-8?B?SHVnaA==?= | last post by:
Hi There, I use follow code to send email inside VB.NET 2005. It does not work well. Error message of "Failure sending email" would occue. However, email was sent out sometimes. I am confused...
16
by: =?Utf-8?B?Q2hlZg==?= | last post by:
I can use outlook2003 to send email,but I cann't use this code below to send email. Please help me to test this code and instruct me how to solve this problem in detail. software...
0
by: Mike Massaro | last post by:
Hello everyone, I'm new to PHP and creating an advertising website for massage therapists. On the profile page I'm creating a button so anyone can click on to send the advertiser an email. I...
1
by: prita1001 | last post by:
previously i am trying to send mails in separate form like this http://i.stack.imgur.com/klLVx.png but now i want to send mail automatically in respective email address.. Admin approve/reject...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: Aftab Ahmad | last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below. Dim IE As Object Set IE =...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.