Node.js 通过AWS Lambda功能内的AWS SES发送电子邮件

Node.js 通过AWS Lambda功能内的AWS SES发送电子邮件,node.js,amazon-web-services,aws-sdk,aws-lambda,Node.js,Amazon Web Services,Aws Sdk,Aws Lambda,我在AWS Lambda上创建了一个非常基本的简单函数,用于接受表单提交 该功能的一部分是向特定的人发送电子邮件,非常简单。我正试图使用AWS SES来实现这一点。我已经设置了SES服务等,并验证了我希望发送到的帐户,并且已经能够发送测试电子邮件。一切都好 现在,当我尝试在AWS Lambda中执行相同操作并使用AWS sdk时,它不会发送电子邮件。我没有发现任何错误 下面是我用于AWS Lambda函数的代码 有没有人有使用lambda和通过ses通过lambda函数发送电子邮件的经验?或者甚

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

该功能的一部分是向特定的人发送电子邮件,非常简单。我正试图使用AWS SES来实现这一点。我已经设置了SES服务等,并验证了我希望发送到的帐户,并且已经能够发送测试电子邮件。一切都好

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

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

有没有人有使用lambda和通过ses通过lambda函数发送电子邮件的经验?或者甚至仅仅使用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.success(事件)放在了错误的代码区域

一旦我把它移到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编程模型

我的案例是:当您设置VPC时,问题发生的原因是互联网访问受限

如果删除VPC,一切正常

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

我今天为它打开了一个AWS支持


还没有答案。

Darren>你试过上面的Java等价物吗?@Jasper遗憾的是,我没有。你也经历过同样的问题吗?调用这个函数。。。通过在我的计算机上运行的程序的rest端点。。。。。但如果我从其他域(服务器)尝试,我会看到403(可能是由于跨域CORS的原因)。@Jasper-我需要了解更多关于您尝试做什么的信息。你问过关于stackoverflow的问题吗。如果您在一个问题中包含您正在尝试做什么以及如何实现它的详细信息,我可以看一看。我尝试通过一个简单的HTML HTTP Post调用它:但是console.log incoming始终为空!虽然我可以通过Java代码成功地调用它!AccessKey不是必需的。推荐的方法是使用IAM角色来管理访问。你能从客户端做到这一点吗?还没有尝试过,但看不出为什么不能?是的,我second@swogger,在任何可能的情况下都应该使用角色,这降低了密钥暴露的风险,因为在控制台上作为纯文本javascript,比打包的lambda代码风险更大。