0

Hi I need help with this. I am trying to send an email and await the response then return it back to the user as a json response. The code I have now does not return anything I also tried add a timeout to see if an async await could solve it but it did not work.

mailer.js 

"use strict";
const nodemailer = require("nodemailer");

module.exports = async (email, password, name) => {
  let testAccount = await nodemailer.createTestAccount();

  let transporter = nodemailer.createTransport({
    host: "smtp.ethereal.email",
    port: 587,
    secure: false,
    auth: {
      user: testAccount.user,
      pass: testAccount.pass
    }
  });

  let info = await transporter.sendMail({
    from: '"Example user" <example.uesr@retrofit.io>',
    to: email,
    subject: "Testing all yh?",
    text: "Hello world",
    html: "<b>Hello world?</b>"
  });

  return nodemailer.getTestMessageUrl(info);
};

This is my user registeration code

auth.js

const express = require("express");
const router = express.Router();
const User = require("../models/User");
const neutral_mailer = require("../utils/neutral-mailler");

router.post("/create", async (req, res) => {
  const user = new User({
    first_name: "Umar",
    last_name: "Alli",
    company: "Belirs",
    email: "umar@belirs.com",
    password: "Test",
    status: "active",
    date: Date.now()
  });

  try {
    await user.save(err => {
      if (err) {
        res.json({ message: err });
      }

      const link = neutral_mailer(user.email, user.password, user.first_name);
      res.status(201).send(link);
    });
  } catch (err) {
    res.json({ message: err });
  }
});```
Node Shack
  • 59
  • 6

2 Answers2

0

transporter.sendMail does not return a Promise, but takes a callback as parameter

const sendMail = () => async (email, password, name) => {
    let testAccount = await nodemailer.createTestAccount();

    let transporter = nodemailer.createTransport({
        host: "smtp.ethereal.email",
        port: 587,
        secure: false,
        auth: {
            user: testAccount.user,
            pass: testAccount.pass
        }
    });

    const message = {
        from: '"Example user" <example.uesr@retrofit.io>',
        to: email,
        subject: "Testing all yh?",
        text: "Hello world",
        html: "<b>Hello world?</b>"
    };

    return await sendMailInternal();
};

const sendMailInternal = (message) => new Promise(resolve => {
    transporter.sendMail(message, (err, info) => {
        if (err) {
            //handle error
        }

        resolve(nodemailer.getTestMessageUrl(info));
    });
});

module.exports = sendMail;
Horatiu Jeflea
  • 7,256
  • 6
  • 38
  • 67
0

Try this One.

transport.sendMail(options).then(function(info){
    console.log(info);
}).catch(function(err){
    console.log(err);
});

OR You can follow this link. https://github.com/nodemailer/nodemailer/issues/294

OR this one. Nodemailer email confirmation using Async/Await

Ankit Kumar Rajpoot
  • 5,188
  • 2
  • 38
  • 32