Невозможно отправить электронную почту, используя SES / Lambda, но код работает на контейнере - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть лямбда-функция, которая берет кучу информации и делает кое-что для отправки электронной почты, используя SES. В настоящее время у меня есть код, который отправляет электронную почту, работающую в контейнере, но я решил, что хочу использовать пошаговые функции AWS, поэтому конвертирую ее в функции Lambda. Теоретически не должно быть существенных различий, но я не могу получать электронные письма для отправки.

Требуется функция отправки электронного письма:

const sendEmail = require('./utils/sendEmail');

Первая строка лямбда-функции / объявление функции:

module.exports.sendFirstAlert = async (event, context, callback) => {

Вызов функции sendEmail:

await sendEmail(""Josh's Email" ${fromEmail}", toEmail, 'Alert!', message); Обратите внимание на то, что `был заменен на" только для форматирования SO, но он отлично работает в коде

utils/sendEmail:

const nodemailer = require('nodemailer');
const ses = require('nodemailer-ses-transport');
const aws = require('aws-sdk');

const accessKeyId = process.env.accessKeyId;
const secretAccessKey = process.env.secretAccessKey;

const transport = nodemailer.createTransport(
    ses({
        accessKeyId: accessKeyId,
        secretAccessKey: secretAccessKey
    })
);

module.exports = function sendEmail(from, to, subject, message) {
    const mailOptions = {
        from,
        to,
        subject,
        html: message
    };
    transport.sendMail(mailOptions, (error, info) => {
        console.log('1');
        if (error) {
            console.log(error);
        }
        if (info) {
            console.log(info);
        }
        console.log('2');
    });
    console.log('3');
};

Итак, внутри функции отправки электронной почты у меня есть эти 3 оператора console.log. Только третий получает вызов. Первый / второй не вызывается. Этот точный код (за исключением console.log) отлично работает в контейнере.

Я использую безсерверный фреймворк для создания моих шагов / лямбда-функций. Я установил для этого права доступа AWS SES (для тестирования / решения этой проблемы, а не для продукта).

Переменные ENV, которые я пытаюсь вызвать, работают отлично. Функция получает все необходимые части (от темы, сообщения) правильно и в правильных форматах.

Я также использую те же ключи API, что и в контейнере, поэтому можно отправлять электронные письма, учитывая, что электронная почта, на которую я отправляю, такая же в лямбда-функции, как и в контейнере.

Есть идеи, что может быть не так?

1 Ответ

2 голосов
/ 20 апреля 2019

Из того, что вы сказали, проблема выглядит так, как будто ваша функция sendMail не ожидает (то есть не возвращает обещание или ожидает transport.sendMail).

Вот почему два консольных журнала в обратном вызове не происходят, потому что лямбда-функция завершает выполнение до вызова обратного вызова.

Вы должны проверить документацию по nodemailer здесь (https://nodemailer.com/about/#example) для получения дополнительной информации, но похоже, что следующий код должен работать нормально:

module.exports = async function sendEmail(from, to, subject, message) {
  const mailOptions = { from, to, subject, html: message };
  try { 
    const info = await transport.sendMail(mailOptions);
    console.log(info);
    return true;
  } catch (error) {
    console.log(error);
    return false;
  }
};

n.b. Я предполагаю, что причина, по которой он работает локально, заключается в том, что ваш контейнер отличается от удаленной лямбда-среды. В удаленной лямбда-среде, когда ваш обработчик возвращает все выполнение кода, останавливается, и ваш обратный вызов не успевает произойти. Но ваш локальный контейнер продолжает работать в фоновом режиме, что означает, что ваши обратные вызовы запускаются, даже если ваш обработчик завершил работу.

...