Sending email with Nodemailer using a lambda
Get rid of your backend and use this lambda instead
I used this lambda with the Stripe example I shared yesterday. Whenever I processed a payment successfully, I would call this lambda to send a confirmation email to myself. Luckily for us, the implementation doesn’t change much from the example provided in the official repo. Here is the full code example
var sesAccessKey = '<email username>'
var sesSecretKey = '<email password>'
exports.handler = function(event, context, callback) {
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
var transporter = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: sesAccessKey,
pass: sesSecretKey
}
}));
var text = 'Email body goes here';
var mailOptions = {
from: '<from email address',
to: '<to email address>',
bcc: '<bcc email addres>',
subject: 'Test subject',
text: text
};
transporter.sendMail(mailOptions, function(error, info){
if(error){
const response = {
statusCode: 500,
body: JSON.stringify({
error: error.message,
}),
};
callback(null, response);
}
const response = {
statusCode: 200,
body: JSON.stringify({
message: `Email processed succesfully!`
}),
};
callback(null, response);
});
}
To start using this example you’re going to need to download the following node packages using your package manager of choice
yarn
yarn add nodemailer-smtp-transport nodemailer
npm
npm install nodemailer-smtp-transport nodemailer
Starting from the top, we create two new variables, sesAccessKey
and sesSecretKey
. sesAccessKey
will store your email username, for most email providers its usually just your full email address. The second variable sesSecretKey
stores your password. This block will set settings for our smtp server
var transporter = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: sesAccessKey,
pass: sesSecretKey
}
}));
The service option preconfigures outgoing and incoming ports/servers for popular mail services. Some of those services include, AOL, Godaddy, Hotmail, iCloud and Outlook365. For a full list of preconfigured services check out this link. If you don’t use one of the preconfigured services for email, you can replace the service option with the following
host: 'smtp.example.com',
port: 587,
secure: false, // Activate TLS/STARTTLS
Now that we have our smtp service configured we can start to get ready to send some email!
The variable text
will contain the body of the email. Depending on your usage, you can make the body static or pass in variables when you call your lambda. If you wanted to pass an object containing some variables you can do it like this
var msg = JSON.stringify({
text: "This is a test message"
)}
axios.post('/.netlify/functions/email', msg)
To access the object in your lambda add the following lines of code inside your module.exports.handler
method right at the beginning.
const requestBody = JSON.parse(event.body);
const emailBody = requestBody.text;
Any parameters sent to your lambda is sent inside the event
object and is accessible from the body
key within. I posted a full example in my tutorial for creating charges for Stripe.
The next section creates an object that stores the full email message. If you ever sent email before(I really hope so if you’re reading this 🙄) these options should be familiar. Just your typical to, from, bcc, subject and text(body of email).
The final portion is sending the actual email. Since we already set up our variables, the first line of code ends up doing the majority of the work for us.
transporter.sendMail(mailOptions, function(error, info)
This line uses the smtp config that we set up at the beginning and our mailOptions
object contains our to, from, bcc, subject and body for the email. Once this function executes it takes the result and calls another basic function. If the call failed it will return a response
object with a status code of 500(internal server error aka - server encountered an unexpected condition that prevented it from fulfilling the request) and a body
object with the contents of the error message. If everything worked as intended, this is something we will hopefully not see. If the email sent successfully you will instead get a status code of 200(okay) and body
message of “Email processed succesfully!”