我无法让AWS Lambda函数执行我想要的操作。我昨天才开始使用Lambda函数。
我要实现的目标与个人网站有关。我拥有自己的域,该域连接到AWS EC2实例上托管的网站。如果有人向我域中的任何地址发送电子邮件,我希望该电子邮件最终显示在我的个人Gmail收件箱中。
我为我的域设置了DNS MX记录,该记录将电子邮件定向到AWS SES。我的域(和我的个人Gmail地址)已在SES中验证,并且我有一条收据规则,可将电子邮件写入S3存储桶。一切都按预期进行-我可以在S3存储桶中看到电子邮件。
现在,我有第二条接收规则,该规则调用Lambda函数,该函数应从S3存储桶中提取电子邮件,然后再次调用SES将电子邮件内容发送到我的个人Gmail收件箱中。这部分不起作用。
由于我是Lambda函数的新手,并且它们在“云中”运行,因此我发现这很难调试。 我使Lambda函数尽可能简单,只是为了使某些功能正常工作。
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
var ses = new AWS.SES({region: 'eu-west-1'});
var bucketName = 'my-s3-bucket-name';
var emailBody;
exports.handler = function(event, context, callback) {
var sesNotification = event.Records[0].ses;
s3.getObject({
Bucket: bucketName,
Key: sesNotification.mail.messageId
}, function(err, data) {
if (err) {
console.log(err, err.stack);
callback(err);
} else {
emailBody = data.Body;
callback(null, null);
}
});
};
exports.handler = (event, context, callback) => {
let params = {
Destination: {
ToAddresses: ['my.personal.email@gmail.com']
},
Message: {
Body: {
Text: {
Data: emailBody
}
},
Subject: {
Data: 'Subject of Email goes here'
}
},
Source: 'ses-redirect@mydomain.com'
};
ses.sendEmail(params, function (err, data) {
callback(null, {
err: err,
data: data
});
if (err) {
console.log(err);
context.fail(err);
} else {
console.log(data);
context.succeed(event);
}
});
};
这是我基本上从几个AWS示例中汇总的代码...
Example 3: Retrieves Email from Amazon S3
How do I send email using Lambda and Amazon SES?
Lambda编辑器具有内置的测试功能,并且按照最后一个链接中的步骤操作,我能够使Lambda成功向我发送测试电子邮件。我只是不能让所有这些东西都一起工作-我的Lambda函数根据我的SES接收规则执行,访问S3存储桶,并通过电子邮件向我发送一些有用的信息。
我还怀疑它可能与权限有关,但是在我看来,我的Lambda函数的“执行角色”具有所有必需的权限。我已为任何资源上的ses:SendEmail和s3:*操作授予执行角色权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
我在AWS CloudWatch日志中没有看到任何有用的信息...
我在这里发现了另外两个类似的问题,但是它们没有提供任何解决方案...
Lambda SES forwarding function AWS
AWS SES on Lambda - fails (silently) to send email
答案 0 :(得分:0)
不要设置第二条收据规则,只需要第一条收据规则,这是流程-
eml
个文件保存在路径/eml
Lambda函数应由S3事件(s3:ObjectCreated:Put) see here触发,该事件仅侦听存储桶中的/eml
路径。因此,现在每次将eml文件保存到存储桶时,您都可以使用它进行任何操作...
如果有人向我域中的任何地址发送电子邮件,我希望该电子邮件最终出现在我的个人Gmail收件箱中... Lambda函数应将电子邮件从S3存储桶中取出,然后再次调用SES发送通过电子邮件将内容发送到我的个人Gmail收件箱。这部分不起作用。
关于☝️-我觉得走这条路不是最好的主意,因为使用SES发送电子邮件并不便宜。您不希望别人滥用您的SMTP服务器并浪费您的钱。另外,使用SES(或任何其他SMTP服务器)发送电子邮件通常会有限制,例如每天GMAIL's limit is 2000电子邮件。