javascriptamazon-web-servicesnodemailerclaudiajs

How to use nodemailer with claudia-api-builder


I am trying to create a simple REST API I can post an email to, to then email myself. I am using nodemailer and had set it up as an express app and it all worked fine confirming my authentication etc. is fine. I wanted to host it online so I have used claudia.js to create a lambda and API gateway setup but this seems to have broken it.

The Code

const nodemailer = require('nodemailer');
const secrets = require('./secret');
const apiBuilder = require('claudia-api-builder');

api = new apiBuilder();
module.exports = api;

var mailOptions;
var logMsg = "none";

api.post('/email', async (req, res) => {
  mailOptions = {
    from: secrets.email,
    to: secrets.email,
    subject: 'Email From: ' + req.body.senderEmail + ' | ' + req.body.subject,
    text: req.body.content,
  };
  sendMail(mailOptions);
  return logMsg;
})

const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: secrets.email,
    pass: secrets.pwd
  }
});

function sendMail(mailOptions) {
  logMsg="Starting Send Function";
  transporter.sendMail(mailOptions, function (error, info) {
    if (error) {
      logMsg = error;
      return error;
    } else {
      logMsg = "Send Complete";
      return true;
    }
  });
  logMsg="Function finished";
}

When I debug via postman, by posting a raw JSON

{
    "senderEmail": "test2",
    "subject": "test",
    "content":"test"
}

I receive "Function Finished" Which I dont really see how it is possible as surely the if or else should've fired under transporter.sendMail(..., returning from the function. I also don't receive an email which is my end goal


Solution

  • I had the same problem until I started returning the transporter

    return transporter.sendMail(mailOptions)
      .then(info => {
        console.log('email sent: ', info)
        return {'status': 'OK'}
      })
      .catch(err => {
        console.log('email error: ', err)
        return {'status': 'ERROR'}
      })