Отправка писем из списка писем с помощью Promise, Nodemailer / Nodemailer-обещания с Expressjs - PullRequest
0 голосов
/ 13 мая 2019

Итак, мне нужно создать конечную точку в REST, которая будет отправлять список электронной почты, тему электронной почты и тело письма (в HTML).

Затем мне нужно отправлять электронные письма всем указанным.

Код, который я написал, работает нормально.Но мне нужно получать Успех или Ошибка для каждого отправленного письма.

Так как я знаю, что Node является асинхронным, мы должны использовать обещание.

Таким образом, я использовал для этого nodemailer-обещание.даже это работает нормально, но я все еще не могу получить информацию для каждого отправленного письма .

const express = require('express');
const promise_database = require('../common/promise-database');
const utils = require('../common/utils');

var router = express.Router();

router.post(`/send-emails`, (request, response) => {
    const subject = request.body.subject;
    const email_body = request.body.email_body;
    const email_ids = request.body.email_ids;
    (send_emails(email_ids, subject, email_body, response));
});

function send_emails(email_ids, subject, email_body, response) {
    send_messages(email_ids, subject, email_body, 0, response);
}

function send_messages(email_ids, subject, email_body, count, response)  {
    success_list = [];
    failuer_list = [];
    response = response;
    console.log(response);
    const transporter = utils.createPromiseMailer();
        var mailOptions = {
            from: 'Royal Fitness Club',
            to: email_ids[count],
            subject: subject,
            html: email_body
        };
        // send mail with defined transport object
        transporter(mailOptions).then(info => {
            success_list.push(info);
            send_messages(email_ids, subject, email_body, count + 1, response);
        }).catch( error => {
            failuer_list.push(error);
        }).then(() => {
            response.send({"success_list": success_list, "failuer_list": failuer_list});
        });
}

module.exports = router;

success_list и failuer_list всегда возвращается пусто .

Кроме того, я не знаю, верна ли моя реализация рекурсивной функции, у меня, честно говоря, мало опыта в NodeJS.Так что, если я реализовал это неправильно, пожалуйста, наведите меня.

1 Ответ

0 голосов
/ 13 мая 2019

Итак, я нашел способ добиться того, что я пытался с помощью Promise.

Следующий код отвечает за вывод, который я хотел.

const express = require('express');
const promise_database = require('../common/promise-database');
const utils = require('../common/utils');

var router = express.Router();

router.post(`/send-emails`, (request, response) => {
    const subject = request.body.subject;
    const email_body = request.body.email_body;
    const email_ids = request.body.email_ids;
    success_list = [];
    failure_list = [];
    send_messages(email_ids, subject, email_body, 0, success_list, failure_list)
    .then(info => {
        response.send({"success_list": success_list,"failure_list": failure_list});
    }).catch( error => {
        response.send({"success_list": success_list,"failure_list": failure_list});
    });
});

function send_messages(email_ids, subejct, email_body, count, success_list, failure_list) {
    success_list = success_list;
    failure_list = failure_list;
    const transporter = utils.createPromiseMailer();
    var mailOptions = {
        from: 'Royal Fitness Club',
        to: email_ids[count],
        subject: subejct,
        html: email_body
    };
    // send mail with defined transport object
    return new Promise((resolve, reject) => {
        transporter(mailOptions).then(info => {
            if (count < Object.keys(email_ids).length - 1) {
                resolve(send_messages(email_ids, subejct, email_body, count + 1, success_list, failure_list));
                success_list.push(info);
            } else {
                success_list.push(info);
                resolve();
            }
        }).catch(error => {
            failure_list.push(error);
            reject(failure_list);
        }); 
    });
}

module.exports = router;

Приведенный выше код даетвывод как

{
    "success_list": [
        {
            "accepted": [
                "XXXXXXXXXXX@gmail.com"
            ],
            "rejected": [],
            "envelopeTime": 936,
            "messageTime": 983,
            "messageSize": 256,
            "response": "250 2.0.0 OK  1557735125 79sm9995956pfz.144 - gsmtp",
            "envelope": {
                "from": "",
                "to": [
                    "XXXXXXXXXXX@gmail.com"
                ]
            },
            "messageId": "<XXXXXXXXXXX>"
        },
        {
            "accepted": [
                "XXXXXXXXXXX@gmail.com"
            ],
            "rejected": [],
            "envelopeTime": 849,
            "messageTime": 894,
            "messageSize": 255,
            "response": "250 2.0.0 OK  1557735128 a80sm34147685pfj.105 - gsmtp",
            "envelope": {
                "from": "",
                "to": [
                    "XXXXXXXXXXX@gmail.com"
                ]
            },
            "messageId": "<XXXXXXXXXXX>"
        }
    ],
    "failure_list": []
}

Это решение, которое я хотел.Возможно, мне все еще нужно уточнить ответ, но это именно то, что мне нужно.

...