有时我的电子邮件已发送,但有时却没有?
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:SendEmail
和 AWSLambdaBasicExecutionRole
。
我正在使用 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:SendEmail
和 AWSLambdaBasicExecutionRole
。