我正在使用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' );
};
答案 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:SendEmail
和AWSLambdaBasicExecutionRole
。 / p>