Amazon Simple Email Service
開發人員指南

Amazon SES 的 Amazon SNS 通知內容

退信、抱怨和遞送通知會以 JavaScript Object Notation (JSON) 格式發佈到 Amazon Simple Notification Service (Amazon SNS) 主題。最上層 JSON 物件包含一個 notificationType 字串、mail 物件,或者 bounce 物件、complaint 物件或 delivery 物件。

請參閱以下章節以了解不同類型物件的說明:

以下是一些重要備註,與 Amazon SES 的 Amazon SNS 通知內容相關:

  • 針對指定通知類型,您可能會收到針對多個收件人的 Amazon SNS 通知,或者針對每個收件人各收到單一 Amazon SNS 通知。您的程式碼應要能剖析 Amazon SNS 通知並處理這兩種案例;Amazon SES 不保證會對透過 Amazon SNS 傳送的通知進行排序或批次處理。但是,不同 Amazon SNS 通知類型 (例如退信與抱怨) 永遠不會合併為單一通知。

  • 您可能會收到給一個收件人的多種 Amazon SNS 通知類型。例如,接收郵件伺服器可能會接受電子郵件 (觸發傳遞通知),但在處理電子郵件後,接收郵件伺服器可能會判斷電子郵件是否確實導致退信 (觸發退信通知)。但是,由於這些通知屬於不同類型,因此會一律以個別通知顯示。

  • Amazon SES 保留新增額外欄位到通知中的權利。因此,剖析這些通知的應用程式必須具備足夠的彈性,以處理未知欄位。

  • Amazon SES 將在傳送電子郵件時覆寫訊息標題。您可以從 headers 物件的 commonHeadersmail 欄位擷取原始訊息標題。

最上層 JSON 物件

在Amazon SES 通知中的最上層 JSON 物件包含下列欄位。

欄位名稱 描述

notificationType

擁有由 JSON 物件呈現的通知類型之字串。可能值為 BounceComplaintDelivery

mail

其中包含與通知相關之原始電子郵件資訊的 JSON 物件。如需更多詳細資訊,請參閱 郵件物件

bounce

此欄位只會在 notificationTypeBounce 並包含有關於退信資訊的 JSON 物件時才會顯示。如需更多詳細資訊,請參閱 退信物件

complaint

此欄位只會在 notificationTypeComplaint 並包含有關於投訴資訊的 JSON 物件時才會顯示。如需更多詳細資訊,請參閱 投訴物件

delivery

此欄位只會在 notificationTypeDelivery 並包含有關於傳遞資訊的 JSON 物件時才會顯示。如需更多詳細資訊,請參閱 傳遞物件

郵件物件

每個退信、投訴和傳遞通知包含原始電子郵件的 mail 物件相關資訊。其中包含 mail 物件相關資訊的 JSON 物件有下列欄位。

欄位名稱 描述

timestamp

原始訊息傳送的時間 (以 ISO8601 格式顯示)。

messageId

Amazon SES 指派給訊息的唯一 ID。Amazon SES 會在您傳送訊息時傳回此值。

注意

此訊息 ID 是由 Amazon SES 指派。您可以在原始電子郵件內 headers 物件的 commonHeadersmail 欄位找到訊息 ID。

source

傳送出原始訊息的電子郵件地址 (信封的「寄件人」地址)。

sourceArn

用以傳送電子郵件之身分的 Amazon Resource Name (ARN)。在傳送授權的情況下,sourceArn 為身分持有者授權給委託寄件者之身分的 ARN,用以傳送電子郵件。如需關於傳送授權的詳細資訊,請參閱使用傳送授權

sourceIp

執行對 Amazon SES 的電子郵件傳送請求之客戶端的原始公有 IP 地址。

sendingAccountId

用以傳送電子郵件之帳戶的 AWS 帳戶 ID。在傳送授權的情況下,sendingAccountId 為委託寄件者的帳戶 ID。

destination

原始郵件收件人的電子郵件地址清單。

headersTruncated

只有在您設定通知設定,使其包含原始電子郵件的標頭時,此物件才會存在。

指出標頭是否在通知中遭到截斷。若來自原始訊息標頭的大小超過 10 KB,則 Amazon SES 會在通知中截斷標頭。可能值為 truefalse

headers

只有在您設定通知設定,使其包含原始電子郵件的標頭時,此物件才會存在。

電子郵件原始標題的清單。清單中的每項標題都有 name 欄位與 value 欄位。

注意

任何在 headers 物件中的訊息 ID 都來自於您傳遞給 Amazon SES 的原始訊息。Amazon SES 隨即指派給訊息的訊息 ID 位於 mail 物件的 messageId 欄位內。

commonHeaders

