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

Posted

技术标签:

【中文标题】在 AWS Lambda 函数中通过 AWS SES 发送电子邮件【英文标题】:Sending email via AWS SES within AWS Lambda function 【发布时间】:2015-12-13 00:49:33 【问题描述】:

我在 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);
;

【问题讨论】:

不需要访问密钥。推荐的方法是使用 IAM 角色来管理访问。 您可以从客户端执行此操作吗? 没试过但不明白为什么? 是的,我第二个@swogger,总是应该尽可能使用角色,这会降低密钥被暴露的风险,因为控制台上的纯文本 javascript 比打包的 lambda 代码风险更大。 【参考方案1】:
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()
;

【讨论】:

【参考方案2】:

我的情况是:当你设置VPC时,问题发生的原因是互联网限制访问。

如果您删除 VPC,一切正常。

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

我今天为它开了一个 AWS Support。

还没有答案。

【讨论】:

【参考方案3】:

看来我将 context.succeed(event) 放在了错误的代码区域。

一旦我将它移到 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);
    
);;

【讨论】:

Darren> 你尝试过 Java 等价的上述方法吗? @Jasper 不幸的是我没有。您是否遇到过同样的问题? 调用这个工作......通过我的计算机上运行的程序的其余端点......但如果我从其他域(服务器)尝试 - 我看到 403 (可能是由于交叉-域 CORS 的东西)。 @Jasper - 我需要更多地了解你想要做什么。你问过关于***的问题吗?如果您在问题中包含您正在尝试做的事情以及如何实现它的详细信息,我可以看看它。 我尝试通过一个简单的 html HTTP Post 调用它:
但是console.log传入总是空的!虽然我可以通过 Java 代码成功调用它!
【参考方案4】:

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

【讨论】:

以上是关于在 AWS Lambda 函数中通过 AWS SES 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

通过AWS lambda存储值

我可以确定哪个 AWS 服务触发了我的 Lambda 函数吗?

当我的 aws lambda 函数执行时如何选择弹性 IP

如何从我的 EC2 实例调用 AWS Lambda 函数?

如何正确创建可以使用 Eclipse 上传到 AWS lambda 的 zip 文件?

使用 API Gateway 处理 AWS Lambda 函数中的错误