根据AWS SES接收规则,执行Lambda函数,该函数使用SES发送电子邮件

时间:2020-06-21 23:12:57

标签: amazon-web-services aws-lambda amazon-ses

我无法让AWS Lambda函数执行我想要的操作。我昨天才开始使用Lambda函数。

我要实现的目标与个人网站有关。我拥有自己的域,该域连接到AWS EC2实例上托管的网站。如果有人向我域中的任何地址发送电子邮件,我希望该电子邮件最终显示在我的个人Gmail收件箱中。

我为我的域设置了DNS MX记录,该记录将电子邮件定向到AWS SES。我的域(和我的个人Gmail地址)已在SES中验证,并且我有一条收据规则,可将电子邮件写入S3存储桶。一切都按预期进行-我可以在S3存储桶中看到电子邮件。

现在,我有第二条接收规则,该规则调用Lambda函数,该函数应从S3存储桶中提取电子邮件,然后再次调用SES将电子邮件内容发送到我的个人Gmail收件箱中。这部分不起作用。

screenshot of AWS SES Receipt Rules

由于我是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日志中没有看到任何有用的信息... screenshot of AWS CloudWatch logs

我在这里发现了另外两个类似的问题,但是它们没有提供任何解决方案...
Lambda SES forwarding function AWS
AWS SES on Lambda - fails (silently) to send email

1 个答案:

答案 0 :(得分:0)

不要设置第二条收据规则,只需要第一条收据规则,这是流程-

  1. 用户将电子邮件发送到您域中的任何电子邮件地址(如您所述)
  2. 电子邮件是由SES提取并保存到S3(您的第一个收据规则)的,也就是说,它将eml个文件保存在路径/eml
  3. 哇!我们在S3中有一个新文件!那是另一件事!

Lambda函数应由S3事件(s3:ObjectCreated:Put) see here触发,该事件仅侦听存储桶中的/eml路径。因此,现在每次将eml文件保存到存储桶时,您都可以使用它进行任何操作...

免责声明

如果有人向我域中的任何地址发送电子邮件,我希望该电子邮件最终出现在我的个人Gmail收件箱中... Lambda函数应将电子邮件从S3存储桶中取出,然后再次调用SES发送通过电子邮件将内容发送到我的个人Gmail收件箱。这部分不起作用。

关于☝️-我觉得走这条路不是最好的主意,因为使用SES发送电子邮件并不便宜。您不希望别人滥用您的SMTP服务器并浪费您的钱。另外,使用SES(或任何其他SMTP服务器)发送电子邮件通常会有限制,例如每天GMAIL's limit is 2000电子邮件。