只有在您設定通知設定,使其包含原始電子郵件的標頭時,此物件才會存在。

包含原始電子郵件常見電子郵件標頭的相關資訊,包括寄件人、收件人及主旨欄位。在此物件中,每個標頭都是一個鍵。寄件人和收件人欄位都會以可包含多個值的陣列呈現。

注意

任何在 commonHeaders 物件中的訊息 ID 都來自於您傳遞給 Amazon SES 的原始訊息。Amazon SES 隨即指派給訊息的訊息 ID 位於 mail 物件的 messageId 欄位內。

以下為包含原始電子郵件標題的 mail 物件範例。未將此通知類型設定為包含原始電子郵件標題時,mail 物件不會包含 headersTruncatedheaderscommonHeaders 欄位。

{ "timestamp":"2018-10-08T14:05:45 +0000", "messageId":"000001378603177f-7a5433e7-8edb-42ae-af10-f0181f34d6ee-000000", "source":"sender@example.com", "sourceArn": "arn:aws:ses:us-west-2: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 Amazon SES" } }

退信物件

JSON 物件,其中包含具有以下欄位的退信相關資訊。

欄位名稱 描述

bounceType

退信類型,由 Amazon SES 判定。如需更多詳細資訊,請參閱 退信類型

bounceSubType

退信的副類型,由 Amazon SES 判定。如需更多詳細資訊,請參閱 退信類型

bouncedRecipients

其中包含遭退信的原始郵件收件人之相關資訊的清單。如需更多詳細資訊,請參閱 退信的收件人

timestamp

退信傳送的日期與時間 (以 ISO8601 格式顯示)。請注意,此為 ISP 傳送通知的時間,而非 Amazon SES 收到的時間。

feedbackId

退信的唯一 ID。

若 Amazon SES 能夠聯絡遠端訊息傳輸授權單位 (MTA),則也會顯示以下欄位。

欄位名稱 描述

remoteMtaIp

Amazon 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" }

退信的收件人

退信通知可能與單一收件人或多個收件人相關。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" }

退信類型

退信物件包含 UndeterminedPermanentTransient 的退信類型。PermanentTransient 退信類型也可包含數種退信子類型中的其中一種。

當您收到退信類型為 Transient 的退信通知時,若造成訊息退信的問題解決,您可能可以在未來傳送電子郵件給該收件人。

當您收到退信類型為 Permanent 的退信通知時,您在未來也不太可能可以傳送電子郵件給該收件人。因此,建議您立即從電子郵件清單中移除造成此種退信的收件人地址。

注意

當發生軟退信 (與暫時性問題相關的退信,例如收件人的收件匣已滿等) 時,Amazon SES 會在一定時間範圍內嘗試重新遞送電子郵件。若 Amazon SES 在該段時間結束後仍然無法遞送電子郵件,便會停止嘗試。

Amazon SES 提供硬退信的通知,以及停止嘗試遞送的軟退信通知。

bounceType bounceSubType 描述

Undetermined

Undetermined

收件人的電子郵件提供者傳送退信訊息。退信訊息未包含足夠資訊,因此 Amazon SES 無法判斷退信的原因為何。傳送到造成退信電子郵件傳回路徑標頭中地址的退信電子郵件,可能包含造成電子郵件退信問題的額外資訊。

Permanent

General

收件人的電子郵件提供者傳送了硬退信訊息,但並未指定硬退信的原因。

重要

當您收到這類退信通知時,建議您立即從電子郵件清單中移除收件人的電子郵件地址。傳送訊息到產生硬退信的地址,可能會對您做為寄件者的評價產生負面影響。若您繼續傳送電子郵件到產生硬退信的地址,我們可能會暫停您傳送其他電子郵件的能力。

Permanent

NoEmail

目標收件人的電子郵件提供者傳送了退信訊息,指出電子郵件地址不存在。

重要

當您收到這類退信通知時,建議您立即從電子郵件清單中移除收件人的電子郵件地址。傳送訊息到不存在的地址,可能會對您做為寄件者的評價產生負面影響。若您繼續傳送電子郵件到不存在的地址,我們可能會暫停您傳送其他電子郵件的能力。

Permanent

Suppressed

收件人的電子郵件地址位於 Amazon SES 的隱藏清單上,因為它最近產生了硬退信。如需將地址從 Amazon SES 隱藏清單中移除的相關資訊,請參閱從 Amazon SES 禁止名單中移除電子郵件地址

Transient

General

收件人的電子郵件提供者傳送了一般退信訊息。若造成訊息退信的問題解決,您可能可以在未來傳送訊息到相同的收件人。

注意

