Повторите попытку отправить почту, если не отправлено - PullRequest
1 голос
/ 07 июля 2019

Я использую nodemailer для отправки писем через приложение для узлов.Иногда электронная почта не работает и выдает ошибку, пока я не попробую дважды или трижды.Я хочу, чтобы моя программа повторяла попытки до тех пор, пока письмо не будет успешно отправлено.

Вот мой код:

const mailOptions = {
    from: from,
    to: client.email,
    subject: 'Your Photos are ready',
    html: mailTemplate
};

transporter.sendMail(mailOptions, function(error, info){
    if (error) {
        res.status(500).json({
              message: "Mail not sent",
              error
        });
    } else {
        res.status(200).json({message: "Mail Sent", response: info.response});
    }
});

Как я могу использовать ту же функцию внутри моего блока if?

Ответы [ 3 ]

3 голосов
/ 07 июля 2019

Обтекание sendMail в функции, которая возвращает Promise

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

затем в вашем маршруте сделайте обработчик async function и зациклите, сколько раз вы хотите, затем проверьте, существует ли info, если он отправляет 200, если не отправляет 500

app.post('/sendmail', async (req, res) => {
  let info;
  let error;

  for (let i = 0; i < 3; i++) {
    try {
      info = await promiseWrapper(mailOptions);
      break;
    } catch (e) {
      error = e;
    }
  }

  info 
    ? res.status(200).json({ message: "Mail Sent", response: info.response })
    : res.status(500).json({ message: "Mail not send", error }));
});
0 голосов
/ 07 июля 2019

Оберните его в функцию и вызовите так:

const mailOptions = {
    from: from,
    to: client.email,
    subject: 'Your Photos are ready',
    html: mailTemplate
};

function sendMail(mailOptions) {
    transporter.sendMail(mailOptions, function(error, info){
        if (error) {
            return sendMail(mailOptions)
        } else {
            return res.status(200).json({message: "Mail Sent", response: info.response});
        }
    });
}

return sendMail(mailOptions);
0 голосов
/ 07 июля 2019
const mailOptions = {
    from: from,
    to: client.email,
    subject: 'Your Photos are ready',
    html: mailTemplate
};

var i;
for(i = 0; i <= 1; i++) {
    transporter.sendMail(mailOptions, function(error, info){
        if (error) {
            res.status(500).json({
                  message: "Mail not sent",
                  error
            });
            i = 0;
        } else {
            i = 2;
            res.status(200).json({message: "Mail Sent", response: info.response});
        }
    });
}

Попробуйте, приведенный выше код будет запускать функцию снова и снова, если возникнет ошибка, и выйдет из цикла, если ошибки не возникнет.

...