对SES的异步调用在AWS Lambda中不起作用



我创建了一个Lambda函数,它包含以下JavaScript;

var AWS = require('aws-sdk');
var ses = new AWS.SES({ region: "us-east-1"});
var RECEIVER = 'example@email.com';
var SENDER = 'example@email.com';
var response = {
"statusCode": 200,
"headers": { 
"Content-Type": "application/json","Access-Control-Allow-Origin": "*"
},
"isBase64Encoded": false,
"body": "{ "result": "Success"n}"
}
exports.handler = async function (event, context) {
console.log('Received event:', event);
sendEmail(event, function (err, data) {
context.done(err, null);
});
return response;
};
function sendEmail (event, done) {
var params = {
Destination: {
ToAddresses: [
RECEIVER
]
},
Message: {
Body: {
Text: {
Data: 'name: ' + event.name + 'nphone: ' + event.phone + 'nemail: ' + event.email + 'ndesc: ' + event.desc,
Charset: 'UTF-8'
}
},
Subject: {
Data: 'Website Referral Form: ' + event.name,
Charset: 'UTF-8'
}
},
Source: SENDER
};
ses.sendEmail(params).promise();
}

该函数由amazon(aws(RESTapi触发,该api从html联系人表单中获取数据。这起作用,该函数成功获取数据。该功能设置为使用SES服务发送电子邮件。该功能具有完全的权限和角色,电子邮件地址经过验证,我不在SES沙盒中,我增加了功能超时,cloudwatch日志表明该功能工作正常记录

为什么我仍然没有收到电子邮件?我的直觉表明这与Javascript代码有关。我将非常感谢长期以来我一直在努力解决这个问题的任何帮助。这个功能确实工作过一次,我成功地收到了电子邮件,但那是唯一一次。

在AWS Lambda函数中使用基于promise-based API方法时,这是一个常见的错误。

您需要在处理程序中等待SESsendEmail调用的结果,否则您的lambda函数将退出,并且不会发送电子邮件。

修改代码的一种方法是:

exports.handler = async function(event, context) {
console.log('Received event:', event);
const response = await sendEmail(event, function(err, data) {
context.done(err, null);
});
// Probably you should be returning an object with a status code here...I'll leave that to you to figure out!
return response;
};
async function sendEmail(event, done) {
var params = {
Destination: {
ToAddresses: [
RECEIVER
]
},
Message: {
Body: {
Text: {
Data: 'name: ' + event.name + 'nphone: ' + event.phone + 'nemail: ' + event.email + 'ndesc: ' + event.desc,
Charset: 'UTF-8'
}
},
Subject: {
Data: 'Website Referral Form: ' + event.name,
Charset: 'UTF-8'
}
},
Source: SENDER
};
const response = await ses.sendEmail(params).promise();
return response;
}

最新更新