若您傳送電子郵件到具有作用中自動回應規則 (例如「不在辦公室」訊息) 的收件人,您便可能會收到這類通知。即使回應具有 Bounce 通知類型的回應,Amazon SES 也不會在計算您帳戶的退信率時將自動回應計入。

Transient

MailboxFull

收件人的電子郵件提供者傳送了退信訊息,因為收件人的收件匣已滿。信箱釋出空間後,您便可能可以在未來傳送給相同的收件人。

Transient

MessageTooLarge

收件人的電子郵件提供者傳送了退信訊息,因為您傳送的訊息過大。若您減少訊息的大小,您便可能可以傳送訊息給相同的收件人。

Transient

ContentRejected

收件人的電子郵件提供者傳送了退信訊息,因為您傳送的訊息包含提供者不允許的內容。若您變更訊息的內容,您便可能可以傳送訊息給相同的收件人。

Transient

AttachmentRejected

收件人的電子郵件提供者傳送了退信訊息,因為訊息包含無法接受的附件。例如,有些電子郵件提供者可能會拒絕特定檔案類型的附件,或是包含非常大型附件的訊息。若您移除或變更附件的內容,您便可能可以傳送訊息給相同的收件人。

投訴物件

其中包含投訴相關資訊的 JSON 物件有下列欄位。

欄位名稱 描述

complainedRecipients

清單中包含可能曾因某些原因導致投訴的收件人相關資訊。如需更多詳細資訊,請參閱 提出投訴的收件人

timestamp

ISP 傳送抱怨通知的日期和時間,格式為 ISO 8601 格式。此欄位中的日期和時間可能和 Amazon SES 收到通知的日期和時間不同。

feedbackId

與抱怨相關聯的唯一 ID。

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

欄位名稱 描述

userAgent

來自意見回饋報告的 User-Agent 欄位數值。這表示產生報告的系統名稱和版本。

complaintFeedbackType

自 ISP 傳送的意見回饋報告中的 Feedback-Type 欄位數值。這包含意見回饋的類型。

arrivalDate

意見回饋報告中的 Arrival-Date or Received-Date 欄位值 (以 ISO8601 格式顯示)。此欄位可能不會在報告中顯示 (因而也不會在 JSON 中顯示)。

下列為 complaint 物件的範例。

{ "userAgent":"AnyCompany 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" }

提出投訴的收件人

complainedRecipients 欄位包含可能曾提出投訴的收件人清單。建議您使用此資訊來判斷提交抱怨的收件人,然後立即從電子郵件清單中移除該收件人。

重要

大多數的 ISP 都會從抱怨通知中移除提交抱怨的收件人電子郵件地址。因此,此清單會根據原始訊息收件人和向我們提出抱怨的 ISP,包含可能曾傳送抱怨的收件人相關資訊。Amazon SES 會針對原始訊息進行查閱,來判斷此收件人清單。

在這個清單中的 JSON 物件包含下列欄位。

欄位名稱 描述

emailAddress

收件人的電子郵件地址。

下列為提出投訴的收件人物件範例。

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

注意

由於這種行為,若您限制傳送為每個收件人單一訊息 (而非在密件副本行中加入 30 個不同電子郵件地址來傳送一個訊息),便可以更確信地知道哪些電子郵件地址曾對您的訊息提出投訴。

投訴類型

您可能看到 complaintFeedbackType 欄位中由回報 ISP 根據 Internet Assigned Numbers Authority website 指派的下列抱怨類型:

  • abuse—指出自動發出的電子郵件或其他形式的電子郵件濫用。

  • auth-failure—電子郵件身份驗證故障報告。

  • fraud—指示某些形式的詐騙或網路釣魚活動。

  • not-spam—指示提供報告的實體不會將訊息視為垃圾郵件。這可能會用於修正內含不正確標籤或者被歸類為垃圾郵件的訊息。

  • other—指示不符合其他註冊類型的任何其他意見回饋。

  • virus—回報在原始訊息中找到病毒。

傳遞物件

包含遞送相關資訊的 JSON 物件一率具有下列欄位。

欄位名稱 描述

timestamp

Amazon SES 成功將電子郵件傳遞給收件人的郵件伺服器之時間 (以 ISO8601 格式顯示)。

processingTimeMillis

以毫秒顯示 Amazon SES 收到來自寄件者的請求到傳遞訊息到收件人郵件伺服器之間的時間。

recipients

傳遞通知適用的電子郵件目標收件人清單。

smtpResponse

自 Amazon SES 接收電子郵件的遠端 ISP 之 SMTP 回應訊息。此訊息會隨著電子郵件、接收電子郵件伺服器以及接收 ISP 而有所不同。

reportingMTA

傳送郵件的 Amazon SES 郵件伺服器主機名稱。

remoteMtaIp

Amazon 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" }