# Sending emails with nodemailer on Vercel

> 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.

Author: [Flavio Copes](https://flaviocopes.com/about/) | Published: 2023-11-10 | Topics: [Services](https://flaviocopes.com/tags/services/) | Canonical: https://flaviocopes.com/sending-emails-with-nodemailer-on-vercel/

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:

```javascript
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()` 

```javascript
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)
}
```
