Как проверить, что 'nodemailer' успешно отправил письмо?

При регистрации пользователя, отправляю ему извещение на электронную почту. Для этого использую модуль 'nodemailer'. Как сделать, чтобы в app.js при вызове mailer, проверялось условие: Если письмо успешно отправлено, сделать res.send('Регистрация успешно выполнена') ?
Код App.js:
const express  = require('express');
var app = express();
const mailer  = require('../app/module/sendmail');
const port     = process.env.PORT || 8000;

app.post('/signup, function (req, res) {
  mailer('user_email@mail.ru', 'passwd');
})

app.listen(port);
console.log('NodeJS слушает порт: ' + port);


Ниже код модуля Sendmail.js:
const nodemailer = require('nodemailer');
const morgan = require("morgan");

var transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: process.env.GMAIL_USER,               
    pass: process.env.GMAIL_PASS
  }
});

module.exports = function(email, passwd){
var mailOptions = {
  from: process.env.GMAIL_USER,
  to: email,
  subject: 'Благодарим за регистрацию',
  html: `<p>Вы успешно зарегистрированы!</p>
         <p>Ваш логин: <b>${email}</b><br>
         Пароль: <b>${passwd}</b></p>`
};

transporter.sendMail(mailOptions, function(error, info){
  if(error){
    console.log('Ошибка отправки на почту извещения');
  } else {
    console.log('Обработанно');
  }
});
}


Проверка должна срабатывать именно в app.js, а не в подключенном модуле Sendmail.js.
  • Вопрос задан
  • 857 просмотров
Пригласить эксперта
Ответы на вопрос 3
vitali1995
@vitali1995
Простой вариант: объявить transporter внутри обработчика express.
Правильный вариант: промиссифицировать sendMail, т.е. обернуть в функцию, которая возвращает промис, на который можно подписаться извне.

function sendMail(mailOptions) {
  return new Promise((resolve, reject) =>
    transporter.sendMail(mailOptions, (error, info) => {
      if(error){
        reject(error);
      } else {
        resolve(info);
      }
    });
  });
}


Использование промисов:
sendMail(mailOptions)
  .then(info => console.log(info))
  .catch(error => console.error(error));

или так:
try {
  const info = await sendMail(mailOptions);
  console.log(info);
} catch (error) {
  console.error(error);
}
Ответ написан
@RidgeA
ну так в `module.exports = function(email, passwd)` передаеть еще callback, который вызывать по факту отправки сообщения....
А еще лучше перейти на промисы....
Ответ написан
Комментировать
SagePtr
@SagePtr
Еда - это святое
Лучше не полагаться на подобную проверку. Письмо может благополучно уйти, но при этом всё равно быть уничтожено где-нибудь по пути. Этот факт проверить невозможно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы