有时我的电子邮件已发送,但有时不是吗?

时间:2019-06-25 18:40:43

标签: aws-lambda amazon-ses aws-sdk-js

我正在使用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' );
};

1 个答案:

答案 0 :(得分:0)

您需要确保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' );
}

可以在此blog post的AWS博客上找到有关Node.js Lambda运行时中的诺言和异步/等待的更多信息。


旁注,您绝不应将AWS凭证(accessKeyId和secretAccessKey)存储为源代码的一部分。对于Lambda,Lambda函数从其关联的Lambda Execution Role获得其许可,在此示例中,Lambda函数应针对Lambda的特定需求而定制,例如ses:SendEmailAWSLambdaBasicExecutionRole。 / p>