

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon SES 的 Amazon SNS 通知內容
<a name="notification-contents"></a>

退信、投訴和遞送通知會以 JavaScript 物件標記法 (JSON) 格式發佈到 [Amazon Simple Notification Service (Amazon SNS)](https://aws.amazon.com/sns) 主題。最上層 JSON 物件包含一個 `notificationType` 字串、`mail` 物件，或者 `bounce` 物件、`complaint` 物件或 `delivery` 物件。

請參閱以下章節以了解不同類型物件的說明：
+ [最上層 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 會在傳送電子郵件時覆寫訊息的標頭。您可以從 `headers` 物件的 `commonHeaders` 與 `mail` 欄位擷取原始訊息標題。

## 最上層 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  | 傳送出原始訊息的電子郵件地址 (信封的「寄件人」地址)。 | 
|  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 位於 `mail` 物件的 `messageId` 欄位中。  | 
|  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 能夠聯絡遠端訊息傳輸授權機構 (MTA)，則也會出現下列欄位。


| 欄位名稱 | 說明 | 
| --- | --- | 
|  remoteMtaIp  | SES 嘗試傳送電子郵件的 MTA IP 地址。 | 

若退信有連接遞送狀態通知 (DSN)，則也會顯示以下欄位。


| 欄位名稱 | 說明 | 
| --- | --- | 
|  reportingMTA  | 來自 DSN 的 `Reporting-MTA` 欄位數值。這是嘗試執行傳遞、轉傳或閘道操作的 MTA 值，如 DSN 中所述。 | 

下列為 `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` 欄位數值。這表示回報 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 | bounceSubType | 說明 | 
| --- | --- | --- | 
|  Undetermined  |  Undetermined  | 收件人的電子郵件提供者傳送退信訊息。退信訊息未包含足夠的 SES 資訊，無法判斷退信的原因。傳送到造成退信電子郵件傳回路徑標頭中地址的退信電子郵件，可能包含造成電子郵件退信問題的額外資訊。 | 
|  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 傳送投訴通知的日期和時間，格式為 ISO 8601 格式。此欄位中的日期和時間可能與 SES 收到通知的日期和時間不同。 | 
|  feedbackId  | 與投訴相關聯的唯一 ID。 | 
|  complaintSubType  | `complaintSubType` 欄位的值可以是 null 或 `OnAccountSuppressionList`。如果值為 `OnAccountSuppressionList`，SES 會接受訊息，但並未嘗試傳送，因為它位於[帳戶層級禁止名單](sending-email-suppression-list.md)中。 | 

此外，如果意見回饋報告連接到該投訴，可能顯示下列欄位。


| 欄位名稱 | 說明 | 
| --- | --- | 
|  userAgent  | 來自意見回饋報告的 `User-Agent` 欄位數值。這表示產生報告的系統名稱和版本。 | 
|  complaintFeedbackType  | 自 ISP 傳送的意見回饋報告中的 `Feedback-Type` 欄位數值。這包含意見回饋的類型。 | 
|  arrivalDate  | 意見回饋報告中的 `Arrival-Date` or `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 根據 [Internet Assigned Numbers Authority website](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"
}
```