为 Amazon SES 配置 Amazon SNS 通知 - Amazon Simple Email Service

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

为 Amazon SES 配置 Amazon SNS 通知

退回邮件、投诉和送达通知均采用 JavaScript 对象表示法(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 在发送电子邮件时会覆盖邮件标头。您可以通过 mail 对象的 headerscommonHeaders 字段检索原始邮件的标头。

顶级 JSON 对象

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

字段名称 描述
notificationType

一个字符串,包含由 JSON 对象表示的通知类型。可能的值为 BounceComplaintDelivery

如果你设置事件发布,此字段命名为 eventType

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 分配。您可以在 mail 对象的 headers 字段中找到原始电子邮件的邮件 ID。

source

发送原始电子邮件的电子邮件地址 (信封 MAIL FROM 地址)。

sourceArn

已用于发送电子邮件的身份的 Amazon Resource Name(ARN)。在发送授权的情况下,sourceArn 是身份拥有者授权委托发件人用于发送电子邮件的身份的 ARN。有关发送授权的更多信息,请参阅电子邮件身份验证方法

sourceIp

已执行到 Amazon SES 的电子邮件发送请求的客户端的原始公有 IP 地址。

sendingAccountId

已用于发送电子邮件的账户的 AWS 账户 ID。在发送授权的情况下,sendingAccountId 是委托发件人的账户 ID。

callerIdentity

发送电子邮件的 Amazon SES 用户的 IAM 身份。

destination

作为原始邮件的收件人的电子邮件地址的列表。

headersTruncated

仅当您将通知设置配置为包括原始电子邮件中的标头时,此对象才存在。

指示通知中的标头是否截断。当原始邮件中的标头大小为 10 KB 或更大时,Amazon SES 会在截断通知中的标头。可能的值为 truefalse

headers

仅当您将通知设置配置为包括原始电子邮件中的标头时,此对象才存在。

电子邮件的原始标头的列表。列表中的每个标头均有一个 name 字段和一个 value 字段。

注意

headers 对象内的任何邮件 ID 均来自您传递至 Amazon SES 的原始邮件。Amazon SES 随后分配给电子邮件的邮件 ID 位于 mail 对象的 messageId 字段中。

commonHeaders

仅当您将通知设置配置为包括原始电子邮件中的标头时,此对象才存在。

包括有关原始电子邮件中的常用电子邮件标头的信息,包括“发件人”、“收件人”和“主题”字段。在此对象中,每个标头是一个键。“发件人”和“收件人”字段由可包含多个值的数组表示。

注意

对于事件,commonHeaders 字段中的任何邮件 ID 是 Amazon SES 随后在邮件对象的 messageId 字段中分配给邮件的邮件 ID。通知将包含原始电子邮件的邮件 ID。

下面是包含原始电子邮件标头的 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-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 Amazon SES" } }

退回邮件对象

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

字段名称 描述
bounceType

退回邮件的类型,由 Amazon SES 确定。有关更多信息,请参阅退信类型

bounceSubType

退回邮件的子类型,由 Amazon SES 确定。有关更多信息,请参阅退信类型

bouncedRecipients

包含已退回的原始邮件收件人相关信息的列表。有关更多信息,请参阅退信的收件人

timestamp

退回邮件的发送日期和时间 (采用 ISO8601 格式)。请注意,这是 ISP 发送通知的时间,而不是 Amazon SES 接收通知的时间。

feedbackId

退信的唯一 ID。

如果 Amazon SES 已能够联系远程 Message Transfer Authority(MTA),则以下字段也将显示。

字段名称 描述
remoteMtaIp

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

退信的收件人

退回邮件通知可能与一个或多个收件人有关。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" }

退信类型

退回邮件对象包含的退回邮件类型为 UndeterminedPermanentTransientPermanentTransient 退回邮件类型也可以包含多种退回邮件子类型之一。

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

当您收到退回邮件类型为 Permanent 的退回邮件通知时,您以后也可能无法将电子邮件发送给该收件人。因此,您应该立即从邮件列表中删除其地址造成了退回邮件的收件人。

注意

发生软退回邮件(与收件人的收件箱已满等临时问题相关的退回邮件)时,Amazon SES 会在一定时间内尝试重新传送电子邮件。在这段时间结束时,如果 Amazon SES 仍然无法传送电子邮件,则会停止尝试。

Amazon SES 为查无此人的邮件以及停止尝试传送的软退回邮件提供通知。如果您希望在每次发生软退回邮件时收到通知,请启用事件推送并将其配置为出现送达延迟事件时发送通知。

bounceType bounceSubType 描述
Undetermined Undetermined

收件人的电子邮件提供商发送退回邮件消息。退回邮件中未包含足够的消息以供 Amazon SES 确定退回邮件的原因。退回邮件电子邮件 (发送到电子邮件的 Return-Path 标头中地址) 可能包含有关导致电子邮件退回的问题的其他信息。

Permanent General

收件人的电子邮件提供商发送了硬退信。

重要

收到此类退回邮件通知时,您应立即从邮件列表中删除该收件人的电子邮件地址。将邮件发送到造成硬退回邮件的地址会对您作为发件人的声誉造成负面影响。如果您继续将电子邮件发送到造成硬退回邮件的地址,我们可能会暂停您发送更多电子邮件的功能。请参阅使用 Amazon SES 账户级别的禁止名单

Permanent NoEmail

无法从退回邮件中检索收件人的电子邮件地址。

Permanent Suppressed

由于收件人的电子邮件地址近期有造成查无此人的邮件的历史记录,因此该地址已进入 Amazon SES 黑名单。要覆盖全局黑名单,请参阅 使用 Amazon SES 账户级别的禁止名单

Permanent OnAccountSuppressionList

Amazon SES 已禁止发送到此地址,因为该地址已被加入账户级黑名单。这不计入您的跳出率指标。

Transient General

收件人的电子邮件提供商发送一般退回邮件消息。如果解决了导致邮件退回邮件的问题,您也许可在以后将邮件发送给相同的收件人。

注意

如果您将电子邮件发送到激活了自动回复规则 (例如“外出”邮件) 的收件人,则可能收到这种类型的通知。即使回复中具有 Bounce 类型的通知,Amazon SES 在计算账户的邮件退回率时也不会计入自动回复。

Transient MailboxFull

由于收件人的收件箱已满,收件人的电子邮件提供商发送退回邮件。以后当收件人的邮箱有空闲空间时,您可能可以向相同的收件人发送电子邮件。

Transient MessageTooLarge

由于您发送的邮件太大,收件人的电子邮件提供商发送退回邮件。如果您减小邮件的大小,则也许能够向相同的收件人发送邮件。

Transient ContentRejected

由于您发送的内容包含收件人电子邮件提供商不允许的内容,该提供商发送了退回邮件。如果您更改邮件的内容,则也许能够向相同的收件人发送电子邮件。

Transient AttachmentRejected

由于邮件包含不可接受的附件,收件人的电子邮件提供商发送了退回邮件。例如,一些电子邮件提供商可能会拒绝具有特定文件类型附件的电子邮件,或者具有超大附件的电子邮件。如果您删除附件或更改其内容,则也许能够向相同的收件人发送电子邮件。

投诉对象

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

字段名称 描述
complainedRecipients

包含提起投诉的收件人相关信息的列表。有关更多信息,请参阅已投诉的收件人

timestamp

ISP 发送投诉通知时的日期和时间,采用 ISO8601 格式。此字段中的日期和时间可能与 Amazon SES 收到通知时的日期和时间不同。

feedbackId

与投诉关联的唯一 ID。

complaintSubType

complaintSubType 字段的值可以为 null 或 OnAccountSuppressionList。如果该值为 OnAccountSuppressionList,则表示 Amazon SES 已接受邮件,但未尝试发送邮件,因为该地址已被加入账户级黑名单

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

字段名称 描述
userAgent

反馈报告中的 User-Agent 字段的值。此值表示生成了报告的系统的名称和版本。

complaintFeedbackType

从 ISP 收到的反馈报告中的 Feedback-Type 字段的值。此值包含反馈的类型。

arrivalDate

反馈报告中的 Arrival-DateReceived-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" }

已投诉的收件人

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

重要

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

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

字段名称 描述
emailAddress

收件人的电子邮件地址。

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

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

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

投诉类型

根据complaintFeedbackType互联网编号分配机构网站,您可在由报告 ISP 分配的 字段中看到以下投诉类型:

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