有时我的电子邮件已发送,但有时却没有?

Sometimes my email is sent but sometimes it isn't?

我正在使用 lambda 函数通过 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' );
};

您需要确保 sendEmail() 函数返回的承诺得到解决(或拒绝)。当前,您获得了对 sendPromise 的引用,但随后您立即执行了 return criarResposta( 200, 'OK' );,而无需等待 promise 解析。尝试更改以下行:

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 Lambda 运行时中的承诺和异步/等待的更多信息,请参阅 AWS 博客上的 blog post


旁注,您永远不应将 AWS 凭证(accessKeyId 和 secretAccessKey)存储为源代码的一部分。在 Lambda 的情况下,Lambda 函数从其关联的 Lambda Execution Role 获得许可,这应该根据 Lambda 的特定需求进行定制,例如本例中的 ses:SendEmailAWSLambdaBasicExecutionRole