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

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

为 Amazon SES 配置 Amazon SNS 通知

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

有关不同类型对象的描述,请参阅以下部分:

以下是有关 Amazon SES 的 Amazon SNS 通知内容的一些重要说明:

  • 对于给定的通知类型,您可能会收到针对多个收件人的 Amazon SNS 通知,或者可能会收到针对每个收件人的 Amazon SNS 通知。您的代码应该能够解析亚马逊 SNS 通知并处理这两种情况;SES 不为通过亚马逊 SNS 发送的通知提供订购或批量保证。但是,不同的 Amazon SNS 通知类型(例如,退回邮件和投诉)不会合并为一个通知。

  • 您可能会针对一个收件人收到多个类型的 Amazon SNS 通知。例如,接收邮件服务器可能接受电子邮件 (触发送达通知),但在处理电子邮件后,接收邮件服务器可能会确定该电子邮件实际导致了退回邮件 (触发退回邮件通知)。不过,这些通知始终单独发送,因为它们属于不同的类型。

  • SES 保留在通知中添加其他字段的权利。同样地,解析这些通知的应用程序必须足够灵活以处理未知字段。

  • SES 在发送电子邮件时会覆盖邮件的标题。您可以通过 mail 对象的 headerscommonHeaders 字段检索原始邮件的标头。

顶级 JSON 对象

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

字段名称 描述
notificationType

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

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

mail

一个 JSON 对象,包含有关通知所属的原始邮件的信息。有关更多信息,请参阅 邮件对象

bounce

此字段仅在 notificationTypeBounce,且包含的 JSON 对象保存有关退回邮件的信息时显示。有关更多信息,请参阅 退回邮件对象

complaint

此字段仅在 notificationTypeComplaint,且包含的 JSON 对象保存有关投诉的信息时显示。有关更多信息,请参阅 投诉对象

delivery

此字段仅在 notificationTypeDelivery,且包含的 JSON 对象保存有关送达的信息时显示。有关更多信息,请参阅 送达对象

邮件对象

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

字段名称 描述
timestamp

原始消息的发送时间(采用 ISO86 01 格式)。

messageId

SES 为邮件分配的唯一 ID。在您发送消息时,SES 将此值返回给您。

注意

此消息 ID 由 SES 分配。您可以在 mail 对象的 headers 字段中找到原始电子邮件的邮件 ID。

source

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

sourceArn

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

sourceIp

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

sendingAccountId

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

callerIdentity

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

destination

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

headersTruncated

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

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

headers

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

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

注意

headers对象中的任何消息 ID 都来自您传递给 SES 的原始消息。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 SES" } }

退回邮件对象

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

字段名称 描述
bounceType

反弹的类型,由 SES 确定。有关更多信息,请参阅 退信类型

bounceSubType

反弹的子类型,由 SES 确定。有关更多信息,请参阅 退信类型

bouncedRecipients

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

timestamp

发送退件的日期和时间(采用 ISO86 01 格式)。请注意,这是 ISP 发送通知的时间,而不是 SES 收到通知的时间。

feedbackId

退信的唯一 ID。

如果 SES 能够联系远程消息传输机构 (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" }

退信的收件人

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

退信类型

反弹对象包含的反弹类型为UndeterminedPermanent(硬)Transient(软)。Permanent(硬)Transient(软)反弹类型也可以包含几个反弹子类型之一。

当您收到退信类型为 Transient(软)的退回通知时,如果导致邮件退回的问题得到解决,将来您也许可以向该收件人发送电子邮件。

当你收到退信类型为 Permanent(难)的退回通知时,将来不太可能向该收件人发送电子邮件。因此,您应该立即从邮件列表中删除其地址造成了退回邮件的收件人。

注意

当出现软退信(与临时问题相关的退信,例如收件人的收件箱已满)时,SES 会尝试在一段时间内重新投递电子邮件。在这段时间结束时,如果 SES 仍然无法发送电子邮件,它就会停止尝试。

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

bounceType bounceSubType 描述
Undetermined Undetermined

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

Permanent General

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

重要

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

Permanent NoEmail

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

Permanent Suppressed

收件人的电子邮件地址之所以被列入 SES 封禁名单,是因为它最近有过硬退信的历史。要覆盖全局黑名单,请参阅 使用 Amazon SES 账户级黑名单

Permanent OnAccountSuppressionList

SES 已禁止向该地址发送邮件,因为该地址在账户级别的禁止列表中。这不计入您的跳出率指标。

Permanent UnsubscribedRecipient

当收件人联系人取消订阅主题并使用列表管理选项向他们发送邮件时,就会出现这种退回类型。SES 尊重联系人偏好,不会尝试配送。此外,此退回不会影响发件人的声誉,因为没有尝试投递,也不会因为退回而将收件人联系人添加到禁止列表中。

提示

建议您订阅 UnsubscribedRecipient 事件,以免继续向未订阅的收件人发送活动。考虑一下使用列表管理。列表管理应该是您的订阅者列表的真实来源。从 SES 执法的角度来看,如果您继续向被禁止或取消订阅的收件人发送邮件,您将以不遵守电子邮件发送最佳实践而闻名。

Transient General

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

注意

如果您将电子邮件发送到激活了自动回复规则 (例如“外出”邮件) 的收件人,则可能收到这种类型的通知。尽管回复的通知类型为Bounce,但 SES 在计算您账户的跳出率时不会计算自动回复。

Transient MailboxFull

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

Transient MessageTooLarge

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

Transient ContentRejected

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

Transient AttachmentRejected

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

投诉对象

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

字段名称 描述
complainedRecipients

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

timestamp

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

feedbackId

与投诉关联的唯一 ID。

complaintSubType

complaintSubType 字段的值可以为 null 或 OnAccountSuppressionList。如果值为OnAccountSuppressionList,则 SES 接受了该消息,但没有尝试发送,因为它在账户级别的禁止列表中。

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

字段名称 描述
userAgent

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

complaintFeedbackType

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

arrivalDate

反馈报告中Arrival-DateReceived-Date字段的值(采用 ISO86 01 格式)。此字段可能不在报告中(因此也不在 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 字段包含可能已提交投诉的收件人的列表。您应使用此信息来确定哪位收件人提交了投诉,然后立即将该收件人从您的邮件列表中删除。

重要

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

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

字段名称 描述
emailAddress

收件人的电子邮件地址。

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

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

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

投诉类型

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

  • abuse - 指示不请自来的电子邮件或某种其他类型的垃圾邮件。

  • auth-failure - 电子邮件身份验证失败报告。

  • fraud - 指示某种欺诈或网络钓鱼活动。

  • not-spam – 指示提供报告的实体不将邮件视为垃圾邮件。这可用于更正被错误地标记或分类为垃圾邮件的邮件。

  • other - 指示不适合其他已注册类型的任何其他反馈。

  • virus - 报告在原始邮件中发现病毒。

送达对象

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

字段名称 描述
timestamp

SES 将电子邮件发送到收件人的邮件服务器的时间(采用 ISO86 01 格式)。

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