【问题标题】:Sending an email from an AWS Lambda function从 AWS Lambda 函数发送电子邮件
【发布时间】:2025-12-13 02:40:01
【问题描述】:

我创建了一个基本的 lambda 函数,它应该从 SES 服务发送电子邮件,但它不起作用。

我已按照本教程进行操作:here。我已经创建了正确的 IAM 策略并将其附加到函数中,但我认为这不是问题所在。

我已经为函数创建了一个测试配置,但控制流没有到达 sendEmail 内部,我不知道为什么。

const aws = require('aws-sdk')
const ses = new aws.SES({ region: 'us-east-1' });

exports.handler = async (event, context, callback) => {
  const printOut = JSON.stringify(event);
  console.log(`Received event: ${printOut}`);

  const params = {
    Destination: {
      ToAddresses: ["xxxxx.xxxx@gmail.com"]
    },
    Message: {
      Body: {
        Text: {
          Data: event['desc']
        }
      },
      Subject: {
        Data: "Email from xxxxxxx Contact Us Form"
      }
    },
    Source: "xxxxxxxxxxxxxxxxx@gmail.com"
  };

  console.log(`sending: ${JSON.stringify(params)}`);

  ses.sendEmail(params, function (err, data) {
    callback(null, { err: err, data: data });
    if (err) {
      console.error(err);
      context.fail(err);
    } else {
      console.log(data);
      context.succeed(event);
    }

    console.log(`Done!`);
  });
};

这是我当前的输出:

Response:
null

Request ID:
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx"

Function Logs:
START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx Version: $LATEST
2019-11-12T01:28:48.352Z    xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx  INFO    Received event: {"name":"Redacted","email":"xxxxx.xxxx@gmail.com","desc":"Test message"}
2019-11-12T01:28:48.372Z    xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx  INFO    sending: {"Destination":{"ToAddresses":["xxxxx.xxxx@gmail.com"]},"Message":{"Body":{"Text":{"Data":"Test message"}},"Subject":{"Data":"Email from xxxxxx Contact Us Form"}},"Source":"xxxxxxxxxxxxxxx@gmail.com"}
END RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx
REPORT RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx    Duration: 590.10 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 94 MB  Init Duration: 359.55 ms    

如您所见,sendEmail 函数中的控制台输出/错误永远不会被调用。不太清楚为什么。

我确实确保验证了我正在测试的两个电子邮件地址,但没有骰子。

【问题讨论】:

  • 您查看过您的CloudWatch 日志以查看是否有任何错误?
  • 您的 lambda 子网有互联网连接吗?还有什么是 lambda/ 的超时时间
  • 删除 async 关键字。当你想完成函数时调用回调函数,让我们在console.log(Done!);之后调用callback(err, { data: data });并删除所有context函数调用
  • @dev_junwen 我在 OP 中提供的输出也与我在 CloudWatch 中找到的相匹配。

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


【解决方案1】:

您必须将其设为非异步或将承诺返回给调用者(您可以将该承诺直接返回给运行时)。像这样:

const aws = require('aws-sdk')
const ses = new aws.SES({region: 'us-east-1'});

exports.handler = async (event, context, callback) => {
    const printOut = JSON.stringify(event);
    console.log(`Received event: ${printOut}`);

    const params = {
        Destination: {
            ToAddresses: ["xxxxx.xxxx@gmail.com"]
        },
        Message: {
            Body: {
                Text: {
                    Data: event['desc']
                }
            },
            Subject: {
                Data: "Email from xxxxxxx Contact Us Form"
            }
        },
        Source: "xxxxxxxxxxxxxxxxx@gmail.com"
    };

    console.log(`sending: ${JSON.stringify(params)}`);

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

【讨论】: