在 AWS Lambda 函数中通过 AWS SES 发送电子邮件

Sending email via AWS SES within AWS Lambda function

我在 AWS Lambda 上创建了一个非常基本的简单函数,用于接受表单提交。

部分功能是向特定的人发送电子邮件,非常简单。我正在尝试使用 AWS SES 来执行此操作。我已经设置了 SES 服务等,并验证了我希望发送到的帐户并且能够发送测试电子邮件。所有作品!

现在,当我尝试在 AWS Lambda 中执行相同操作并使用 aws sdk 时,它不会发送电子邮件。我没有得到错误或任何东西。

下面是我用于 AWS Lambda 函数的代码。

有没有人有使用 lambda 和通过 lambda 函数通过 ses 发送电子邮件的经验?或者甚至只使用 node.js aws sdk 也很有可能会有所帮助。

var aws = require('aws-sdk');
var ses = new aws.SES({
   accessKeyId: 'myAccessKey',
   secretAccesskey: 'mySecretKey',
   region: 'eu-west-1' 
});

exports.handler = function(event, context) {
    console.log("Incoming: ", event);
    var output = querystring.parse(event);

    var eParams = {
        Destination: {
            ToAddresses: ["toAddress@email.com"]
        },
        Message: {
            Body: {
                Text: {
                    Data: output.Key1
                }
            },
            Subject: {
                Data: "Ses Test Email"
            }
        },
        Source: "mysource@source.com"
    };

    console.log('===SENDING EMAIL===');
    var email = ses.sendEmail(eParams, function(err, data){
        if(err) console.log(err);
        else {
            console.log("===EMAIL SENT===");
            console.log(data);
        }
    });
    console.log("EMAIL CODE END");
    console.log('EMAIL: ', email);
    context.succeed(event);
};

我似乎将 context.succeed(事件) 放在了错误的代码区域。

一旦我将其移入 sendEmail 回调中,一切正常。

var aws = require('aws-sdk');
var ses = new aws.SES({
  accessKeyId: 'myAccessKey',
  secretAccesskey: 'mySecretKey',
  region: 'eu-west-1' 
});

exports.handler = function(event, context) {
  console.log("Incoming: ", event);
  var output = querystring.parse(event);

  var eParams = {
    Destination: {
        ToAddresses: ["toAddress@email.com"]
    },
    Message: {
        Body: {
            Text: {
                Data: output.Key1
            }
        },
        Subject: {
            Data: "Ses Test Email"
        }
    },
    Source: "mysource@source.com"
};

console.log('===SENDING EMAIL===');
var email = ses.sendEmail(eParams, function(err, data){
    if(err) {
       console.log(err);
       context.fail(err);
    } else {
        console.log("===EMAIL SENT===");
        console.log("EMAIL CODE END");
        console.log('EMAIL: ', email);
        console.log(data);
        context.succeed(event);
    }
});};

这是因为 Lambda 在函数退出时冻结了容器,并且冻结了任何异步进程,例如您的电子邮件。对于 Node 尤其如此。请参阅 Lambda 编程模型。 http://docs.aws.amazon.com/lambda/latest/dg/lambda-introduction.html

我的情况是:当你设置VPC时,出现问题是因为网络限制访问。

如果删除 VPC,一切正常。

对我来说这似乎是一个 AWS 错误。

我今天为它开通了AWS Support。

还没有答案。

var aws = require("aws-sdk");
var ses = new aws.SES({ region: "us-west-2" });
exports.handler = async function (event) {
  var params = {
    Destination: {
      ToAddresses: ["RecipientEmailAddress", ...],
    },
    Message: {
      Body: {
        Text: { Data: "Test" },
      },

      Subject: { Data: "Test Email" },
    },
    Source: "SourceEmailAddress",
  };

  return ses.sendEmail(params).promise()
};