Sending emails with nodemailer on Vercel
By Flavio Copes
Learn how to send emails with nodemailer on Vercel, where the callback version of sendMail silently fails in serverless and you must await the promise instead.
I couldn’t figure out why nodemailer didn’t work on Vercel, then (tldr) I found out I needed await and not a callback.
Here’s the code I had:
nodemailer
.createTransport({
host: 'smtpserver.com',
port: 465,
secure: true,
auth: {
user: import.meta.env.USER,
pass: import.meta.env.PASS,
},
})
.sendMail(
{
from: 'me@me.com',
to: email,
subject,
html,
},
function (err, info) {
console.log(info)
if (err) {
console.log(err)
} else {
console.log('sent email')
}
}
)
This worked locally.
But when pushed to Vercel and it ran in a serverless function environment, the email was never sent.
Also, I never got the “sent email” message in the logs.
Nor any error.
Turns out the callback-based version of sendMail() failed to work (due to the nature of serverless functions, I believe, they are terminated earlier and the email is never sent) and I needed to use the promise-based version, by omitting the second parameter (the callback function) to sendMail()
try {
await nodemailer
.createTransport({
host: 'smtpserver.com',
port: 465,
secure: true,
auth: {
user: import.meta.env.FASTMAIL_EMAIL,
pass: import.meta.env
.FASTMAIL_APP_SPECIFIC_PASSWORD,
},
})
.sendMail({
from: 'me@me.com',
to: email,
subject,
html,
})
console.log('Email sent to ' + email)
} catch (e) {
console.error(e)
}Related posts about services: