Иногда мое письмо отправляется, но иногда нет? - PullRequest
0 голосов
/ 25 июня 2019

Я использую лямбда-функцию для отправки электронной почты с помощью SES, но она не работает каждый раз.Этим утром я отправил 3 письма на свои почтовые ящики, но теперь я больше не могу отправлять письма.Мой SES находится в режиме песочницы, и я проверил две учетные записи электронной почты.

Я посмотрел на Cloud Watch, и он не показывает никаких ошибок.

'use strict';

let AWS = require('aws-sdk');

AWS.config.update({
    accessKeyId: 'xxxx',
    secretAccessKey: 'xxxx',
    region: 'us-east-1'
});

let SES = new AWS.SES();

function criarResposta( statusCode, message ) {
    return {
        statusCode: statusCode,
        body: `{
            "message": "${message}"
        }`
    };
}

module.exports.enviar = async (event) => {
    const dados = JSON.parse( event.body );

    let params = {
        Destination: {
            ToAddresses: [
                dados.para
            ]
        },
        Message: {
            Body: {
                Html: {
                    Charset: "UTF-8",
                    Data: dados.body
                }
            },
            Subject: {
                Charset: 'UTF-8',
                Data: dados.assunto
            }
        },
        Source: dados.from,
        ReplyToAddresses: [
            dados.from
        ]
    };

    if( dados.hasOwnProperty( 'cc' ) ) {
        params.Destination.CcAddresses.push( dados.cc );
    }

    let sendPromise = new AWS.SES({apiVersion: '2010-12-01'}).sendEmail(params).promise();

    sendPromise.then(function(data) {
        console.log(data.MessageId);
    }).catch(function(err) {
        console.error(err, err.stack);
    });

    return criarResposta( 200, 'OK' );
};

1 Ответ

0 голосов
/ 25 июня 2019

Необходимо убедиться, что обещание, возвращаемое функцией sendEmail(), разрешено (или отклонено). В настоящее время вы получаете ссылку на sendPromise, но затем вы немедленно выполняете return criarResposta( 200, 'OK' );, не ожидая разрешения обещания. Попробуйте изменить следующие строки:

sendPromise.then(function(data) {
    console.log(data.MessageId);
}).catch(function(err) {
    console.error(err, err.stack);
});

return criarResposta( 200, 'OK' );

с

try {
    const data = await sendPromise;
    console.log(data.MessageId);
    return criarResposta( 200, 'OK' );
} catch (err) {
    console.error(err, err.stack);
    return criarResposta( 500, 'Internal Server Error' );
}

Дополнительную информацию об обещаниях и асинхронности / ожидании в Node.js можно найти в этом посте в блоге в блоге AWS.


Примечание: вы никогда не должны хранить свои учетные данные AWS (accessKeyId и secretAccessKey) как часть вашего исходного кода. В случае с Lambda функция Lambda получает свое разрешение от связанной с ней Lambda Execution Role , которая должна быть адаптирована для конкретных потребностей Lambda, таких как ses:SendEmail и AWSLambdaBasicExecutionRole в этом примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...