

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon SES 电子邮件接收控制台演练
<a name="receiving-email-walkthroughs"></a>

本节介绍了电子邮件接收控制台向导，可用于配置*接收规则*和 *IP 地址筛选条件*以管理电子邮件接收。在使用控制台向导之前，请务必先阅读 [电子邮件接收概念和使用案例](receiving-email-concepts.md)（以了解电子邮件接收工作原理）和 [设置电子邮件接收](receiving-email-setting-up.md)（以确保已完成设置先决条件）。

**Topics**
+ [创建接收规则控制台演练](receiving-email-receipt-rules-console-walkthrough.md)
+ [创建 IP 地址筛选条件控制台演练](receiving-email-ip-filtering-console-walkthrough.md)

# 创建接收规则控制台演练
<a name="receiving-email-receipt-rules-console-walkthrough"></a>

本节将指导您使用 Amazon SES 控制台创建和定义接收规则。理解接收规则工作原理的关键点在于：
+ *规则集*包含一组有序的接收规则；*接收规则*包含一组有序的操作。
+ 接收规则告诉 Amazon SES 如何通过执行指定的有序操作列表来处理传入邮件。
+ 此有序的操作列表可以根据第一个匹配的收件人条件进行选择；如果未指定，则这些操作将应用于属于已验证域的所有身份。
+ 接收规则在名为规则集的容器中创建和定义，虽然您可以创建多个规则集，但一次只能有一个规则集处于激活状态。
+ 激活的规则集中的接收规则将按指定的顺序执行。
+ 在创建接收规则之前，必须首先创建包含这些规则的*规则集*。

