Отправка электронной почты с помощью Lambda, NodeJs и Nodemailer не работает - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь отправить электронное письмо от Lambda с ранее аутентифицированной учетной записью SES; с помощью node.js с использованием Nodemailer. Там нет ошибки, но она не отправляет ни.

Это процесс, который я использую для:

module.exports.eviarCorreoPrueba = (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;    
  console.log('inicia envio de correos');    
    var transporter = nodemailer.createTransport({
        //pool: true,
        host: 'email-smtp.us-east-1.amazonaws.com',
        port: 465,
        secure: true,
        auth: {
            user: 'user',
            pass: 'pass'
        }   
    });
    console.log('se crea transporte ');

    var mailOptions = {
        from: 'test@email.com',
        to: 'test@email.com',
        subject: 'Prueba Lambda',          
        html: 'hello World'
    };
    console.log('se asignan las opciones de correo');
    console.log('inicia envio de correo');
    transporter.sendMail(mailOptions, function (error, info) {
        if (error) {
            callback(null, {
              statusCode: 200,
              body: JSON.stringify({
                input: 'not send'
              })
            })
        } else {
            console.log('Email sent');    
        }
    });
    console.log('funcion finalizada');    
};

А вот результаты журнала ответов:

enter image description here

1 Ответ

0 голосов
/ 22 января 2019

Ваш Lambda истекает.Смотрите последнее сообщение в ваших журналах Cloudwatch.Вы устанавливаете свое время ожидания лямбды на 6 секунд, я полагаю, что это не достаточно времени для лямбды, чтобы отправить запрос (через transporter.sendMail) и получить ответ.Попробуйте увеличить время лямбды.Может быть, до 30 секунд?

Способ, которым я устанавливаю тайм-ауты для новых лямбд, которые я проектирую, состоит в том, чтобы запускать их несколько раз, пока я не получу среднее время завершения.Затем я добавляю 20 секунд к этому времени.

Также, transporter.sendMail является асинхронной функцией.Это означает, что console.log('funcion finalizada'), вероятно, запустится до того, как ваша функция завершится (хотя ваша функция фактически не завершила).

Подробнее об асинхронном JavaScript и обратных вызовах: https://medium.com/codebuddies/getting-to-know-asynchronous-javascript-callbacks-promises-and-async-await-17e0673281ee

Также, если вы хотите написать асинхронный код синхронно, используйте async / await

...