如何使用 Lambda 和 Amazon SES 发送电子邮件?

3 分钟阅读
0

我想使用 AWS Lambda 通过 Amazon Simple Email Service (Amazon SES) 发送电子邮件。

简短描述

要通过 Amazon SES 使用 Lambda 函数发送电子邮件,请完成以下操作:

1.    为 Lambda 创建 AWS Identity and Access Management (IAM) 策略和执行角色以运行 API 调用。

2.    验证您的 Amazon SES 身份(域或电子邮件地址)。

3.    创建或更新 Lambda 函数,并在其中包含通过 Amazon SES 发送电子邮件的逻辑。

**注意:**要在电子邮件中包含 PDF 附件,您必须使用 Amazon SES SendRawEmail API 运算。有关详细信息,请参阅 GitHub 上的使用 Amazon SES API 发送原始电子邮件

解决方法

**注意:**使用本文中的 Node.jsPythonRuby Lambda 函数代码示例时,请务必根据您的用例进行修改。请根据您的用例调整示例,或者使用您喜欢的编程语言设计自己的代码。

为 Lambda 创建 IAM Policy 和执行角色以运行 API 调用

1.   使用 JSON 策略编辑器创建 IAM 策略。创建策略时,请将以下 JSON 策略文档粘贴到策略编辑器中:

{
 "Version": "2012-10-17",
 "Statement": [
 {
 "Effect": "Allow",
 "Action": [
 "ses:SendEmail",
 "ses:SendRawEmail"
 ],
 "Resource": "*"
 }
 ]
}

**注意:**有关如何限制访问此策略的更多信息和示例,请参阅 Amazon SES 的示例 IAM 策略

2.    将 IAM 策略附加到 IAM 角色。有关说明,请参阅添加 IAM 身份权限(控制台)中的**使用托管策略作为身份的权限策略(控制台)**部分。

**注意:**按照以下步骤操作将此 IAM 角色分配至您的 Lambda 函数。

验证您的 Amazon SES 身份(域或电子邮件地址)

要验证域,请参阅向您的 DNS 提供商验证 DKIM 域身份

要验证电子邮件地址,请参阅验证电子邮件地址身份

创建或更新 Lambda 函数,并在其中包含通过 Amazon SES 发送电子邮件的逻辑。

1.    如果您尚未执行以上操作,请创建 Lambda 函数

**注意:**您可以使用 Lambda 控制台或通过构建和上传部署包来创建 Lambda 函数。

2.    在 Lambda 控制台的左侧导航窗格中,选择函数

3.    选择您的函数的名称。

4.    在配置选项卡的权限窗格中,查看函数的执行角色。确认其中列出了您之前创建的具有 Amazon SES 权限的 IAM 角色。如果未列出正确的 IAM 角色,则为该函数分配正确的角色。

5.    在函数代码下的编辑器窗格中,将以下函数代码示例中的任一个粘贴到窗格中。务必使用您的运行时系统和相应版本的 Node.js、Python 或 Ruby 的相关示例。

**重要事项:**请将 us-west-2 替换为您经过验证的 Amazon SES 身份所在的 AWS 区域。请将 "RecipientEmailAddress", ... 替换为您要向其发送电子邮件的一个或多个电子邮件地址。请将 SourceEmailAddress 替换为您经过验证的 Amazon SES 发件人电子邮件地址或来自 Amazon SES 验证域的任何电子邮件地址。或者,编辑邮件正文(“测试”)和主题行(“测试电子邮件”)。

对于 Node.js 版本 18 及更高版本,请参阅以下示例代码:

// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
const ses = new SESClient({ region: "us-west-2" });

export const handler = async(event) => {
  const command = new SendEmailCommand({
    Destination: {
      ToAddresses: ["RecipientEmailAddress", ...],
    },
    Message: {
      Body: {
        Text: { Data: "Test" },
      },

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

  try {
    let response = await ses.send(command);
    // process data.
    return response;
  }
  catch (error) {
    // error handling.
  }
  finally {
    // finally.
  }
};

对于 Node.js 版本 16 及更低版本,请参阅以下示例代码:

// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

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()
};

对于 Python 版本 3.9,请参阅以下示例代码:

import json
import boto3

client = boto3.client('ses', region_name='us-west-2')

def lambda_handler(event, context):

    response = client.send_email(
    Destination={
        'ToAddresses': ['RecipientEmailAddress']
    },
    Message={
        'Body': {
            'Text': {
                'Charset': 'UTF-8',
                'Data': 'This is the message body in text format.',
            }
        },
        'Subject': {
            'Charset': 'UTF-8',
            'Data': 'Test email',
        },
    },
    Source='SourceEmailAddress'
    )

    print(response)

    return {
        'statusCode': 200,
        'body': json.dumps("Email Sent Successfully. MessageId is: " + response['MessageId'])
    }

对于 Ruby 版本 2.7,请参阅以下示例代码:

require "aws-sdk-ses"

$ses = Aws::SES::Client.new(region: "us-west-2")

def lambda_handler(event:, context:)

  resp = $ses.send_email({
  destination: {
    to_addresses: ["RecipientEmailAddress"],
  },
  message: {
    body: {
      text: {
        charset: "UTF-8",
        data: "This is the message body in text format.",
      },
    },
    subject: {
      charset: "UTF-8",
      data: "Test email",
    },
  },
  source: "SourceEmailAddress"
})
    { statusCode: 200, body: JSON.generate("Message Sent Successfully. #{resp.to_h} ") }
end

有关使用 sendEmail API 的详细信息,请参阅适用于 JavaScriptPythonRubyJava V2 的 AWS SDK 文档。

6.    选择部署

(可选)发送测试电子邮件

1.    在 Lambda 控制台中,为您的函数配置测试事件

**注意:**测试有效负载是必需的,但不用于此代码示例。

2.    选择测试。Lambda 使用 Amazon SES 向您的收件人发送测试电子邮件。

相关信息

使用 Amazon SES 发送电子邮件

Amazon SES 中的身份和访问管理

AWS 官方
AWS 官方已更新 1 年前