或者，您可以使用 `CreateReceiptRuleSet` API 创建一个空接收规则集，如 [Amazon Simple Email Service API 参考](https://docs.aws.amazon.com/ses/latest/APIReference/API_CreateReceiptRuleSet.html)中所述。随后，您可以使用 Amazon SES 控制台或 `CreateReceiptRule` API 来向其添加接收规则。

在继续演练之前，请确保您已满足使用基于收件人的电子邮件接收所需的所有必要先决条件。

## 先决条件
<a name="receipt-rules-prerequisites"></a>

在继续使用接收规则设置基于收件人的电子邮件控制之前，必须满足以下先决条件：

1. 确保您的终端节点位于 Amazon SES 支持电子邮件接收 AWS 区域 的地方。中的[电子邮件接收端点](https://docs.aws.amazon.com/general/latest/gr/ses.html#ses_inbound_endpoints)表 AWS 一般参考 列出了 SES 支持电子邮件接收的所有终端节点 AWS 区域 的电子邮件接收端点。

1. 首先需要在 Amazon SES 中[创建并验证域身份](verify-addresses-and-domains.md)。

1. 接下来，您需要通过[将 MX 记录发布](receiving-email-mx-record.md)域的 DNS 设置来指定哪些邮件服务器可以接收域的邮件。（MX 记录应指接收您使用 Amazon SES 所在 AWS 地区的邮件的 Amazon SES 终端节点。）

1. 最后，您需要授[予 Amazon SES 访问其他 AWS 资源的权限](receiving-email-permissions.md)才能执行接收规则操作。

## 创建规则集和接收规则
<a name="receipt-rules-create-rule-settings"></a>

本演练首先会创建包含规则的规则集，然后进入**创建规则**向导，以创建、定义和排序接收规则。该向导包含四个屏幕，分别用于定义规则设置、添加收件人条件、添加操作以及查看所有设置。

**使用控制台创建规则集和接收规则**

1. 登录 AWS 管理控制台 并打开 Amazon SES 控制台，网址为[https://console.aws.amazon.com/ses/](https://console.aws.amazon.com/ses/)。

1. 在导航窗格中的**配置**下面，选择**电子邮件接收**。
**注意**  
如果您的账户位于 SES 不支持电子邮件接收的 AWS 区域 ，则在 SES 控制台的左侧导航窗格中将看不到*电子邮件接收*。请参阅[先决条件](#receipt-rules-prerequisites)中列出的第一项。

1. 在 **Email receiving**（电子邮件接收）窗格的 **Receipt rule sets**（接收规则集）选项卡下，选择 **Create rule set**（创建规则集）。

1. 为规则集输入唯一的名称，然后选择**创建规则集**。

1. 选择**创建规则**，此时将打开**创建规则**向导。

1. 在**定义规则设置**页面的**接收规则详细信息**下，输入**规则名称**。

1. 对于**状态**，只有当您不希望 Amazon SES 在创建后运行此规则时，清除**启用**复选框；否则，请保持此选项处于选中状态。

1. （可选）在**安全和保护选项**下，对于**传输层安全性 (TLS)**，如果需要 Amazon SES 拒绝未通过安全连接发送的传入邮件，请选择**必需**。

1. （可选）对于**垃圾邮件和病毒扫描**，如果需要 Amazon SES 扫描传入邮件中是否有垃圾邮件和病毒，请选择**启用**。

1. 要继续执行下一个步骤，请选择**下一步**。

1. （可选）在**添加收件人条件**页面上，使用以下过程指定一个或多个收件人条件。每个接收规则最多可包含 100 个收件人条件。

   1. 在**收件人条件**下，选择**添加新收件人条件**，可指定要应用接收规则的接收电子邮件地址或域。下表使用地址 *user@example.com* 来显示如何指定收件人条件。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/receiving-email-receipt-rules-console-walkthrough.html)
**重要**  
如果多个 Amazon SES 账户均接收某一通用域的电子邮件（例如，同一公司的多个团队各自拥有单独的 Amazon SES 账户），Amazon SES 将同时为各个账户处理所有匹配的接收规则。此行为可能导致一个账户生成退回邮件，而另一个账户接受该电子邮件的情况。  
我们建议您与组织中其他使用 Amazon SES 的团队相互协调，以确保每个账户使用唯一的接收规则，并且这些规则不重叠。在这些情况下，最好将接收规则配置为仅使用您的群组或团队独有的电子邮件地址或子域。

   1. 对要添加的每个收件人条件重复此步骤。添加完收件人条件后，选择**下一步**。

1. 在**添加操作**页面上，使用以下过程将一个或多个操作添加到接收规则。

   1. 打开**添加新操作**菜单，然后选择以下操作类型之一：
      + **[添加标头](receiving-email-action-add-header.md)** - 此操作向收到的电子邮件添加一个自定义标头。
      + **[返回退回邮件响应](receiving-email-action-bounce.md)** - 此操作通过向发件人返回退回邮件响应来拒绝收到的电子邮件。
      + **[调用 Lambda 函数](receiving-email-action-lambda.md)**-此操作通过 AWS Lambda 函数调用您的代码。
      + **[交付到 S3 存储桶](receiving-email-action-s3.md)** - 此操作将收到的电子邮件存储在 Amazon Simple Storage Service (S3) 存储桶中。
      + **[发布到 Amazon SNS 主题](receiving-email-action-sns.md)** - 此操作将完整的电子邮件发布到 Amazon Simple Notification Service (SNS) 主题。
      + **[停止规则集](receiving-email-action-stop.md)** - 此操作终止对接收规则集的评估。
      + **[集成 Amazon WorkMail](receiving-email-action-workmail.md)**-此操作与 Amazon 集成 WorkMail。

      有关每个操作的更多信息，请参阅 [操作选项](receiving-email-action.md)。

   1. 对要定义的每个操作重复此步骤。如果定义了多个操作，可以使用操作容器中的向上/向下箭头对其重新排序。选择 **Next (下一步)** 可继续到 **Review (审核)** 页面。

1. 在**审核**页面上，审核规则的设置和操作。如果需要进行更改，请选择**编辑**选项，或通过页面左侧的导航部分直接转到包含要编辑的内容的步骤。您可以选择使用 “**重新排序” 列中的 up/down 箭头更改 “**查看**” 页面的 “**操作**” 表格中列出的操作顺序**。

1. 如果您已准备好继续，请选择**创建规则**。

1. 在规则集的确认页面上，如果要立即实施规则集，请选择 **Set as active**（设置为活动状态）。

### 创建后的规则修改
<a name="receipt-rules-post-modifications"></a>

创建规则集后，可以编辑规则集及其包含的接收规则。不仅可以编辑，还可以选择复制规则集或其规则，以便快速创建新规则集或规则。下表显示了规则集和接收规则的可用修改：
+ **规则集**将列出其名称、状态和创建日期。规则集的修改选项包括：
  + **设置为激活/非激活**切换按钮将在设置状态之间切换。
  + **复制**按钮将复制规则集。系统将提示您提供唯一的名称。
  + **删除**按钮将删除规则集。系统将提示您确认此操作不可逆。
+ **接收规则**将列出其名称、状态、安全性和顺序。接收规则的修改选项包括：
  + **向上/向下箭头**可在规则集中重新排序规则执行。
  + **复制**按钮将创建所选规则的副本。系统将提示您提供唯一的名称。
  + **编辑**按钮将打开所选规则，以便可以编辑其任何参数，如规则设置、收件人条件和操作。
  + **删除**按钮将删除所选规则。系统将提示您确认此操作不可逆。
  + **创建规则**按钮将允许您创建新规则，并将其添加到当前规则集。

# 操作选项
<a name="receiving-email-action"></a>

Amazon SES 电子邮件接收的每个接收规则都包含一组有序操作。本部分介绍每个操作类型的具体选项。

有以下操作类型：
+ [添加标头操作](receiving-email-action-add-header.md)
+ [返回退回邮件响应操作](receiving-email-action-bounce.md)
+ [调用 Lambda 函数操作](receiving-email-action-lambda.md)
+ [交付到 S3 存储桶操作](receiving-email-action-s3.md)
+ [发布到 Amazon SNS 主题操作](receiving-email-action-sns.md)
+ [停止规则集操作](receiving-email-action-stop.md)
+ [集成 Amazon WorkMail 操作](receiving-email-action-workmail.md)

# 添加标头操作
<a name="receiving-email-action-add-header"></a>

**Add Header** 操作向收到的电子邮件添加一个自定义标头。此操作通常仅与另一个操作结合使用。此操作具有以下选项。
+ **标头名称**：要添加的标头的名称。必须介于 1 到 50 个字符（含）之间，并且只能包含字母数字（a-z、A-Z、0-9）字符和短划线。
+ **标头值**：要添加的标头的值。必须少于 2048 个字符，并且不能包含换行符（“\$1r”或“\$1n”）。

# 返回退回邮件响应操作
<a name="receiving-email-action-bounce"></a>

**Bounce (退回邮件)** 操作通过将退回邮件响应返回给发件人来拒绝电子邮件，并通过 Amazon SNS 通知您（可选）。此操作具有以下选项。
+ **SMTP Reply Code**：根据 [RFC 5321](https://tools.ietf.org/html/rfc5321) 定义的 SMTP 回复代码。
+ **SMTP Status Code**：根据 [RFC 3463](https://tools.ietf.org/html/rfc3463) 定义的 SMTP 增强状态代码。
+ **Message**：要包含在退回邮件中的用户可读文本。
+ **Reply Sender (回复发件人)**：退回电子邮件的发件人电子邮件地址。这是将从中发送退回邮件的地址。它必须使用 Amazon SES 验证。
**注意**  
退回消息不是通过您的自定义 MAIL FROM 域发送的，而是由 SES 内部生成并仅使用 `amazonses.com` DKIM 签名进行签名。作为解决方法，使用**回复发件人**选项为您的退回消息设置一个电子邮件地址。请参阅此 [AWS re:Post 文章](https://repost.aws/questions/QURvN-26L_SJOcY9JoSFgCdg/ses-receiving-return-bounce-response-action-not-sending-bounce)以获取更多信息。
+ **SNS Topic（SNS 主题）**：在退回电子邮件发送后可选择通知的 Amazon SNS 主题的名称或 ARN。Amazon SNS 主题 ARN 的示例如：*arn:aws:sns:us-east-1:123456789012:MyTopic*。您也可以在设置操作时通过选择 **Create SNS Topic**（创建 SNS 主题）来创建 Amazon SNS 主题。有关 Amazon SNS 主题的更多信息，请参阅 [Amazon Simple Notification Service 开发人员指南](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。
**注意**  
您选择的 Amazon SNS 主题必须与用于接收电子邮件的 Amazon SES 端点位于同一 AWS 区域中。

您可以在这些字段中键入您自己的值，也可以选择模板，根据退回邮件的原因填充 SMTP Reply Code、SMTP Status Code 和 Message 字段的值。可用模板如下：
+ **Mailbox Does Not Exist**：SMTP Reply Code = 550，SMTP Status Code = 5.1.1
+ **Message Too Large**：SMTP Reply Code = 552，SMTP Status Code = 5.3.4
+ **Mailbox Full (邮箱已满)**：SMTP 回复代码 = 552、SMTP 状态代码 = 5.2.2
+ **Message Content Rejected**：SMTP Reply Code = 500，SMTP Status Code = 5.6.1
+ **Unknown Failure**：SMTP Reply Code = 554，SMTP Status Code = 5.0.0
+ **Temporary Failure**：SMTP Reply Code = 450，SMTP Status Code = 4.0.0

有关在字段中键入自定义值时可能使用的其他退回邮件代码，请参阅 [RFC 3463](https://tools.ietf.org/html/rfc3463)。

# 调用 Lambda 函数操作
<a name="receiving-email-action-lambda"></a>

Lambda 操作通过 Lambda 函数调用您的代码，并通过 Amazon SNS 通知您（可选）。此规则操作具有以下选项和要求：

**选项**
+ **Lambda function (Lambda 函数)** – Lambda 函数的 ARN。*Lambda 函数 ARN 的一个例子是 arn: aws: lambda: us-east-1: account-id: function:。MyFunction*
+ **Invocation type (调用类型)** – Lambda 函数的调用类型。调用类型为**RequestResponse**意味着函数的执行会立即得到响应。调用类型 **Event** 意味着该函数是异步调用的。我们建议您使用 **Event** 调用类型，除非您的使用案例中必需同步执行。

  有一个 30 秒的 **RequestResponse** 调用超时时间。

  有关更多信息，请参阅 *AWS Lambda 开发人员指南*中的[调用 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)。
+ **SNS Topic (SNS 主题)** – 在触发指定的 Lambda 函数时发出通知的 Amazon SNS 主题的名称或 ARN。*亚马逊 SNS 话题 ARN 的一个例子是 arn: aws: sns: us-east-1:123456789012:。MyTopic*有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的[创建 Amazon SNS 主题](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。

**要求**
+ 您选择的 Lambda 函数必须与您用于接收电子邮件的 Amazon SES 终端节点位于同一 AWS 区域。
+ 您选择的 Amazon SNS 主题必须与您用于接收电子邮件的 Amazon SES 终端节点位于同一 AWS 区域。

## 编写 Lambda 函数
<a name="receiving-email-action-lambda-function"></a>

处理电子邮件时，可以异步调用 Lambda 函数（即使用 `Event` 调用类型）。传递给 Lambda 函数的事件对象将包含与入站电子邮件事件有关的元数据。您还可以使用元数据从 Amazon S3 存储桶访问消息内容。

如果需要实际控制邮件流，则必须同步调用 Lambda 函数（即使用 `RequestResponse` 调用类型），并且 Lambda 函数必须用两个参数调用 `callback` 方法：第一个参数是 `null`，第二个参数是 `disposition` 属性，它的值设置为 `STOP_RULE`、`STOP_RULE_SET` 或 `CONTINUE`。如果第二个参数为 `null` 或没有有效的 `disposition` 属性，则邮件流将继续，并处理接下来的操作和规则，这与 `CONTINUE` 相同。

例如，您可以通过在 Lambda 函数代码的结尾写入以下行来停止接收规则集：

```
callback( null, { "disposition" : "STOP_RULE_SET" });
```

有关 AWS Lambda 代码示例，请参阅[Lambda 函数示例](receiving-email-action-lambda-example-functions.md)。有关高级使用案例的示例，请参阅[使用案例示例](receiving-email-action-lambda-example-use-cases.md)。

### 输入格式
<a name="receiving-email-action-lambda-input"></a>

Amazon SES 以 JSON 格式向 Lambda 函数传送信息。顶级对象包含一个 `Records` 数组，其中包含属性 `eventSource`、`eventVersion` 和 `ses`。`ses` 对象包含 `receipt` 和 `mail` 对象，这些对象的格式与[通知内容](receiving-email-notifications-contents.md)中所述的 Amazon SNS 通知中的格式完全相同。

Amazon SES 传递给 Lambda 的数据包括有关邮件的元数据，以及多个电子邮件标头。但是，不包含邮件的正文。

下面是 Amazon SES 提供给 Lambda 函数的输入结构的概括视图。

```
{
   "Records": [
      {
        "eventSource": "aws:ses",
        "eventVersion": "1.0",
        "ses": {
           "receipt": {
               <same contents as SNS notification>
            },
           "mail": {
               <same contents as SNS notification>
           }
         }
     }
   ]
}
```

### 返回值
<a name="receiving-email-action-lambda-function-return-values"></a>

您的 Lambda 函数可以通过返回以下值之一来控制邮件流：
+ `STOP_RULE` – 当前接收规则中没有进一步操作需要处理，但可以处理后续的接收规则。
+ `STOP_RULE_SET` – 没有后续操作或接收规则需要处理。
+ `CONTINUE` 或任何其他无效值 – 这意味着可以处理后续操作和接收规则。

**Topics**
+ [编写 Lambda 函数](#receiving-email-action-lambda-function)
+ [传入电子邮件事件示例](receiving-email-action-lambda-event.md)
+ [使用案例示例](receiving-email-action-lambda-example-use-cases.md)
+ [Lambda 函数示例](receiving-email-action-lambda-example-functions.md)

# 传入电子邮件事件示例
<a name="receiving-email-action-lambda-event"></a>

有两种方法可以将传入的电子邮件事件发送到 Lambda 函数。第一种方法是使用接收规则中的 Lambda 操作将事件记录直接发送到该函数。第二种方法是使用接收规则中的 Amazon SNS 操作将事件记录发送到 Amazon SNS，然后将 Lambda 函数添加为 Amazon SNS 主题的订阅终端节点。

本节包含 Amazon SES 可以发送到 Lambda 的事件记录的示例。您可以使用这些示例来创建和测试 Lambda 函数。

**注意**  
本部分中的示例包括换行符，以便于阅读。如果您复制本节中的示例，则应删除换行符以生成有效的 JSON 对象。

## Lambda 操作提供的事件记录
<a name="receiving-email-action-lambda-event-lambdaaction"></a>

当您向接收规则添加 Lambda 操作时，Amazon SES 会在每次收到传入消息时向 Lambda 发送事件记录。此事件包含有关传入消息的多个电子邮件标头的信息，以及 Amazon SES 对传入消息执行的多个测试的结果。但是，它会省略传入消息的正文。

以下示例显示了这些事件记录通常包含的值。

```
{
  "Records": [{
    "eventSource": "aws:ses",
    "eventVersion": "1.0",
    "ses": {
      "mail": {
        "timestamp": "2019-08-05T21:30:02.028Z",
        "source": "prvs=144d0cba7=sender@example.com",
        "messageId": "EXAMPLE7c191be45-e9aedb9a-02f9-4d12-a87d-dd0099a07f8a-000000",
        "destination": ["recipient@example.com"],
        "headersTruncated": false,
        "headers": [{
          "name": "Return-Path",
          "value": "<prvs=144d0cba7=sender@example.com>"
        }, {
          "name": "Received",
          "value": "from smtp.example.com [203.0.113.0]) by inbound-smtp.us-east-1.amazonaws.com 
                    with SMTP id bsvpsoklfhu7u50iur7h0kk9a2ou0r7iexample for recipient@example.com;
                    Mon, 05 Aug 2019 21:30:02 +0000 (UTC)"
        }, {
          "name": "X-SES-Spam-Verdict",
          "value": "PASS"
        }, {
          "name": "X-SES-Virus-Verdict",
          "value": "PASS"
        }, {
          "name": "Received-SPF",
          "value": "pass (spfCheck: domain of example.com designates 203.0.113.0 as permitted sender) 
                    client-ip=203.0.113.0; envelope-from=prvs=144d0cba42=sender@example.com; helo=
                    smtp.example.com;"
        }, {
          "name": "Authentication-Results",
          "value": "amazonses.com; spf=pass (spfCheck: domain of example.com designates 203.0.113.0
                    as permitted sender) client-ip=203.0.113.0; envelope-from=prvs=144d0cba42=
                    sender@example.com; helo=smtp.example.com; dkim=pass header.i=@example.com; 
                    dmarc=none header.from=example.com;"
        }, {
          "name": "X-SES-RECEIPT",
          "value": "AEFBQUFBQUFBQUFHbFo0VU81VzVuYmRDNm51nhTVWpabDh6J4V2l5cG5PSHFtNzlBeUk90example"
        }, {
          "name": "X-SES-DKIM-SIGNATURE",
          "value": "a=rsa-sha256; q=dns/txt; b=Cm1emU30VcD6example=; c=relaxed/simple; s=6gbrjpgwjs
                    5zn6fwqknexample; d=amazonses.com; t=1567719002; v=1; bh=DSofsjAoUvyZj6YsBDP5en
                    pRO1otGb7Nes0Qexample=; h=From:To:Cc:Bcc:Subject:Date:Message-ID:MIME-Version:
                    Content-Type:X-SES-RECEIPT;"
        }, {
          "name": "DKIM-Signature",
          "value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; i=@example.com; q=dns/txt; 
                    s=example12345; t=1567719001; x=1599255001; h=from:to:subject:date:message-id:
                    references:in-reply-to:mime-version; bh=sjAoUvyZj6YsBDP5enpRO1otGb7s0Qexample=; 
                    b=EQw2D4RLOW2IHE9OgfEA4WXp+AENJtaD2+63wmd5J+d+t/xoaiKUGClOS7WhpyOmlipryOz+iOhxU
                    v350xJIHjLTi9Jsnlw76mRK8o4770TaUz620joCVN21n4cxsrRZpv+1kS0EcAxaF30pmwlni+XT4ems
                    Vxn7zO0I8example=;"
        }, {
          "name": "Received",
          "value": "from mail.example.com (mail.example.com [203.0.113.0]) by email-inbound-relay-
                    1d-9ec21598.us-east-1.example.com (Postfix) with ESMTPS id 57F83A2042 for 
                    <recipient@example.com>; Mon, 5 Aug 2019 21:29:58 +0000 (UTC)"
        }, {
          "name": "From",
          "value": "\"Doe, John\" <sender@example.com>"
        }, {
          "name": "To",
          "value": "\"recipient@example.com\" <recipient@example.com>"
        }, {
          "name": "Subject",
          "value": "This is a test"
        }, {
          "name": "Thread-Topic",
          "value": "This is a test"
        }, {
          "name": "Thread-Index",
          "value": "AQHVZDAaQ58yKI8q7kaAjkhC5stGexample"
        }, {
          "name": "Date",
          "value": "Mon, 5 Aug 2019 21:29:57 +0000"
        }, {
          "name": "Message-ID",
          "value": "<F8098FDD-49A3-442D-9935-F6112example@example.com>"
        }, {
          "name": "References",
          "value": "<1FCED16B-F6B0-4506-A6F0-594DFexample@example.com>"
        }, {
          "name": "In-Reply-To",
          "value": "<1FCED16B-F6B0-4506-A6F0-594DFexample@example.com>"
        }, {
          "name": "Accept-Language",
          "value": "en-US"
        }, {
          "name": "Content-Language",
          "value": "en-US"
        }, {
          "name": "X-MS-Has-Attach",
          "value": ""
        }, {
          "name": "X-MS-TNEF-Correlator",
          "value": ""
        }, {
          "name": "x-ms-exchange-messagesentrepresentingtype",
          "value": "1"
        }, {
          "name": "x-ms-exchange-transport-fromentityheader",
          "value": "Hosted"
        }, {
          "name": "x-originating-ip",
          "value": "[203.0.113.0]"
        }, {
          "name": "Content-Type",
          "value": "multipart/alternative; boundary=\"_000_F8098FDD49A344F6112B195BDAexamplecom_\""
        }, {
          "name": "MIME-Version",
          "value": "1.0"
        }, {
          "name": "Precedence",
          "value": "Bulk"
        }],
        "commonHeaders": {
          "returnPath": "prvs=144d0cba7=sender@example.com",
          "from": ["\"Doe, John\" <sender@example.com>"],
          "date": "Mon, 5 Aug 2019 21:29:57 +0000",
          "to": ["\"recipient@example.com\" <recipient@example.com>"],
          "messageId": "<F8098FDD-49A3-442D-9935-F6112B195BDA@example.com>",
          "subject": "This is a test"
        }
      },
      "receipt": {
        "timestamp": "2019-08-05T21:30:02.028Z",
        "processingTimeMillis": 1205,
        "recipients": ["recipient@example.com"],
        "spamVerdict": {
          "status": "PASS"
        },
        "virusVerdict": {
          "status": "PASS"
        },
        "spfVerdict": {
          "status": "PASS"
        },
        "dkimVerdict": {
          "status": "PASS"
        },
        "dmarcVerdict": {
          "status": "GRAY"
        },
        "action": {
          "type": "Lambda",
          "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:IncomingEmail",
          "invocationType": "Event"
        }
      }
    }
  }]
}
```

## Amazon SNS 操作提供的事件记录
<a name="receiving-email-action-lambda-event-snsaction"></a>

当您向接收规则添加 Amazon SNS 操作时，通知将包含电子邮件的全部内容。如果您希望 Lambda 函数处理电子邮件的正文，则应该在接收规则中添加 Amazon SNS 操作，然后在 Amazon SNS 中，将您的 Lambda 函数订阅到 Amazon SNS 函数。此配置会导致您的 Lambda 函数在收到 Amazon SNS 主题通知时被激活。

```
{
    'Records': [
        {
            'EventSource': 'aws:sns',
            'EventVersion': '1.0',
            'EventSubscriptionArn': 'arn:aws:sns:us-east-1:123456789012:IncomingEmail:12345678',
            'Sns': {
                'Type': 'Notification',
                'MessageId': 'EXAMPLE7c191be45-e9aedb9a-02f9-4d12-a87d-dd0099a07f8a-000000',
                'TopicArn': 'arn:aws:sns:us-east-1:123456789012:IncomingEmail',
                'Subject': 'Amazon SES Email Receipt Notification',
                'Message': <message content—see below>,
                'Timestamp': '2019-09-06T18:52:16.076Z',
                'SignatureVersion': '1',
                'Signature': '012345678901example==',
                'SigningCertUrl': 'https://sns.us-east-1.amazonaws.com/SimpleNotificationService
                                   -01234567890123456789012345678901.pem',
                'UnsubscribeUrl': 'https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&
                                   SubscriptionArn=arn:aws:sns:us-east-1:0123456789012:IncomingEmail:
                                   0b863538-3f32-462e-9c89-8d8e0example',
                'MessageAttributes': {}
            }
        }
    ]
}
```

该 `Message` 属性包含 JSON 编码的字符串。该字符串包含消息的标头和内容。消息正文本身采用 Base64 编码。如果您希望在 Lambda 函数中使用消息正文，则首先必须解码 `Message` 属性，然后解码 `Content` 对象。

以下示例显示了 `Message` 属性中包含的值。

```
{
  "notificationType": "Received",
  "mail": {
    "timestamp": "2019-09-06T18:52:14.965Z",
    "source": "0100016d07eb7477-8e1938ce-475e-4e4b-89cb-example-000000@amazonses.com",
    "messageId": "12345678901example",
    "destination": ["recipient@example.com"],
    "headersTruncated": false,
    "headers": [{
      "name": "Return-Path",
      "value": "<0100016d07eb7477-8e1938ce-475e-4e4b-89cb-example-000000@amazonses.com>"
    }, {
      "name": "Received",
      "value": "from a1-23.smtp-out.amazonses.com (a1-23.smtp-out.amazonses.com [203.0.113.0]) by
                inbound-smtp.us-east-1.amazonaws.com with SMTP id
                12345678901example for recipient@example.com; Fri, 06 Sep 2019
                18:52:14 +0000 (UTC)"
    }, {
      "name": "X-SES-Spam-Verdict",
      "value": "PASS"
    }, {
      "name": "X-SES-Virus-Verdict",
      "value": "PASS"
    }, {
      "name": "Received-SPF",
      "value": "pass (spfCheck: domain of amazonses.com designates 203.0.113.0 as permitted sender)
                client-ip=203.0.113.0; envelope-from=0100016d07eb7477-8e1938ce-475e-4e4b-89cb-example
                -000000@amazonses.com; helo=a1-23.smtp-out.amazonses.com;"
    }, {
      "name": "Authentication-Results",
      "value": "amazonses.com; spf=pass (spfCheck: domain of amazonses.com designates 203.0.113.0
                as permitted sender) client-ip=203.0.113.0; envelope-from=0100016d07eb7477-8e1938ce
                -475e-4e4b-89cb-example-000000@amazonses.com; helo=a1-23.smtp-out.amazonses.com;
                dkim=pass header.i=@amazonses.com; dmarc=none header.from=example.com;"
    }, {
      "name": "X-SES-RECEIPT",
      "value": "AEFBQUFBQUFBQUFFQkx0QUJZZENEXAMPLE="
    }, {
      "name": "X-SES-DKIM-SIGNATURE",
      "value": "a=rsa-sha256; q=dns/txt; b=d5azwgA2iBqAjA4NBm1ARzjJ95raRmy4G84iVdd3x2JzSHeUnQuTuLmJ
                AqRrYY3WpMIVRFy01hITaguCVjUPWBR0xF6fCEXH85cf3RNeFQyLfWZqoXKfBdjFRV+13troDterH2MxBUL
                8rjzcvdHetl0ImwlaK2PGmePTexample=; c=relaxed/simple; s=EXAMPLE7c191be45-e9aedb9a-02
                f9-4d12-a87d-dd0099a07f8a-000000; d=amazonses.com; t=1567795935; v=1; bh=CZ1SghsYaA
                6SSCbitzsLISeFoNlpdtH1Pyiexample=; h=From:To:Cc:Bcc:Subject:Date:Message-ID:MIME-
                Version:Content-Type:X-SES-RECEIPT;"
    }, {
      "name": "DKIM-Signature",
      "value": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=EXAMPLE7c191be45-e9aedb9a-02f9-
                4d12-a87d-dd0099a07f8a-000000; d=amazonses.com; t=1567795934; h=From:To:Subject:
                MIME-Version:Content-Type:Message-ID:Date:Feedback-ID; bh=CZ1SghsYaA6SSCbitzsLISeFo
                NlpdtH1Pyiexample=; b=L6VXqR1PSN/FYqJI/VAfPRKFgtakcHCYJvuJqVYbuJT8I3FOhqOvkbcgHxOgs
                woxPfvGrL6S53H8Er5Do/CPvOM4Tx3ilE+a0GTYVLjKmwltNeN09YWlJAoqG5KMQPZUxRYaNvYPInLzUdGi
                rdjkbSIgZEnrvq5MzaMWexample="
    }, {
      "name": "From",
      "value": "sender@example.com"
    }, {
      "name": "To",
      "value": "recipient@example.com"
    }, {
      "name": "Subject",
      "value": "Amazon SES Test"
    }, {
      "name": "MIME-Version",
      "value": "1.0"
    }, {
      "name": "Content-Type",
      "value": "multipart/alternative;  boundary=\"----=_Part_869787_396523212.15677example\""
    }, {
      "name": "Message-ID",
      "value": "<0100016d07eb7477-8e1938ce-475e-4e4b-89cb-example-000000@email.amazonses.com>"
    }, {
      "name": "Date",
      "value": "Fri, 6 Sep 2019 18:52:14 +0000"
    }, {
      "name": "X-SES-Outgoing",
      "value": "2019.09.06-203.0.113.0"
    }, {
      "name": "Feedback-ID",
      "value": "1.us-east-1.ZitRoTk0xziun8WEJevt+cSJ17QNuCwulg2D2v3nrT0=:AmazonSES"
    }],
    "commonHeaders": {
      "returnPath": "0100016d07eb7477-8e1938ce-475e-4e4b-89cb-example-000000@amazonses.com",
      "from": ["sender@example.com"],
      "date": "Fri, 6 Sep 2019 18:52:14 +0000",
      "to": ["recipient@example.com"],
      "messageId": "<0100016d07eb7477-8e1938ce-475e-4e4b-89cb-example-000000@email.amazonses.com>",
      "subject": "Amazon SES Test"
    }
  },
  "receipt": {
    "timestamp": "2019-09-06T18:52:14.965Z",
    "processingTimeMillis": 1098,
    "recipients": ["recipient@example.com"],
    "spamVerdict": {
      "status": "PASS"
    },
    "virusVerdict": {
      "status": "PASS"
    },
    "spfVerdict": {
      "status": "PASS"
    },
    "dkimVerdict": {
      "status": "GRAY"
    },
    "dmarcVerdict": {
      "status": "GRAY"
    },
    "action": {
      "type": "SNS",
      "topicArn": "arn:aws:sns:us-east-1:123456789012:IncomingEmail",
      "encoding": "BASE64"
    }
  },
  "content": "UmV0dXJuLVBhdGg6IDwwMTAwMDE2ZDA3ZWI3NDc3LThlMTkzOGNlLTQ3NWUtNGU0Yi04OWNiLWV4YW1wbGUtM
              DAwMDAwQGFtYXpvbnNlcy5jb20+ClJlY2VpdmVkOiBmcm9tIGExLTIzLnNtdHAtb3V0LmFtYXpvbnNlcy5jb2
              0gKGExLTIzLnNtdHAtb3V0LmFtYXpvbnNlcy5jb20gWzIwMy4wLjExMy4wXSkKIGJ5IGluYm91bmQtc210cC5
              1cy1lYXN0LTEuYW1hem9uYXdzLmNvbSB3aXRoIFNNVFAgaWQgZW5xMTBpYW1lMXFjdTMxamg1ZGEyZ244OWlt
              dm90Mms2ZXhhbXBsZQogZm9yIHJlY2lwaWVudEBleGFtcGxlLmNvbTsKIEZyaSwgMDYgU2VwIDIwMTkgMTg6N
              TI6MTQgKzAwMDAgKFVUQykKWC1TRVMtU3BhbS1WZXJkaWN0OiBQQVNTClgtU0VTLVZpcnVzLVZlcmRpY3Q6IF
              BBU1MKUmVjZWl2ZWQtU1BGOiBwYXNzIChzcGZDaGVjazogZG9tYWluIG9mIGFtYXpvbnNlcy5jb20gZGVzaWd
              uYXRlcyAyMDMuMC4xMTMuMCBhcyBwZXJtaXR0ZWQgc2VuZGVyKSBjbGllbnQtaXA9MjAzLjAuMTEzLjA7IGVu
              dmVsb3BlLWZyb209MDEwMDAxNmQwN2ViNzQ3Ny04ZTE5MzhjZS00NzVlLTRlNGItODljYi1leGFtcGxlLTAwM
              DAwMEBhbWF6b25zZXMuY29tOyBoZWxvPWExLTIzLnNtdHAtb3V0LmFtYXpvbnNlcy5jb207CkF1dGhlbnRpY2
              F0aW9uLVJlc3VsdHM6IGFtYXpvbnNlcy5jb207CiBzcGY9cGFzcyAoc3BmQ2hlY2s6IGRvbWFpbiBvZiBhbWF
              6b25zZXMuY29tIGRlc2lnbmF0ZXMgMjAzLjAuMTEzLjAgYXMgcGVybWl0dGVkIHNlbmRlcikgY2xpZW50LWlw
              PTIwMy4wLjExMy4wOyBlbnZlbG9wZS1mcm9tPTAxMDAwMTZkMDdlYjc0NzctOGUxOTM4Y2UtNDc1ZS00ZTRiL
              Tg5Y2ItZXhhbXBsZS0wMDAwMDBAYW1hem9uc2VzLmNvbTsgaGVsbz1hMS0yMy5zbXRwLW91dC5hbWF6b25zZX
              MuY29tOwogZGtpbT1wYXNzIGhlYWRlci5pPUBhbWF6b25zZXMuY29tOwogZG1hcmM9bm9uZSBoZWFkZXIuZnJ
              vbT1leGFtcGxlLmNvbTsKWC1TRVMtUkVDRUlQVDogQUVGQlFVRkJRVUZCUVVGRlFreDBRVUpaWkVORVhBTVBM
              RT0KWC1TRVMtREtJTS1TSUdOQVRVUkU6IGE9cnNhLXNoYTI1NjsgcT1kbnMvdHh0OyBiPWQ1YXp3Z0EyaUJxQ
              WpBNE5CbTFBUnpqSjk1cmFSbXk0Rzg0aVZkZDN4Mkp6U0hlVW5RdVR1TG1KQXFScllZM1dwTUlWUkZ5MDFoSV
              RhZ3VDVmpVUFdCUjB4RjZmQ0VYSDg1Y2YzUk5lRlF5TGZXWnFvWEtmQmRqRlJWKzEzdHJvRHRlckgyTXhCVUw
              4cmp6Y3ZkSGV0bDBJbXdsYUsyUEdtZVBUZXhhbXBsZT07IGM9cmVsYXhlZC9zaW1wbGU7IHM9RVhBTVBMRTdj
              MTkxYmU0NS1lOWFlZGI5YS0wMmY5LTRkMTItYTg3ZC1kZDAwOTlhMDdmOGEtMDAwMDAwOyBkPWFtYXpvbnNlc
              y5jb207IHQ9MTU2Nzc5NTkzNTsgdj0xOyBiaD1DWjFTZ2hzWWFBNlNTQ2JpdHpzTElTZUZvTmxwZHRIMVB5aW
              V4YW1wbGU9OyBoPUZyb206VG86Q2M6QmNjOlN1YmplY3Q6RGF0ZTpNZXNzYWdlLUlEOk1JTUUtVmVyc2lvbjp
              Db250ZW50LVR5cGU6WC1TRVMtUkVDRUlQVDsKREtJTS1TaWduYXR1cmU6IHY9MTsgYT1yc2Etc2hhMjU2OyBx
              PWRucy90eHQ7IGM9cmVsYXhlZC9zaW1wbGU7CglzPUVYQU1QTEU3YzE5MWJlNDUtZTlhZWRiOWEtMDJmOS00Z
              DEyLWE4N2QtZGQwMDk5YTA3ZjhhLTAwMDAwMDsgZD1hbWF6b25zZXMuY29tOyB0PTE1Njc3OTU5MzQ7CgloPU
              Zyb206VG86U3ViamVjdDpNSU1FLVZlcnNpb246Q29udGVudC1UeXBlOk1lc3NhZ2UtSUQ6RGF0ZTpGZWVkYmF
              jay1JRDsKCWJoPUNaMVNnaHNZYUE2U1NDYml0enNMSVNlRm9ObHBkdEgxUHlpTWV4YW1wbGU9OwoJYj1leGFt
              cGxlPQpGcm9tOiBzZW5kZXJAZXhhbXBsZS5jb20KVG86IHJlY2lwaWVudEBleGFtcGxlLmNvbQpTdWJqZWN0O
              iBBbWF6b24gU0VTIFRlc3QKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZX
              JuYXRpdmU7IAoJYm91bmRhcnk9Ii0tLS09X1BhcnRfODY5Nzg3XzM5NjUyMzIxMi4xNTY3N2V4YW1wbGUiCk1
              lc3NhZ2UtSUQ6IDwwMTAwMDE2ZDA3ZWI3NDc3LThlMTkzOGNlLTQ3NWUtNGU0Yi04OWNiLWV4YW1wbGUtMDAw
              MDAwQGVtYWlsLmFtYXpvbnNlcy5jb20+CkRhdGU6IEZyaSwgNiBTZXAgMjAxOSAxODo1MjoxNCArMDAwMApYL
              VNFUy1PdXRnb2luZzogMjAxOS4wOS4wNi0yMDMuMC4xMTMuMApGZWVkYmFjay1JRDogMS51cy1lYXN0LTEuWm
              l0Um9UazB4eml1bjhXRUpldnQrZXhhbXBsZT06QW1hem9uU0VTCgotLS0tLS09X1BhcnRfODY5Nzg3XzM5NjU
              yMzIxMi4xNTY3N2V4YW1wbGUKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04CkNvbnRl
              bnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKCkFtYXpvbiBTRVMgVGVzdApUaGlzIGVtYWlsIHdhcyBzZW50I
              HdpdGggQW1hem9uIFNFUy4KLS0tLS0tPV9QYXJ0Xzg2OTc4N18zOTY1MjMyMTIuMTU2NzdleGFtcGxlCkNvbn
              RlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDd
              iaXQKCjxodG1sPgo8aGVhZD48L2hlYWQ+Cjxib2R5PgogIDxoMT5BbWF6b24gU0VTIFRlc3Q8L2gxPgogIDxw
              PlRoaXMgZW1haWwgd2FzIHNlbnQgd2l0aCBBbWF6b24gU0VTLjwvcD4KPGltZyBhbHQ9IiIgc3JjPSJodHRwO
              i8vZXhhbXBsZS5yLnVzLWVhc3QtMS5hd3N0cmFjay5tZS9JMC8wMTAwMDE2ZDA3ZWI3NDc3LThlMTkzOGNlLT
              Q3NWUtNGU0Yi04OWNiLWV4YW1wbGUtMDAwMDAwL3UtWUphaHRkTTJTclhZQ2QiIHN0eWxlPSJkaXNwbGF5OiB
              ub25lOyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFweDsiPgo8L2JvZHk+CjwvaHRtbD4KICAgICAgICAgICAgCi0t
              LS0tLT1fUGFydF84Njk3ODdfMzk2NTIzMjEyLjE1Njc3ZXhhbXBsZS0tCg=="
}
```

# 使用案例示例
<a name="receiving-email-action-lambda-example-use-cases"></a>

以下示例简要介绍您可以设置的一些规则，以使用 Lambda 函数结果控制邮件流。为方便演示，这些示例多数使用 S3 操作作为结果。

## 使用案例 1：删除所有域中的垃圾邮件
<a name="receiving-email-action-lambda-example-use-cases-1"></a>

本示例演示在您的所有域中删除垃圾邮件的全局规则。规则 2 和规则 3 表示您可以在所有域中删除垃圾邮件后应用特定于域的规则。

### 规则 1
<a name="receiving-email-action-lambda-example-use-cases-1-rule-1"></a>

*收件人列表：*空。因此，此规则将应用到您的所有已验证域下的所有收件人。

 *操作* 

1. 如果电子邮件为垃圾邮件，Lambda 操作 (同步) 返回 `STOP_RULE_SET`。否则返回 `CONTINUE`。请参阅[Lambda 函数示例](receiving-email-action-lambda-example-functions.md)中用于删除垃圾邮件的示例 Lambda 函数。

### 规则 2
<a name="receiving-email-action-lambda-example-use-cases-1-rule-2"></a>

*收件人列表：*example1.com

 *操作* 

1. 任何操作。

### 规则 3
<a name="receiving-email-action-lambda-example-use-cases-1-rule-3"></a>

*收件人列表：*example2.com

 *操作* 

1. 任何操作。

## 使用案例 2：退回所有域中的垃圾邮件
<a name="receiving-email-action-lambda-example-use-cases-2"></a>

本示例演示在您的所有域中退回垃圾邮件的全局规则。规则 2 和规则 3 表示您可以在所有域中退回垃圾邮件后应用特定于域的规则。

### 规则 1
<a name="receiving-email-action-lambda-example-use-cases-2-rule-1"></a>

*收件人列表：*空。因此，此规则将应用到您的所有已验证域下的所有收件人。

 *操作* 

1. 如果电子邮件为垃圾邮件，Lambda 操作 (同步) 返回 `CONTINUE`。否则返回 `STOP_RULE`。

1. 退回邮件操作 (“500 5.6.1. Message content rejected”)。

1. 停止操作。

### 规则 2
<a name="receiving-email-action-lambda-example-use-cases-2-rule-2"></a>

*收件人列表：*example1.com

 *操作* 

1. 任何操作

### 规则 3
<a name="receiving-email-action-lambda-example-use-cases-2-rule-3"></a>

*收件人列表：*example2.com

 *操作* 

1. 任何操作

## 使用案例 3：应用最具体的规则
<a name="receiving-email-action-lambda-example-use-cases-3"></a>

本示例演示如何使用停止操作防止电子邮件由多条规则进行处理。在此示例中，您有针对一个具体地址的一条规则，以及针对该域中所有电子邮件地址的另一条规则。通过使用停止操作，匹配具体电子邮件地址规则的消息不会由适用于整个域的通用规则进行处理。

### 规则 1
<a name="receiving-email-action-lambda-example-use-cases-3-rule-1"></a>

*收件人列表：*user@example.com

 *操作* 

1. Lambda 操作 (异步)。

1. 停止操作。

### 规则 2
<a name="receiving-email-action-lambda-example-use-cases-3-rule-2"></a>

*收件人列表：*example.com

 *操作* 

1. 任何操作。

## 用例 4：将邮件事件记录到 CloudWatch
<a name="receiving-email-action-lambda-example-use-cases-4"></a>

本示例演示在将邮件保存到 Amazon SES 之前，如何为经过系统的所有邮件保留审计日志。

### 规则 1
<a name="receiving-email-action-lambda-example-use-cases-4-rule-1"></a>

*收件人列表：*example.com

 *操作* 

1. 将事件对象写入日志的 Lambda 操作（异步）。 CloudWatch [Lambda 函数示例](receiving-email-action-lambda-example-functions.md)日志中的 Lambda 函数示例。 CloudWatch

1. S3 操作。

## 使用案例 5：删除 DKIM 失败的邮件
<a name="receiving-email-action-lambda-example-use-cases-5"></a>

本示例演示如何将所有传入电子邮件保存到 Amazon S3 存储桶，但仅将发送给特定电子邮件地址并通过 DKIM 的电子邮件发送到自动运行的电子邮件应用程序。

### 规则 1
<a name="receiving-email-action-lambda-example-use-cases-5-rule-1"></a>

*收件人列表：*example.com

 *操作* 

1. S3 操作。

1. 如果消息 DKIM 失败，Lambda 操作 (同步) 返回 `STOP_RULE_SET`。否则返回 `CONTINUE`。

### 规则 2
<a name="receiving-email-action-lambda-example-use-cases-5-rule-2"></a>

*收件人列表：*support@example.com

 *操作* 

1. 触发自动运行应用程序的 Lambda 操作 (异步)。

## 使用案例 6：基于主题行筛选邮件
<a name="receiving-email-action-lambda-example-use-cases-6"></a>

此示例演示如何删除一个域中主题行包含词语“discount”的所有传入邮件，然后用一种方式处理面向自动系统的邮件，用其他方式处理该域中发送给所有其他收件人的邮件。

### 规则 1
<a name="receiving-email-action-lambda-example-use-cases-6-rule-1"></a>

*收件人列表：*example.com

 *操作* 

1. 如果主题行包含词语“discount”，Lambda 操作 (同步) 返回 `STOP_RULE_SET`。否则返回 `CONTINUE`。

### 规则 2
<a name="receiving-email-action-lambda-example-use-cases-6-rule-2"></a>

*收件人列表：*support@example.com

 *操作* 

1. 存储桶 1 的 S3 操作。

1. 触发自动运行应用程序的 Lambda 操作 (异步)。

1. 停止操作。

### 规则 3
<a name="receiving-email-action-lambda-example-use-cases-6-rule-3"></a>

*收件人列表：*example.com

 *操作* 

1. 存储桶 2 的 S3 操作。

1. Lambda 操作 (异步)，用于处理域中的其他电子邮件。

# Lambda 函数示例
<a name="receiving-email-action-lambda-example-functions"></a>

本主题包含用于控制邮件流的 Lambda 函数的示例。

## 示例 1：删除垃圾邮件
<a name="receiving-email-action-lambda-example-functions-1"></a>

此示例会停止处理包含至少一个垃圾邮件指标的消息。

```
export const handler = async (event, context, callback) => {
    console.log('Spam filter');
    
    const sesNotification = event.Records[0].ses;
    console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
    
    // Check if any spam check failed
    if (sesNotification.receipt.spfVerdict.status === 'FAIL'
            || sesNotification.receipt.dkimVerdict.status === 'FAIL'
            || sesNotification.receipt.spamVerdict.status === 'FAIL'
            || sesNotification.receipt.virusVerdict.status === 'FAIL') {
                
        console.log('Dropping spam');

        // Stop processing rule set, dropping message
        callback(null, {'disposition':'STOP_RULE_SET'});
    } else {
        callback(null, {'disposition':'CONTINUE'});   
    }
};
```

## 示例 2：如果找到特定标头，则继续
<a name="receiving-email-action-lambda-example-functions-2"></a>

只有在电子邮件包含特定标头值时，此示例才继续处理当前规则。

```
export const handler = async (event, context, callback) => {
    console.log('Header matcher');
 
    const sesNotification = event.Records[0].ses;
    console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
    
    // Iterate over the headers
    for (let index in sesNotification.mail.headers) {
        const header = sesNotification.mail.headers[index];
        
        // Examine the header values
        if (header.name === 'X-Header' && header.value === 'X-Value') {
            console.log('Found header with value.');
            callback(null, {'disposition':'CONTINUE'});
            return;
        }
    }
    
    // Stop processing the rule if the header value wasn't found
    callback(null, {'disposition':'STOP_RULE'});
};
```

## 示例 3：从 Amazon S3 检索电子邮件
<a name="receiving-email-action-lambda-example-functions-3"></a>

此示例从 Amazon S3 获取原始电子邮件并对其进行处理。

**注意**  
您必须先使用 S3 操作将该电子邮件写入 Amazon S3。
确保 Lambda 函数具有从 S3 存储桶获取对象的 IAM 权限——请参阅此 [AWS re:Post article](https://repost.aws/knowledge-center/lambda-execution-role-s3-bucket) 以获取更多信息。
默认的 Lambda 执行超时时间可能对您的工作流来说太短，考虑增加它们。

```
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; 
const bucketName = '<Your Bucket Name>';

export const handler = async (event, context, callback) => {
    const client = new S3Client();
    console.log('Process email');
  
    var sesNotification = event.Records[0].ses;
    console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));
    console.log("MessageId: " + sesNotification.mail.messageId)
  
    const getObjectCommand = new GetObjectCommand({
        Bucket: bucketName,
        Key: sesNotification.mail.messageId
    });
  
    try {
        const response = await client.send(getObjectCommand);
        const receivedMail = await response.Body.transformToString();
        console.log(receivedMail);
        callback(null, {'disposition':'CONTINUE'})
    } catch (e) {
        // Perform error handling here
        console.log("Encountered S3 client error: "+ e, e.stack);
        callback(null, {'disposition':'STOP_RULE_SET'})
    }
};
```

## 示例 4：DMARC 身份验证失败时的退回邮件
<a name="receiving-email-action-lambda-example-functions-4"></a>

如果传入电子邮件的 DMARC 身份验证失败，此示例将发送退回邮件消息。

**注意**  
在使用此示例时，请将 `emailDomain` 环境变量的值设置为您的电子邮件接收域。
确保 Lambda 函数对发送退回消息的 SES 身份具有 `ses:SendBounce` 权限。

```
import { SESClient, SendBounceCommand } from "@aws-sdk/client-ses";
const sesClient = new SESClient();
// Assign the emailDomain environment variable to a constant.
const emailDomain = process.env.emailDomain;

export const handler = async (event, context, callback) => {
    console.log('Spam filter starting');

    const sesNotification = event.Records[0].ses;
    const messageId = sesNotification.mail.messageId;
    const receipt = sesNotification.receipt;

    console.log('Processing message:', messageId);

    // If DMARC verdict is FAIL and the sending domain's policy is REJECT
    // (p=reject), bounce the email.
    if (receipt.dmarcVerdict.status === 'FAIL' 
        && receipt.dmarcPolicy.status === 'REJECT') {
        // The values that make up the body of the bounce message.
        const sendBounceParams = {
            BounceSender: `mailer-daemon@${emailDomain}`,
            OriginalMessageId: messageId,
            MessageDsn: {
                ReportingMta: `dns; ${emailDomain}`,
                ArrivalDate: new Date(),
                ExtensionFields: [],
            },
            // Include custom text explaining why the email was bounced.
            Explanation: "Unauthenticated email is not accepted due to the sending domain's DMARC policy.",
            BouncedRecipientInfoList: receipt.recipients.map((recipient) => ({
                Recipient: recipient,
                // Bounce with 550 5.6.1 Message content rejected
                BounceType: 'ContentRejected',
            })),
        };

        console.log('Bouncing message with parameters:');
        console.log(JSON.stringify(sendBounceParams, null, 2));
        
        const sendBounceCommand = new SendBounceCommand(sendBounceParams);
        
        // Try to send the bounce. 
        try {
          const response = await sesClient.send(sendBounceCommand);
          console.log(response);
          console.log(`Bounce for message ${messageId} sent, bounce message ID: ${response.MessageId}`);
          // Stop processing additional receipt rules in the rule set.
          callback(null, {disposition: 'STOP_RULE_SET'});
        } catch (e) {
          // If something goes wrong, log the issue.
          console.log(`An error occurred while sending bounce for message: ${messageId}`, e);
          // Perform any additional error handling here
          callback(e)
        }
        
    // If the DMARC verdict is anything else (PASS, QUARANTINE or GRAY), accept
    // the message and process remaining receipt rules in the rule set.
    } else {
        console.log('Accepting message:', messageId);
        callback(null, {disposition: 'CONTINUE'});
    }
};
```

# 交付到 S3 存储桶操作
<a name="receiving-email-action-s3"></a>

**传送到 S3 存储桶**操作会将邮件传送到 S3 存储桶，并且可以选择通过 SNS 等方式向您发送通知。此操作具有以下选项。
+ **S3 存储桶** – 用于保存收到的电子邮件的 S3 存储桶的名称。您也可以在设置操作时通过选择**创建 S3 存储桶**来创建新的 S3 存储桶。Amazon SES 为您提供原始、未经修改的电子邮件，通常是多用途 Internet 邮件扩展（MIME）格式。有关 MIME 格式的更多信息，请参阅 [RFC 2045](https://tools.ietf.org/html/rfc2045)。
**重要**  
Amazon S3 存储桶必须存在于 SES [电子邮件接收](regions.md#region-receive-email) 可用的区域；否则，您必须使用下面介绍的 IAM 角色选项。
当您将电子邮件保存到 S3 存储桶时，默认的最大电子邮件大小（包括标头）为 40 MB。
SES 不支持通过已配置默认保留期的对象锁定启用上传至 S3 存储桶的接收规则。
如果通过指定您自己的 KMS 密钥在 S3 桶上应用加密，请确保使用完全限定的 KMS 密钥 ARN，而不是 KMS 密钥别名；使用别名可能导致以属于请求者而非桶管理员的 KMS 密钥对数据进行加密。请参阅[使用加密进行跨账户操作](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html#bucket-encryption-update-bucket-policy)。
+ **对象键前缀** – 在 S3 存储桶中使用的可选键名称前缀。您可以通过键名称前缀以文件夹结构组织您的 S3 存储桶。例如，如果您使用 *Email* 作为**对象键前缀**，您的电子邮件将显示在 S3 存储桶中名为 *Email* 的文件夹中。
+ **消息加密** – 在将收到的电子邮件发送到 S3 存储桶之前对其进行加密的选项。
+ **KMS 加密密钥** –（如果选择了*消息加密*，则可用。） SES 应在将电子邮件保存到 S3 存储桶之前用于对其进行加密的 AWS KMS 密钥。您可以使用默认的 KMS 密钥或者您在 KMS 中创建的客户自主管理型密钥。
**注意**  
您选择的 KMS 密钥必须与用于接收电子邮件的 SES 端点位于同一 AWS 区域。
  + 要使用默认 KMS 密钥，请在设置接收规则时在 SES 控制台中选择 **aws/ses**。如果使用 SES API，可以通过提供 `arn:aws:kms:REGION:AWSACCOUNTID:alias/aws/ses` 形式的 ARN 指定默认 KMS 密钥。例如，如果您的 AWS 账户 ID 是 123456789012，并且您想要在 us-east-1 区域中使用默认 KMS 密钥，则默认 KMS 密钥的 ARN 为 `arn:aws:kms:us-east-1:123456789012:alias/aws/ses`。如果您使用默认 KMS 密钥，则不需要执行任何其他步骤来为 SES 提供使用它的权限。
  + 要使用在 KMS 中创建的客户自主管理型密钥，请提供 KMS 密钥的 ARN，并确保在密钥策略中添加一条语句，为 SES 提供使用该密钥的权限。有关提供权限的更多信息，请参阅[授予 Amazon SES 电子邮件接收的权限](receiving-email-permissions.md)。

  有关将 KMS 与 SES 结合使用的更多信息，请参阅《[AWS Key Management Service Developer Guide](https://docs.aws.amazon.com/kms/latest/developerguide/services-ses.html)》。如果您未在控制台或 API 中指定 KMS 密钥，则 SES 将不会加密您的电子邮件。
**重要**  
您的邮件将使用 S3 加密客户端通过 SES 进行加密，然后再提交到 S3 进行存储。它并不使用 S3 服务器端加密进行加密。这意味着，在从 S3 中检索电子邮件后，您必须使用 S3 加密客户端解密电子邮件，因为该服务没有使用 KMS 密钥进行解密的访问权限。此加密客户端可在[适用于 Java 的 AWS SDK](https://aws.amazon.com/sdk-for-java/)和[适用于 Ruby 的 AWS SDK](https://aws.amazon.com/sdk-for-ruby/)中获取。有关更多信息，请参阅 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)。
+ **IAM 角色** – SES 用来访问*传送到 S3* 操作（Amazon S3 存储桶、SNS 主题和 KMS 密钥）中的资源的 IAM 角色。如果未提供，则需要明确授予 SES 单独访问每个资源的权限，请参阅[授予 Amazon SES 电子邮件接收的权限](receiving-email-permissions.md)。

  如果您想向一个位于 SES *电子邮件接收*不可用区域的 S3 存储桶写入数据，则您必须使用一个 IAM 角色，该角色要能够将写入 S3 权限策略作为角色的内联策略。您可以直接从控制台应用此操作的权限策略：

  1. 在 **IAM 角色**字段中选择**创建新角色**，然后输入名称，接着选择**创建角色**。（此角色的 IAM 信任策略将在后台自动生成。）

  1. 由于 IAM 信任策略是自动生成的，因此您只需将操作的权限策略添加到角色中 - 选择 **IAM 角色**字段下的**查看角色**即可打开 IAM 控制台。

  1. 在**权限**选项卡下，选择**添加权限**，然后选择**创建内联策略**。

  1. 在**指定权限**页面上，在**策略编辑器**中选择 **JSON**。

  1. 将权限策略从 [适用于 S3 操作的 IAM 角色权限](receiving-email-permissions.md#receiving-email-permissions-s3-iam-role) 复制并粘贴到**策略编辑器**中，然后将红色文本中的数据替换为您自己的数据。（请务必删除编辑器中的所有示例代码。）

  1. 选择**下一步**。

  1. 选择**创建策略**，查看并创建您的 IAM 角色权限策略。

  1. 选择已打开 SES **创建规则** – **添加操作**页面的浏览器选项卡，然后继续执行创建规则的其余步骤。
+ **SNS 主题** – 在电子邮件保存到 S3 存储桶时发出通知的 Amazon SNS 主题的名称或 ARN。SNS 主题 ARN 的示例：*arn:aws:sns:us-east-1:123456789012:MyTopic*。您也可以在设置操作时通过选择**创建 SNS 主题**来创建 SNS 主题。有关 SNS 主题的更多信息，请参阅《[Amazon Simple Notification Service Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)》。
**注意**  
您选择的 SNS 主题必须与用于接收电子邮件的 SNS 端点位于同一 AWS 区域。
仅对与 SES 接收规则关联的 SNS 主题使用*客户自主管理型* KMS 密钥加密，因为您需要编辑 KMS 密钥策略以允许 SES 发布到 SNS。这与 *AWS 管理的* KMS 密钥策略不同，后者按设计不可编辑。

# 发布到 Amazon SNS 主题操作
<a name="receiving-email-action-sns"></a>

**SNS** 操作使用 Amazon SNS 通知发布邮件。该通知包含完整的电子邮件内容。此操作具有以下选项。
+ **SNS Topic (SNS 主题)** – 发布电子邮件的 Amazon SNS 主题的名称或 ARN。Amazon SNS 通知将包含原始、未经修改的电子邮件副本，通常是多用途 Internet 邮件扩展（MIME）格式。有关 MIME 格式的更多信息，请参阅 [RFC 2045](https://tools.ietf.org/html/rfc2045)。
**重要**  
如果您选择通过 Amazon SNS 通知接收您的电子邮件，则最大电子邮件大小（包括标头）为 150KB。大于此大小的电子邮件将被退回。如果您预计电子邮件将大于此大小，请改为将电子邮件保存到 Amazon S3 存储桶。

  Amazon SNS 主题 ARN 的示例如：*arn:aws:sns:us-east-1:123456789012:MyTopic*。您也可以在设置操作时通过选择 **Create SNS Topic**（创建 SNS 主题）来创建 Amazon SNS 主题。有关 Amazon SNS 主题的更多信息，请参阅 [Amazon Simple Notification Service 开发人员指南](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。
**注意**  
您选择的 Amazon SNS 主题必须与用于接收电子邮件的 Amazon SES 端点位于同一 AWS 区域中。
仅对与 SES 接收规则关联的 SNS 主题使用*客户自主管理型* KMS 密钥加密，因为您需要编辑 KMS 密钥策略以允许 SES 发布到 SNS。这与 *AWS 管理的* KMS 密钥策略不同，后者按设计不可编辑。
+ **Encoding (编码)** – Amazon SNS 通知中的电子邮件所使用的编码。UTF-8 更易于使用，但如果邮件使用其他编码格式进行编码，可能不会保留所有特殊字符。Base64 保留所有特殊字符。有关 UTF-8 和 Base64 的信息，请分别参阅 [RFC 3629](https://tools.ietf.org/html/rfc3629) 和 [RFC 4648](https://tools.ietf.org/html/rfc4648)。

在您接收电子邮件时，Amazon SES 将执行活动接收规则集中的规则。您可以使用 Amazon SNS 配置接收规则以向您发送通知。您的接收规则可以发送两种不同类型的通知：
+ **从 SNS 操作发送的通知** – 当您将 [SNS](#receiving-email-action-sns) 操作添加到接收规则时，它将发送有关电子邮件以及电子邮件内容的信息。如果邮件为 150KB 或更小，则此通知类型还包括电子邮件的完整 MIME 正文。
+ **从其他操作类型发送的通知** – 当您将任何其他操作类型（包括[退回邮件](receiving-email-action-bounce.md)、[Lambda](receiving-email-action-lambda.md)、[停止规则集](receiving-email-action-stop.md)或 [WorkMail](receiving-email-action-workmail.md) 操作）添加到接收规则时，可以选择指定 Amazon SNS 主题。如果是这样，您将在执行这些操作时收到通知。这些通知包含有关电子邮件的信息，但不包含电子邮件的内容。

**Topics**
+ [Amazon SES 电子邮件接收通知的内容](receiving-email-notifications-contents.md)
+ [Amazon SES 电子邮件接收通知的示例](receiving-email-notifications-examples.md)

# Amazon SES 电子邮件接收通知的内容
<a name="receiving-email-notifications-contents"></a>

所有接收电子邮件的通知都以对象表示法 (JSON) 格式发布到亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 主题 JavaScript 。

有关示例通知，请参阅 [通知示例](receiving-email-notifications-examples.md)

**Contents**
+ [顶级 JSON 对象](#receiving-email-notifications-contents-top-level-json-object)
+ [接收对象](#receiving-email-notifications-contents-receipt-object)
  + [操作对象](#receiving-email-notifications-contents-action-object)
  + [dkimVerdict 对象](#receiving-email-notifications-contents-dkimverdict-object)
  + [dmarcVerdict 对象](#receiving-email-notifications-contents-dmarcverdict-object)
  + [spamVerdict 对象](#receiving-email-notifications-contents-spamverdict-object)
  + [spfVerdict 对象](#receiving-email-notifications-contents-spfverdict-object)
  + [virusVerdict 对象](#receiving-email-notifications-contents-virusverdict-object)
+ [邮件对象](#receiving-email-notifications-contents-mail-object)
  + [commonHeaders 对象](#receiving-email-notifications-contents-mail-object-commonHeaders)

## 顶级 JSON 对象
<a name="receiving-email-notifications-contents-top-level-json-object"></a>

顶级 JSON 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  notificationType  |  通知类型。对于此通知类型，值始终为 `Received`。  | 
|  [`receipt`](#receiving-email-notifications-contents-receipt-object)  |  包含电子邮件传送信息的对象。  | 
|  [`mail`](#receiving-email-notifications-contents-mail-object)  |  包含与通知关联的电子邮件的相关信息的对象。  | 
|  content  |  包含原始、未修改电子邮件的字符串，通常是多用途 Internet 邮件扩展（MIME）格式。有关 MIME 格式的更多信息，请参阅 [RFC 2045](https://tools.ietf.org/html/rfc2045)。  仅当通知由 SNS 操作触发时才包含此字段。所有其他操作触发的通知不包含此字段。   | 

## 接收对象
<a name="receiving-email-notifications-contents-receipt-object"></a>

`receipt` 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  [`action`](#receiving-email-notifications-contents-action-object)  |  封装已执行操作的信息的对象。有关可能的值的列表，请参阅[操作对象](#receiving-email-notifications-contents-action-object)。  | 
|  [`dkimVerdict`](#receiving-email-notifications-contents-dkimverdict-object)  |  表示 DomainKeys 已识别邮件 (DKIM) 检查是否通过的对象。有关可能的值的列表，请参阅[dkimVerdict 对象](#receiving-email-notifications-contents-dkimverdict-object)。  | 
| dmarcPolicy | 指示发送域的基于域的邮件身份验证、报告和合规性（DMARC）设置。此字段仅当邮件未通过 DMARC 身份验证时出现。 此字段的值可能为：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/receiving-email-notifications-contents.html) | 
| [`dmarcVerdict`](#receiving-email-notifications-contents-dmarcverdict-object) | 用于指示是否已通过基于域的消息身份验证、报告和合规性（DMARC）检查的对象。有关可能的值的列表，请参阅[dmarcVerdict 对象](#receiving-email-notifications-contents-dmarcverdict-object)。 | 
|  processingTimeMillis  |  用于指定从 Amazon SES 收到消息到触发操作所花费的时间（以毫秒为单位）的字符串。  | 
|  recipients  |  符合有效[接收规则](receiving-email-receipt-rules-console-walkthrough.md)的收件人（具体来说，信封 RCPT TO 地址）。此处列出的地址可能不同于 [邮件对象](#receiving-email-notifications-contents-mail-object)中的 `destination` 字段所列出的地址。  | 
|  [`spamVerdict`](#receiving-email-notifications-contents-spamverdict-object)  |  用于指示消息是否为垃圾邮件的对象。有关可能的值的列表，请参阅[spamVerdict 对象](#receiving-email-notifications-contents-spamverdict-object)。  | 
|  [`spfVerdict`](#receiving-email-notifications-contents-spfverdict-object)  |  用于指示是否已通过发件人策略框架（SPF）检查的对象。有关可能的值的列表，请参阅[spfVerdict 对象](#receiving-email-notifications-contents-spfverdict-object)。  | 
|  timestamp  |  用于指定触发操作的限定日期和时间（采用 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 格式）的字符串。  | 
|  [virusVerdict](#receiving-email-notifications-contents-virusverdict-object)  |  用于指示消息是否包含病毒的对象。有关可能的值的列表，请参阅[virusVerdict 对象](#receiving-email-notifications-contents-virusverdict-object)。  | 

### 操作对象
<a name="receiving-email-notifications-contents-action-object"></a>

`action` 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  type  |  用于指示已执行的操作类型的字符串。可能的值包括 `S3`、`SNS`、`Bounce`、`Lambda`、`Stop` 和 `WorkMail`。  | 
|  topicArn  |  包含发布通知的 Amazon SNS 主题的 Amazon Resource Name (ARN) 的字符串。  | 
|  bucketName  |  包含发布消息的 Amazon S3 存储桶名称的字符串。仅 S3 操作类型存在此字段。  | 
|  objectKey  |  包含在 Amazon S3 存储桶中唯一标识电子邮件的名称的字符串。它与 [邮件对象](#receiving-email-notifications-contents-mail-object)中的 `messageId` 相同。仅 S3 操作类型存在此字段。  | 
|  smtpReplyCode  |  包含根据 [RFC 5321](https://tools.ietf.org/html/rfc5321) 定义的 SMTP 回复代码的字符串。仅退回邮件操作类型存在此字段。  | 
|  statusCode  |  包含根据 [RFC 3463](https://tools.ietf.org/html/rfc3463) 定义的 SMTP 增强状态代码的字符串。仅退回邮件操作类型存在此字段。  | 
|  message  |  包含退回邮件信息中所包括的用户可读文本的字符串。仅退回邮件操作类型存在此字段。  | 
|  sender  |  包含退回电子邮件的发件人电子邮件地址的字符串。此为发送退回邮件消息的地址。仅退回邮件操作类型存在此字段。  | 
|  functionArn  |  包含已触发的 Lambda 函数的 ARN 的字符串。仅 Lambda 操作类型存在此字段。  | 
|  invocationType  |  包含 Lambda 函数的调用类型的字符串。可能的值为 `RequestResponse` 和 `Event`。仅 Lambda 操作类型存在此字段。  | 
|  organizationArn  |  包含亚马逊 WorkMail组织的 ARN 的字符串。仅适用于 WorkMail 操作类型。  | 

### dkimVerdict 对象
<a name="receiving-email-notifications-contents-dkimverdict-object"></a>

`dkimVerdict` 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  status  |  包含 DKIM 裁决的字符串。可能的值有： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/receiving-email-notifications-contents.html)  | 

### dmarcVerdict 对象
<a name="receiving-email-notifications-contents-dmarcverdict-object"></a>

`dmarcVerdict` 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  status  |  包含 DMARC 裁决的字符串。可能的值有： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/receiving-email-notifications-contents.html)  | 

### spamVerdict 对象
<a name="receiving-email-notifications-contents-spamverdict-object"></a>

`spamVerdict` 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  status  |  包含垃圾邮件扫描结果的字符串。可能的值有： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/receiving-email-notifications-contents.html)  | 

### spfVerdict 对象
<a name="receiving-email-notifications-contents-spfverdict-object"></a>

`spfVerdict` 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  status  |  包含 SPF 裁决的字符串。可能的值有： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/receiving-email-notifications-contents.html)  | 

### virusVerdict 对象
<a name="receiving-email-notifications-contents-virusverdict-object"></a>

`virusVerdict` 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  status  |  包含病毒扫描结果的字符串。可能的值有： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/receiving-email-notifications-contents.html)  | 

## 邮件对象
<a name="receiving-email-notifications-contents-mail-object"></a>

`mail` 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|   destination  |  传入电子邮件的 MIME 标头中的所有收件人地址（包括 To: (收件人:) 和 CC: (抄送:) 收件人）的完整列表。  | 
|  messageId  |  包含 Amazon SES 分配给该电子邮件的唯一 ID 的字符串。如果电子邮件已送达 Amazon S3，则消息 ID 同时也是用于向 Amazon S3 存储桶写入消息的 Amazon S3 对象键。  | 
|  source  |  包含发送电子邮件的电子邮件地址 (具体来说，信封 MAIL FROM 地址) 的字符串。  | 
|  timestamp  |  包含电子邮件接收时间的字符串， ISO8601 格式为。  | 
|  headers  |  Amazon SES 标头和自定义的标头。每个标头具有以下字段：`name` 和 `value`。  | 
|  [`commonHeaders`](#receiving-email-notifications-contents-mail-object-commonHeaders)  |  所有电子邮件的共有标头。每个标头具有以下字段：`name` 和 `value`。  | 
|  headersTruncated  |  指定通知中的标头是否被截断，如果标头大于 10KB，则会发生截断。可能的值为 `true` 和 `false`。  | 

### commonHeaders 对象
<a name="receiving-email-notifications-contents-mail-object-commonHeaders"></a>

`commonHeaders` 对象可以包含下表中显示的字段。此对象中存在的字段取决于传入电子邮件中存在的字段。


| 字段名称 | 说明 | 
| --- | --- | 
| messageId | 原始邮件的 ID。 | 
| date | Amazon SES 收到此邮件的日期和时间。 | 
| to | 电子邮件的 To 标头。 | 
| cc | 电子邮件的 CC 标头。 | 
| bcc | 电子邮件的 BCC 标头。 | 
| from | 电子邮件的 From 标头。 | 
| sender | 电子邮件的 Sender 标头。 | 
| returnPath | 电子邮件的 Return-Path 标头。 | 
| replyTo | 电子邮件的 Reply-To 标头。 | 
| subject | 电子邮件的 Subject 标头。 | 

# Amazon SES 电子邮件接收通知的示例
<a name="receiving-email-notifications-examples"></a>

本节包括以下类型的通知的示例：
+ [因 SNS 操作而发送的通知。](#receiving-email-notifications-examples-sns-action)
+ [因另一种类型的操作而发送的通知](#receiving-email-notifications-examples-alert)（*警报通知*）。

## SNS 操作的通知
<a name="receiving-email-notifications-examples-sns-action"></a>

本部分包含 SNS 操作通知的示例。与之前显示的警报通知不同，它包括一个包含电子邮件的 `content` 部分，电子邮件通常是多用途 Internet 邮件扩展（MIME）格式。

```
{
  "notificationType":"Received",
  "receipt":{
    "timestamp":"2015-09-11T20:32:33.936Z",
    "processingTimeMillis":222,
    "recipients":[
      "recipient@example.com"
    ],
    "spamVerdict":{
      "status":"PASS"
    },
    "virusVerdict":{
      "status":"PASS"
    },
    "spfVerdict":{
      "status":"PASS"
    },
    "dkimVerdict":{
      "status":"PASS"
    },
    "action":{
      "type":"SNS",
      "topicArn":"arn:aws:sns:us-east-1:012345678912:example-topic"
    }
  },
  "mail":{
    "timestamp":"2015-09-11T20:32:33.936Z",
    "source":"61967230-7A45-4A9D-BEC9-87CBCF2211C9@example.com",
    "messageId":"d6iitobk75ur44p8kdnnp7g2n800",
    "destination":[
      "recipient@example.com"
    ],
    "headersTruncated":false,
    "headers":[
      {
        "name":"Return-Path",
        "value":"<0000014fbe1c09cf-7cb9f704-7531-4e53-89a1-5fa9744f5eb6-000000@amazonses.com>"
      },
      {
        "name":"Received",
        "value":"from a9-183.smtp-out.amazonses.com (a9-183.smtp-out.amazonses.com [54.240.9.183]) by inbound-smtp.us-east-1.amazonaws.com with SMTP id d6iitobk75ur44p8kdnnp7g2n800 for recipient@example.com; Fri, 11 Sep 2015 20:32:33 +0000 (UTC)"
      },
      {
        "name":"DKIM-Signature",
        "value":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=ug7nbtf4gccmlpwj322ax3p6ow6yfsug; d=amazonses.com; t=1442003552; h=From:To:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Date:Message-ID:Feedback-ID; bh=DWr3IOmYWoXCA9ARqGC/UaODfghffiwFNRIb2Mckyt4=; b=p4ukUDSFqhqiub+zPR0DW1kp7oJZakrzupr6LBe6sUuvqpBkig56UzUwc29rFbJF hlX3Ov7DeYVNoN38stqwsF8ivcajXpQsXRC1cW9z8x875J041rClAjV7EGbLmudVpPX 4hHst1XPyX5wmgdHIhmUuh8oZKpVqGi6bHGzzf7g="
      },
      {
        "name":"From",
        "value":"sender@example.com"
      },
      {
        "name":"To",
        "value":"recipient@example.com"
      },
      {
        "name":"Subject",
        "value":"Example subject"
      },
      {
        "name":"MIME-Version",
        "value":"1.0"
      },
      {
        "name":"Content-Type",
        "value":"text/plain; charset=UTF-8"
      },
      {
        "name":"Content-Transfer-Encoding",
        "value":"7bit"
      },
      {
        "name":"Date",
        "value":"Fri, 11 Sep 2015 20:32:32 +0000"
      },
      {
        "name":"Message-ID",
        "value":"<61967230-7A45-4A9D-BEC9-87CBCF2211C9@example.com>"
      },
      {
        "name":"X-SES-Outgoing",
        "value":"2015.09.11-54.240.9.183"
      },
      {
        "name":"Feedback-ID",
        "value":"1.us-east-1.Krv2FKpFdWV+KUYw3Qd6wcpPJ4Sv/pOPpEPSHn2u2o4=:AmazonSES"
      }
    ],
    "commonHeaders":{
      "returnPath":"0000014fbe1c09cf-7cb9f704-7531-4e53-89a1-5fa9744f5eb6-000000@amazonses.com",
      "from":[
        "sender@example.com"
      ],
      "date":"Fri, 11 Sep 2015 20:32:32 +0000",
      "to":[
        "recipient@example.com"
      ],
      "messageId":"<61967230-7A45-4A9D-BEC9-87CBCF2211C9@example.com>",
      "subject":"Example subject"
    }
  },
  "content":"Return-Path: <61967230-7A45-4A9D-BEC9-87CBCF2211C9@example.com>\r\nReceived: from a9-183.smtp-out.amazonses.com (a9-183.smtp-out.amazonses.com [54.240.9.183])\r\n by inbound-smtp.us-east-1.amazonaws.com with SMTP id d6iitobk75ur44p8kdnnp7g2n800\r\n for recipient@example.com;\r\n Fri, 11 Sep 2015 20:32:33 +0000 (UTC)\r\nDKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;\r\n\ts=ug7nbtf4gccmlpwj322ax3p6ow6yfsug; d=amazonses.com; t=1442003552;\r\n\th=From:To:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Date:Message-ID:Feedback-ID;\r\n\tbh=DWr3IOmYWoXCA9ARqGC/UaODfghffiwFNRIb2Mckyt4=;\r\n\tb=p4ukUDSFqhqiub+zPR0DW1kp7oJZakrzupr6LBe6sUuvqpBkig56UzUwc29rFbJF\r\n\thlX3Ov7DeYVNoN38stqwsF8ivcajXpQsXRC1cW9z8x875J041rClAjV7EGbLmudVpPX\r\n\t4hHst1XPyX5wmgdHIhmUuh8oZKpVqGi6bHGzzf7g=\r\nFrom: sender@example.com\r\nTo: recipient@example.com\r\nSubject: Example subject\r\nMIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding: 7bit\r\nDate: Fri, 11 Sep 2015 20:32:32 +0000\r\nMessage-ID: <61967230-7A45-4A9D-BEC9-87CBCF2211C9@example.com>\r\nX-SES-Outgoing: 2015.09.11-54.240.9.183\r\nFeedback-ID: 1.us-east-1.Krv2FKpFdWV+KUYw3Qd6wcpPJ4Sv/pOPpEPSHn2u2o4=:AmazonSES\r\n\r\nExample content\r\n"
}
```

## 警报通知
<a name="receiving-email-notifications-examples-alert"></a>

本部分包含可由 S3 操作触发的 Amazon SNS 通知的示例。Lambda 操作、退回邮件操作、停止操作和 WorkMail 操作触发的通知非常相似。虽然通知包含有关电子邮件的信息，但它不包含电子邮件内容本身。

```
{
     "notificationType": "Received",
	   "receipt": {
	     "timestamp": "2015-09-11T20:32:33.936Z",
	     "processingTimeMillis": 406,
	     "recipients": [
	       "recipient@example.com"
	     ],
	     "spamVerdict": {
	       "status": "PASS"
	     },
	     "virusVerdict": {
	       "status": "PASS"
	     },
	     "spfVerdict": {
	       "status": "PASS"
	     },
	     "dkimVerdict": {
	       "status": "PASS"
	     },
	     "action": {
	       "type": "S3",
	       "topicArn": "arn:aws:sns:us-east-1:012345678912:example-topic",
	       "bucketName": "my-S3-bucket",
	       "objectKey": "\email"
	     }
	   },
	   "mail": {
	     "timestamp": "2015-09-11T20:32:33.936Z",
	     "source": "0000014fbe1c09cf-7cb9f704-7531-4e53-89a1-5fa9744f5eb6-000000@amazonses.com",
	     "messageId": "d6iitobk75ur44p8kdnnp7g2n800",
	     "destination": [
	       "recipient@example.com"
	     ],
	     "headersTruncated": false,
	     "headers": [
	       {
	         "name": "Return-Path",
	         "value": "<0000014fbe1c09cf-7cb9f704-7531-4e53-89a1-5fa9744f5eb6-000000@amazonses.com>"
	       },
	       {
	         "name": "Received",
	         "value": "from a9-183.smtp-out.amazonses.com (a9-183.smtp-out.amazonses.com [54.240.9.183]) by inbound-smtp.us-east-1.amazonaws.com with SMTP id d6iitobk75ur44p8kdnnp7g2n800 for recipient@example.com; Fri, 11 Sep 2015 20:32:33 +0000 (UTC)"
	       },
	       {
	         "name": "DKIM-Signature",
	         "value": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=ug7nbtf4gccmlpwj322ax3p6ow6yfsug; d=amazonses.com; t=1442003552; h=From:To:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Date:Message-ID:Feedback-ID; bh=DWr3IOmYWoXCA9ARqGC/UaODfghffiwFNRIb2Mckyt4=; b=p4ukUDSFqhqiub+zPR0DW1kp7oJZakrzupr6LBe6sUuvqpBkig56UzUwc29rFbJF hlX3Ov7DeYVNoN38stqwsF8ivcajXpQsXRC1cW9z8x875J041rClAjV7EGbLmudVpPX 4hHst1XPyX5wmgdHIhmUuh8oZKpVqGi6bHGzzf7g="
	       },
	       {
	         "name": "From",
	         "value": "sender@example.com"
	       },
	       {
	         "name": "To",
	         "value": "recipient@example.com"
	       },
	       {
	         "name": "Subject",
	         "value": "Example subject"
	       },
	       {
	         "name": "MIME-Version",
	         "value": "1.0"
	       },
	       {
	         "name": "Content-Type",
	         "value": "text/plain; charset=UTF-8"
	       },
	       {
	         "name": "Content-Transfer-Encoding",
	         "value": "7bit"
	       },
	       {
	         "name": "Date",
	         "value": "Fri, 11 Sep 2015 20:32:32 +0000"
	       },
	       {
	         "name": "Message-ID",
	         "value": "<61967230-7A45-4A9D-BEC9-87CBCF2211C9@example.com>"
	       },
	       {
	         "name": "X-SES-Outgoing",
	         "value": "2015.09.11-54.240.9.183"
	       },
	       {
	         "name": "Feedback-ID",
	         "value": "1.us-east-1.Krv2FKpFdWV+KUYw3Qd6wcpPJ4Sv/pOPpEPSHn2u2o4=:AmazonSES"
	       }
	     ],
	     "commonHeaders": {
	       "returnPath": "0000014fbe1c09cf-7cb9f704-7531-4e53-89a1-5fa9744f5eb6-000000@amazonses.com",
	       "from": [
	         "sender@example.com"
	       ],
	       "date": "Fri, 11 Sep 2015 20:32:32 +0000",
	       "to": [
	         "recipient@example.com"
	       ],
	       "messageId": "<61967230-7A45-4A9D-BEC9-87CBCF2211C9@example.com>",
	       "subject": "Example subject"
	     }
	   }
	 }
```

# 停止规则集操作
<a name="receiving-email-action-stop"></a>

**Stop (停止)** 操作终止对接收规则集的评估，并会通过 Amazon SNS 通知您（可选）。此操作具有以下选项。
+ **SNS Topic (SNS 主题)** – 在停止操作执行完毕时发出通知的 Amazon SNS 主题的名称或 ARN。Amazon SNS 主题 ARN 的示例如：*arn:aws:sns:us-east-1:123456789012:MyTopic*。您也可以在设置操作时通过选择 **Create SNS Topic**（创建 SNS 主题）来创建 Amazon SNS 主题。有关 Amazon SNS 主题的更多信息，请参阅 [Amazon Simple Notification Service 开发人员指南](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。
**注意**  
您选择的 Amazon SNS 主题必须与用于接收电子邮件的 Amazon SES 端点位于同一 AWS 区域中。

# 集成 Amazon WorkMail 操作
<a name="receiving-email-action-workmail"></a>

**WorkMail** 操作集成在 Amazon WorkMail 中。如果 Amazon WorkMail 执行您的所有电子邮件处理，您通常不会直接使用此操作，因为 Amazon WorkMail 会负责进行设置。此操作具有以下选项。
+ **Organization ARN (组织 ARN)** – Amazon WorkMail 组织的 ARN。Amazon WorkMail 组织 ARN 的形式是 `arn:aws:workmail:region:account_ID:organization/organization_ID`，其中：
  + `region` 是您正在其中使用 Amazon SES 和 Amazon WorkMail 的区域。(您必须从同一区域使用它们。) 例如，us-east-1。
  + `account_ID` 是 AWS 账户 ID。您可以在 AWS 管理控制台的[账户](https://console.aws.amazon.com/billing/home?#/account)页面查看 AWS 账户 ID。
  + `organization_ID` 是在您创建组织时由 Amazon WorkMail 生成的唯一标识符。您可以在 Amazon WorkMail 控制台中组织的 Organization Settings (组织设置) 页面中找到组织 ID。

  完整的 Amazon WorkMail 组织 ARN 示例：*arn:aws:workmail:us-east-1:123456789012:organization/m-68755160c4cb4e29a2b2f8fb58f359d7*。有关 Amazon WorkMail 组织的信息，请参阅 [Amazon WorkMail 管理员指南](https://docs.aws.amazon.com/workmail/latest/adminguide/organizations_overview.html)。
+ **SNS Topic (SNS 主题)** – 在执行 Amazon WorkMail 操作后发出通知的 Amazon SNS 主题的名称或 ARN。Amazon SNS 主题 ARN 的示例如：*arn:aws:sns:us-east-1:123456789012:MyTopic*。您也可以在设置操作时通过选择 **Create SNS Topic**（创建 SNS 主题）来创建 Amazon SNS 主题。有关 Amazon SNS 主题的更多信息，请参阅 [Amazon Simple Notification Service 开发人员指南](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。
**注意**  
您选择的 Amazon SNS 主题必须与用于接收电子邮件的 Amazon SES 端点位于同一 AWS 区域中。

**注意**  
Amazon SES 仅支持在 WorkMail 可用的区域中执行 WorkMail 操作。请参阅 AWS 一般参考中的 [Amazon WorkMail 端点和限额](https://docs.aws.amazon.com/general/latest/gr/workmail.html)。

# 创建 IP 地址筛选条件控制台演练
<a name="receiving-email-ip-filtering-console-walkthrough"></a>

本节将指导您使用 Amazon SES 控制台设置 IP 地址筛选条件。IP 地址筛选条件允许您提供广泛的控制级别。这些 IP 筛选条件允许您显式阻止或允许来自特定 IP 地址或 IP 地址范围的所有邮件。

或者，您可以使用 `CreateReceiptFilter` API 创建一个 IP 地址筛选条件，如 [Amazon Simple Email Service API 参考](https://docs.aws.amazon.com/ses/latest/APIReference/API_CreateReceiptFilter.html)中所述。

**注意**  
如果您只希望接收来自有限已知 IP 地址列表的邮件，则请设置包含 `0.0.0.0/0` 的阻止列表，并设置包含所信任 IP 地址的允许列表。原定设置情况下，此配置会阻止全部 IP 地址，并仅允许来自您显式指定的 IP 地址的邮件。

## 先决条件
<a name="ip-filtering-prerequisites"></a>

在继续使用 IP 地址筛选条件设置基于收件人的电子邮件控制之前，必须满足以下先决条件：

1. 首先需要在 Amazon SES 中[创建并验证域身份](verify-addresses-and-domains.md)。

1. 接下来，您需要通过[将 MX 记录发布](receiving-email-mx-record.md)域的 DNS 设置来指定哪些邮件服务器可以接收域的邮件。（MX 记录应指接收您使用 Amazon SES 所在 AWS 地区的邮件的 Amazon SES 终端节点。）

## 创建 IP 地址筛选器
<a name="receipt-rules-create-ip-filters"></a>

**使用控制台创建 IP 地址筛选器**

1. 登录 AWS 管理控制台 并打开 Amazon SES 控制台，网址为[https://console.aws.amazon.com/ses/](https://console.aws.amazon.com/ses/)。

1. 在左侧导航窗格中，选择**电子邮件接收**。

1. 选择 **IP 地址筛选条件**选项卡。

1. 选择 **Create Filter**。

1. 输入筛选条件的唯一名称，该字段的图例将指示语法要求。（该名称必须少于 64 个字符，且只能包含字母数字、连字符 (-)、下划线 (\$1) 和句点 (.) 字符。名称必须以字母或数字开头和结尾。）

1. 输入 IP 地址或 IP 地址范围，该字段的图例将给出无类域间路由 (CIDR) 语法指定的示例。（单个 IP 地址如：10.0.0.1。IP 地址范围如 10.0.0.1/24。有关 CIDR 表示法的详细信息，请参阅 [RFC 2317](https://tools.ietf.org/html/rfc2317)。）

1. 选择**阻止**或**允许**单选按钮来选择**策略类型**。

1. 选择**创建筛选条件**。

1. 如果要添加另一个 IP 筛选条件，请选择**创建筛选条件**，然后对要添加的每个额外筛选条件重复前面的步骤。

1. 如果要删除 IP 地址筛选条件，请选择该筛选条件，然后选择**删除**按钮。