

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

# 为 Amazon SES 配置 Amazon SNS 通知
<a name="notification-contents"></a>

退货、投诉和送达通知以 JavaScript 对象表示法 (JSON) 格式发布到[亚马逊简单通知服务 (Amazon SNS) Simple Notification S](https://aws.amazon.com/sns) ervice 主题。顶级 JSON 对象包含一个 `notificationType` 字符串，一个 `mail` 对象，以及一个 `bounce` 对象、`complaint` 对象或 `delivery` 对象。

有关不同类型对象的描述，请参阅以下部分：
+ [Top-level JSON 对象](#top-level-json-object)
+ [`mail` 对象](#mail-object)
+ [`bounce` 对象](#bounce-object)
+ [`complaint` 对象](#complaint-object)
+ [`delivery` 对象](#delivery-object)

以下是有关 Amazon SES 的 Amazon SNS 通知内容的一些重要说明：
+ 对于给定的通知类型，您可能会收到针对多个收件人的 Amazon SNS 通知，或者可能会收到针对每个收件人的 Amazon SNS 通知。您的代码应能够解析 Amazon SNS 通知并处理这两种情况；SES 不保证对通过 Amazon SNS 发送的通知进行排序或批处理。但是，不同的 Amazon SNS 通知类型（例如，退回邮件和投诉）不会合并为一个通知。
+ 您可能会针对一个收件人收到多个类型的 Amazon SNS 通知。例如，接收邮件服务器可能接受电子邮件（触发送达通知），但在处理电子邮件后，接收邮件服务器可能会确定该电子邮件实际导致了退回邮件（触发退回邮件通知）。不过，这些通知始终单独发送，因为它们属于不同的类型。
+ SES 保留在通知中添加其他字段的权利。同样地，解析这些通知的应用程序必须足够灵活以处理未知字段。
+ SES 在发送电子邮件时会覆盖邮件标头。您可以通过 `mail` 对象的 `headers` 和 `commonHeaders` 字段检索原始邮件的标头。

## Top-Level JSON 对象
<a name="top-level-json-object"></a>

SES 通知中的顶级 JSON 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
| notificationType | 一个字符串，包含由 JSON 对象表示的通知类型。可能的值为 `Bounce`、`Complaint` 或 `Delivery`。<br />如果你[设置事件发布](monitor-sending-using-event-publishing-setup.md)，此字段命名为 `eventType`。 | 
| mail | 一个 JSON 对象，包含有关通知所属的原始邮件的信息。有关更多信息，请参阅 [邮件对象](#mail-object)。 | 
| bounce | 此字段仅在 `notificationType` 为 `Bounce`，且包含的 JSON 对象保存有关退回邮件的信息时显示。有关更多信息，请参阅 [退回邮件对象](#bounce-object)。 | 
| complaint | 此字段仅在 `notificationType` 为 `Complaint`，且包含的 JSON 对象保存有关投诉的信息时显示。有关更多信息，请参阅 [投诉对象](#complaint-object)。 | 
| delivery | 此字段仅在 `notificationType` 为 `Delivery`，且包含的 JSON 对象保存有关送达的信息时显示。有关更多信息，请参阅 [送达对象](#delivery-object)。 | 

## 邮件对象
<a name="mail-object"></a>

每个退回邮件、投诉或送达通知均在 `mail` 对象中包含有关原始电子邮件的信息。包含有关 `mail` 对象的信息的 JSON 对象具有以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  timestamp  | 原始邮件的发送时间（采用 ISO8601 格式）。 | 
|  messageId  | SES 分配给电子邮件的唯一 ID。SES 在您发送邮件时已向您返回此值。 此邮件 ID 已由 SES 分配。您可以在 `mail` 对象的 `headers` 字段中找到原始电子邮件的邮件 ID。  | 
|  source  | 发送原始电子邮件的电子邮件地址（信封 MAIL FROM 地址）。 | 
|  sourceArn  | 已用于发送电子邮件的身份的 Amazon Resource Name（ARN）。在发送授权的情况下，`sourceArn` 是身份拥有者授权委托发件人用于发送电子邮件的身份的 ARN。有关发送授权的更多信息，请参阅[电子邮件身份验证方法使用发送授权](sending-authorization.md)。 | 
|  sourceIp  | 已执行到 SES 的电子邮件发送请求的客户端的原始公有 IP 地址。 | 
|  sendingAccountId  | 用于发送电子邮件的账户的 AWS 账户 ID。在发送授权的情况下，`sendingAccountId` 是委托发件人的账户 ID。 | 
|  callerIdentity  | 发送电子邮件的 SES 用户的 IAM 身份。 | 
|  destination  | 作为原始邮件的收件人的电子邮件地址的列表。 | 
|  headersTruncated  | 仅当您将通知设置配置为包括原始电子邮件中的标头时，此对象才存在。<br />指示通知中的标头是否截断。当原始邮件中的标头大小为 10 KB 或更大时，SES 会在截断通知中的标头。可能的值为 `true` 和 `false`。 | 
|  headers  | 仅当您将通知设置配置为包括原始电子邮件中的标头时，此对象才存在。<br />电子邮件的原始标头的列表。列表中的每个标头均有一个 `name` 字段和一个 `value` 字段。 `headers` 对象内的任何邮件 ID 均来自您传递至 SES 的原始邮件。SES 随后分配给电子邮件的邮件 ID 位于 `messageId` 对象的 `mail` 字段中。  | 
|  commonHeaders  | 仅当您将通知设置配置为包括原始电子邮件中的标头时，此对象才存在。<br />包括有关原始电子邮件中的常用电子邮件标头的信息，包括“发件人”、“收件人”和“主题”字段。在此对象中，每个标头是一个键。“发件人”和“收件人”字段由可包含多个值的数组表示。 对于事件，`commonHeaders` 字段中的任何邮件 ID 是 Amazon SES 随后在邮件对象的 `messageId` 字段中分配给邮件的邮件 ID。通知将包含原始电子邮件的邮件 ID。  | 

下面是包含原始电子邮件标头的 `mail` 对象的示例。当此通知类型未配置为包含原始电子邮件标头时，`mail` 对象不会包含 `headersTruncated`、`headers` 和 `commonHeaders` 字段。

```
{
   "timestamp":"2018-10-08T14:05:45 +0000",
   "messageId":"000001378603177f-7a5433e7-8edb-42ae-af10-f0181f34d6ee-000000",
   "source":"sender@example.com",
   "sourceArn": "arn:aws:ses:us-east-1:888888888888:identity/example.com",
   "sourceIp": "127.0.3.0",
   "sendingAccountId":"123456789012",
   "destination":[
      "recipient@example.com"
   ],
   "headersTruncated":false,
   "headers":[ 
      { 
         "name":"From",
         "value":"\"Sender Name\" <sender@example.com>"
      },
      { 
         "name":"To",
         "value":"\"Recipient Name\" <recipient@example.com>"
      },
      { 
         "name":"Message-ID",
         "value":"custom-message-ID"
      },
      { 
         "name":"Subject",
         "value":"Hello"
      },
      { 
         "name":"Content-Type",
         "value":"text/plain; charset=\"UTF-8\""
      },
      { 
         "name":"Content-Transfer-Encoding",
         "value":"base64"
      },
      { 
         "name":"Date",
         "value":"Mon, 08 Oct 2018 14:05:45 +0000"
      }
   ],
   "commonHeaders":{ 
      "from":[ 
         "Sender Name <sender@example.com>"
      ],
      "date":"Mon, 08 Oct 2018 14:05:45 +0000",
      "to":[ 
         "Recipient Name <recipient@example.com>"
      ],
      "messageId":" custom-message-ID",
      "subject":"Message sent using SES"
   }
}
```

## 退回邮件对象
<a name="bounce-object"></a>

包含有关退回邮件的信息的 JSON 对象具有以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  bounceType  | 退回邮件的类型 (由 SES 确定)。有关更多信息，请参阅 [退信类型](#bounce-types)。 | 
|  bounceSubType  | 退回邮件的子类型 (由 SES 确定)。有关更多信息，请参阅 [退信类型](#bounce-types)。 | 
|  bouncedRecipients  | 包含已退回的原始邮件收件人相关信息的列表。有关更多信息，请参阅 [退信的收件人](#bounced-recipients)。 | 
|  timestamp  | 退回邮件的发送日期和时间（采用 ISO8601 格式）。请注意，这是 ISP 发送通知的时间，而不是 SES 接收通知的时间。 | 
|  feedbackId  | 退信的唯一 ID。 | 

如果 SES 已能够联系远程 Message Transfer Authority（MTA），则以下字段也将存在。


| 字段名称 | 说明 | 
| --- | --- | 
|  remoteMtaIp  | SES 尝试将电子邮件传输到的 MTA 的 IP 地址。 | 

如果退回邮件已附加传输状态通知（DSN），则以下字段也可能存在。


| 字段名称 | 说明 | 
| --- | --- | 
|  reportingMTA  | DSN 中的 `Reporting-MTA` 字段的值。这是尝试执行 DSN 所述的传输、中继或网关操作的 MTA 的值。 | 

以下是 `bounce` 对象的示例。

```
{
   "bounceType":"Permanent",
   "bounceSubType": "General",
   "bouncedRecipients":[
      {
         "status":"5.0.0",
         "action":"failed",
         "diagnosticCode":"smtp; 550 user unknown",
         "emailAddress":"recipient1@example.com"
      },
      {
         "status":"4.0.0",
         "action":"delayed",
         "emailAddress":"recipient2@example.com"
      }
   ],
   "reportingMTA": "example.com",
   "timestamp":"2012-05-25T14:59:38.605Z",
   "feedbackId":"000001378603176d-5a4b5ad9-6f30-4198-a8c3-b1eb0c270a1d-000000",
   "remoteMtaIp":"127.0.2.0"
}
```

### 退信的收件人
<a name="bounced-recipients"></a>

退回邮件通知可能与一个或多个收件人有关。`bouncedRecipients` 字段包含对象列表（与退回邮件通知相关的每个收件人均有一个对象）而且始终包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  emailAddress  | 收件人的电子邮件地址。如果 DSN 可用，这将是 DSN 中的 `Final-Recipient` 字段的值。 | 

（可选）如果 DSN 已附加到退信，则以下字段也可能存在。


| 字段名称 | 说明 | 
| --- | --- | 
|  action  | DSN 中的 `Action` 字段的值。这表示在尝试将邮件传送给该 Reporting-MTA 收件人后所执行的操作。 | 
|  status  | DSN 中的 `Status` 字段的值。这是每个收件人与传输无关的状态代码，用于指示邮件的传输状态。 | 
|  diagnosticCode  | 报告 MTA 发放的状态代码。这是 DSN 中的 `Diagnostic-Code` 字段的值。此字段可能不在 DSN 中（因此也不在 JSON 中）。 | 

以下是可能位于 `bouncedRecipients` 列表中的对象的示例。

```
{
    "emailAddress": "recipient@example.com",
    "action": "failed",
    "status": "5.0.0",
    "diagnosticCode": "X-Postfix; unknown user"
}
```

### 退信类型
<a name="bounce-types"></a>

退回对象包含 `Undetermined`、`Permanent`*（硬）*或 `Transient`*（软）*的退回类型。`Permanent`*（硬）*和 `Transient`*（软）*退回类型也可以包含几种退回子类型之一。

当您收到退回邮件类型为 `Transient`*（软）*的退回邮件通知时，如果解决了导致退回邮件的问题，您也许可在以后将邮件发送给该收件人。

当您收到退回类型为 `Permanent`*（硬）*的退回通知时，您将来不太可能能够向该收件人发送电子邮件。因此，您应该立即从邮件列表中删除其地址造成了退回邮件的收件人。

**注意**  
出现*软退信* (与临时问题相关的退回邮件，例如收件人的收件箱已满) 时，SES 尝试在一定时间之后传送该电子邮件。在该段时间结束时，如果 SES 仍无法传送电子邮件，则会停止尝试。  
SES 为硬退信以及停止尝试传送的软退信提供通知。如果您希望在每次发生软退信时收到通知，请[启用事件推送](monitor-sending-using-event-publishing-setup.md)并将其配置为出现送达延迟事件时发送通知。


| bounceType | 反弹 SubType | 说明 | 
| --- | --- | --- | 
|  Undetermined  |  Undetermined  | 收件人的电子邮件提供商发送退回邮件消息。退回邮件中未包含足够的消息供 SES 确定退回邮件的原因。退回电子邮件发送到导致退回的电子邮件 Return-Path 标题中的地址，其中可能包含有关导致电子邮件退回的问题的其他信息。 | 
|  Permanent  |  General  | 收件人的电子邮件提供商发送了硬退信。 收到此类退回邮件通知时，您应立即从邮件列表中删除该收件人的电子邮件地址。将邮件发送到造成硬退回邮件的地址会对您作为发件人的声誉造成负面影响。如果您继续将电子邮件发送到造成硬退回邮件的地址，我们可能会暂停您发送更多电子邮件的功能。请参阅[使用 Amazon SES 账户级黑名单](sending-email-suppression-list.md)。  | 
|  Permanent  |  NoEmail  | 无法从退回邮件中检索收件人的电子邮件地址。 | 
|  Permanent  |  Suppressed  | 由于收件人的电子邮件地址近期有造成硬退信的历史记录，因此该地址已进入 SES 黑名单。要覆盖全局黑名单，请参阅 [使用 Amazon SES 账户级黑名单](sending-email-suppression-list.md)。 | 
|  Permanent  |  OnAccountSuppressionList  | SES 已禁止发送到此地址，因为该地址已被加入[账户级黑名单](sending-email-suppression-list.md)。这不计入您的跳出率指标。 | 
|  Permanent  |  UnsubscribedRecipient  | 当收件人联系人已从主题退订并使用[列表管理选项](sending-email-list-management.md#configuring-list-management-list-contacts)向他们发送邮件时，会发生此退回类型。SES 尊重联系人偏好，并不尝试投递。此外，此退回不会影响发件人声誉，因为未尝试投递，并且收件人联系人也不会因退回而被添加到黑名单。 建议您订阅 UnsubscribedRecipient 活动，以免继续向未订阅的收件人发送活动。考虑一下 [使用列表管理](sending-email-list-management.md)。列表管理应该是您订阅用户列表的真实来源。从 SES 执行的角度来看，如果您继续向被禁用或已退订的收件人发送邮件，您将拥有不遵守电子邮件发送最佳实践的声誉。  | 
|  Permanent  |  EmailValidationSuppressed  | SES 已禁止向该地址发送邮件，因为该地址不符合您的[电子邮件验证设置](email-validation-auto.md)的阈值。 | 
|  Transient  |  General  | 收件人的电子邮件提供商发送一般退回邮件消息。如果解决了导致邮件退回邮件的问题，您也许可在以后将邮件发送给相同的收件人。 如果您将电子邮件发送到激活了自动回复规则（例如“外出”邮件） 的收件人，则可能收到这种类型的通知。即使回复中具有 `Bounce` 类型的通知，SES 在计算账户的邮件退回率时，不会计入自动回复。  | 
|  Transient  |  MailboxFull  | 由于收件人的收件箱已满，收件人的电子邮件提供商发送退回邮件。以后当收件人的邮箱有空闲空间时，您可能可以向相同的收件人发送电子邮件。 | 
|  Transient  |  MessageTooLarge  | 由于您发送的邮件太大，收件人的电子邮件提供商发送退回邮件。如果您减小邮件的大小，则也许能够向相同的收件人发送邮件。 | 
|  Transient  |  ContentRejected  | 由于您发送的内容包含收件人电子邮件提供商不允许的内容，该提供商发送了退回邮件。如果您更改邮件的内容，则也许能够向相同的收件人发送电子邮件。 | 
|  Transient  |  AttachmentRejected  | 由于邮件包含不可接受的附件，收件人的电子邮件提供商发送了退回邮件。例如，一些电子邮件提供商可能会拒绝具有特定文件类型附件的电子邮件，或者具有超大附件的电子邮件。如果您删除附件或更改其内容，则也许能够向相同的收件人发送电子邮件。 | 

## 投诉对象
<a name="complaint-object"></a>

包含有关投诉的信息的 JSON 对象具有以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  complainedRecipients  | 包含提起投诉的收件人相关信息的列表。有关更多信息，请参阅 [已投诉的收件人](#complained-recipients)。 | 
|  timestamp  | ISP 发送投诉通知时的日期和时间，采用 ISO8601 格式。此字段中的日期和时间可能与 SES 收到通知时的日期和时间不同。 | 
|  feedbackId  | 与投诉关联的唯一 ID。 | 
|  complaintSubType  | `complaintSubType` 字段的值可以为 null 或 `OnAccountSuppressionList`。如果该值为 `OnAccountSuppressionList`，则表示 SES 已接受邮件，但未尝试发送邮件，因为该地址已被加入[账户级黑名单](sending-email-suppression-list.md)。 | 

此外，如果反馈报告已附加到投诉，则以下字段也可能存在。


| 字段名称 | 说明 | 
| --- | --- | 
|  userAgent  | 反馈报告中的 `User-Agent` 字段的值。此值表示生成了报告的系统的名称和版本。 | 
|  complaintFeedbackType  | 从 ISP 收到的反馈报告中的 `Feedback-Type` 字段的值。此值包含反馈的类型。 | 
|  arrivalDate  | 反馈报告中的 `Arrival-Date` 或 `Received-Date` 字段的值（采用 ISO8601 格式）。此字段可能不在报告中（因此也不在 JSON 中）。 | 

以下是 `complaint` 对象的示例。

```
{
   "userAgent":"ExampleCorp Feedback Loop (V0.01)",
   "complainedRecipients":[
      {
         "emailAddress":"recipient1@example.com"
      }
   ],
   "complaintFeedbackType":"abuse",
   "arrivalDate":"2009-12-03T04:24:21.000-05:00",
   "timestamp":"2012-05-25T14:59:38.623Z",
   "feedbackId":"000001378603177f-18c07c78-fa81-4a58-9dd1-fedc3cb8f49a-000000"
}
```

### 已投诉的收件人
<a name="complained-recipients"></a>

`complainedRecipients` 字段包含可能已提交投诉的收件人的列表。您应使用此信息来确定哪位收件人提交了投诉，然后立即从您的邮件列表中删除该收件人。

**重要**  
大部分 ISP 会删除从其投诉通知中提交了投诉的收件人的电子邮件地址。因此，此列表包含可能发送了投诉的收件人的信息，这基于原始邮件的收件人以及我们收到投诉的 ISP。SES 对原始邮件执行查找以确定此收件人列表。

此列表中的 JSON 对象包含以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  emailAddress  | 收件人的电子邮件地址。 | 

以下是已投诉收件人对象的示例。

```
{ "emailAddress": "recipient1@example.com" }
```

**注意**  
由于此行为，如果限制为向每个收件人发送一封电子邮件（而不是向“密件抄送”行中的 30 个不同的电子邮件地址发送同一封电子邮件），您可以更加确定地知道哪个地址投诉了您的邮件。

#### 投诉类型
<a name="complaint-types"></a>

根据`complaintFeedbackType`互联网编号分配机构网站[，您可在由报告 ISP 分配的 ](http://www.iana.org/assignments/marf-parameters/marf-parameters.xml#marf-parameters-2) 字段中看到以下投诉类型：
+ `abuse`：指示不请自来的电子邮件或某种其他类型的垃圾邮件。
+ `auth-failure`：电子邮件身份验证失败报告。
+ `fraud`：指示某种欺诈或网络钓鱼活动。
+ `not-spam`：指示提供报告的实体不将邮件视为垃圾邮件。这可用于更正被错误地标记或分类为垃圾邮件的邮件。
+ `other`：指示不适合其他已注册类型的任何其他反馈。
+ `virus`：报告在原始邮件中发现病毒。

## 送达对象
<a name="delivery-object"></a>

包含送达情况相关信息的 JSON 对象始终具有以下字段。


| 字段名称 | 说明 | 
| --- | --- | 
|  timestamp  | SES 将电子邮件传输至收件人的邮件服务器的时间 (采用 ISO8601 格式)。 | 
|  processingTimeMillis  | SES 接受来自发件人的请求与将邮件传递到收件人的邮件服务器之间的时间 (以毫秒为单位)。 | 
|  recipients  | 电子邮件送达通知适用的目标收件人的列表。 | 
|  smtpResponse  | 从 SES 接受电子邮件的远程 ISP 的 SMTP 响应消息。此消息因电子邮件、接收邮件服务器以及接收 ISP 而异。 | 
|  reportingMTA  | 发送邮件的 SES 邮件服务器的主机名。 | 
|  remoteMtaIp  | SES 送达电子邮件的 MTA 的 IP 地址。 | 

以下是 `delivery` 对象的示例。

```
{
   "timestamp":"2014-05-28T22:41:01.184Z",
   "processingTimeMillis":546,
   "recipients":["success@simulator.amazonses.com"],
   "smtpResponse":"250 ok:  Message 64111812 accepted",
   "reportingMTA":"a8-70.smtp-out.amazonses.com",
   "remoteMtaIp":"127.0.2.0"
}
```