跳至内容

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

3 分钟阅读
0

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

简短描述

要使用 Lambda 和 Amazon SES 发送电子邮件,请完成以下步骤:

  1. 为 Lambda 创建 AWS Identity and Access Management (IAM) 策略和角色以运行 API 调用。
  2. 验证您的 Amazon SES 身份(域或电子邮件地址)。
  3. 创建或更新 Lambda 函数,使其包含通过 Amazon SES 发送电子邮件的逻辑。

**注意:**要在电子邮件中包含 PDF 附件,您必须使用 Amazon SES SendRawEmail API。

解决方法

创建 IAM 策略,并将其附加到 Lambda 的角色以运行 API 调用

完成以下步骤:

  1. 打开 IAM 控制台

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

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

    **注意:**有关如何限制访问此策略的详细信息和示例,请参阅 Example IAM policies for SES

  3. 将 IAM 策略附加到 IAM 角色。

验证您的 Amazon SES 身份

要验证域,请参阅 Verifying a DKIM domain identity with your DNS provider

要验证电子邮件地址,请参阅 Verifying an email address identity

创建或更新 Lambda 函数,使其包含发送电子邮件的逻辑

在以下 Node.jsPythonRuby Lambda 函数代码示例中,必要时请为您的环境替换这些变量:

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

**注意:**您还可以在首选的受支持运行时中设计自己的 Lambda 函数代码。

完成以下步骤:

  1. 打开 Lambda 控制台,然后选择 Functions(函数)。

  2. 如果您尚未执行以上操作,请创建 Lambda 函数
    **注意:**您可以使用 Lambda 控制台,也可以构建并上传部署包

  3. 选择您的函数的名称,然后选择 Configuration(配置)选项卡。

  4. Permissions(权限)窗格中,查看该函数的 Execution Role(执行角色)。

  5. 确认其中列出了您之前创建的具有 Amazon SES 权限的 IAM 角色。如果未列出正确的 IAM 角色,请为该函数分配正确的角色。

  6. 选择 Code(代码)选项卡。在内置代码编辑器中,粘贴以下函数代码示例之一。
    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
  7. 选择 Deploy(部署)。

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

完成以下步骤:

  1. 打开 Lambda 控制台,然后选择您的函数。
  2. 为您的函数配置测试事件
    **注意:**测试有效载荷是必需的,但不用于此代码示例。
  3. 选择 Test(测试)。Lambda 使用 Amazon SES 向您的收件人发送测试电子邮件。

相关信息

Sending email using Amazon SES

Amazon SES 中的 Identity and Access Management

AWS 官方已更新 1 年前