如何使用 Lambda 和 Amazon SES 发送电子邮件?
我想使用 AWS Lambda 和 Amazon Simple Email Service (Amazon SES) 发送电子邮件。
简短描述
要使用 Lambda 和 Amazon SES 发送电子邮件,请完成以下步骤:
- 为 Lambda 创建 AWS Identity and Access Management (IAM) 策略和角色以运行 API 调用。
- 验证您的 Amazon SES 身份(域或电子邮件地址)。
- 创建或更新 Lambda 函数,使其包含通过 Amazon SES 发送电子邮件的逻辑。
**注意:**要在电子邮件中包含 PDF 附件,您必须使用 Amazon SES SendRawEmail API。
解决方法
创建 IAM 策略,并将其附加到 Lambda 的角色以运行 API 调用
完成以下步骤:
-
打开 IAM 控制台。
-
使用 JSON 策略编辑器创建 IAM 策略。创建策略时,请将以下 JSON 策略文档粘贴到策略编辑器中:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:SendRawEmail" ], "Resource": "*" } ] }**注意:**有关如何限制访问此策略的详细信息和示例,请参阅 Example IAM policies for SES。
-
将 IAM 策略附加到 IAM 角色。
验证您的 Amazon SES 身份
要验证域,请参阅 Verifying a DKIM domain identity with your DNS provider。
要验证电子邮件地址,请参阅 Verifying an email address identity。
创建或更新 Lambda 函数,使其包含发送电子邮件的逻辑
在以下 Node.js、Python 和 Ruby Lambda 函数代码示例中,必要时请为您的环境替换这些变量:
- 将 us-west-2 替换为您经过验证的 Amazon SES 身份所在的 AWS 区域。
- 将 "RecipientEmailAddress", ... 替换为您要向其发送电子邮件的一个或多个电子邮件地址。
- 将 SourceEmailAddress 替换为您经过验证的 Amazon SES 发件人电子邮件地址,或来自 Amazon SES 已验证域的任何电子邮件地址。(可选)编辑邮件正文(“测试”)和主题行(“测试电子邮件”)。
**注意:**您还可以在首选的受支持运行时中设计自己的 Lambda 函数代码。
完成以下步骤:
-
打开 Lambda 控制台,然后选择 Functions(函数)。
-
如果您尚未执行以上操作,请创建 Lambda 函数。
**注意:**您可以使用 Lambda 控制台,也可以构建并上传部署包。 -
选择您的函数的名称,然后选择 Configuration(配置)选项卡。
-
在 Permissions(权限)窗格中,查看该函数的 Execution Role(执行角色)。
-
确认其中列出了您之前创建的具有 Amazon SES 权限的 IAM 角色。如果未列出正确的 IAM 角色,请为该函数分配正确的角色。
-
选择 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 -
选择 Deploy(部署)。
(可选)发送测试电子邮件
完成以下步骤:
- 打开 Lambda 控制台,然后选择您的函数。
- 为您的函数配置测试事件。
**注意:**测试有效载荷是必需的,但不用于此代码示例。 - 选择 Test(测试)。Lambda 使用 Amazon SES 向您的收件人发送测试电子邮件。

