通过 AWS SES 发送后 "Delivery" 和 "Bounce" SNS 通知

Both "Delivery" and "Bounce" SNS Notifications after sending via AWS SES

我有这些很尴尬的情况,可能是我误解了这些通知的使用。

我已将 AWS SES 设置为在发送电子邮件后发布到主题。我已将其设置为针对跳出、投诉和投放发布。

我所做的是,当我在我的网络服务器上收到 SNS 通知时,我会在我的数据库中查找该消息 ID,然后更改其状态。例如,如果送达通知到达,我将消息状态更改为 "Delivered"。如果退回通知到达,我将邮件状态更改为 "Bounced"。

但是,现在我注意到很多这样的电子邮件都向我发送了这两种通知,而且它们并不总是按特定顺序发送。有时一个比另一个来得早,有时反之亦然。

所以如果 "Bounce" 先到达,然后 "Delivered",我在数据库中的这条消息的状态变为 "Delivered",我认为这可能是误导。

第一题 如何检查这些通知的顺序?

第二题 我觉得我误解了 "Delivery" 通知。我试过阅读 AWS 文档,但老实说,它们并不是地球上最好的文档。谁能给我一个简单明了的解释?

第三题 我是否正确处理了这些通知?或者有更好的方法吗?

感谢您的帮助。

谢谢!

--

供您参考,我附上了一个示例,其中包含一组 2 个通知。一次退回,一次投递。

{
    "Type": "Notification",
    "MessageId": "2efb9ee6-6bd5-576d-b80d-d0f5e3f44f23",
    "TopicArn": "arn:aws:sns:us-east-1:#####:ses_beamstyle_com_hk",
    "Message": {
        "notificationType": "Delivery",
        "mail": {
            "timestamp": "2015-07-05T19:30:40.441Z",
            "source": "<no-reply@bs.com.hk>",
            "messageId": "xxxxx
            "destination": [
                "<ooto@simulator.amazonses.com>"
            ]
        },
        "delivery": {
            "timestamp": "2015-07-05T19:30:41.101Z",
            "processingTimeMillis": 660,
            "recipients": [
                "ooto@simulator.amazonses.com"
            ],
            "smtpResponse": "250 2.6.0 Message received",
            "reportingMTA": "a9-140.smtp-out.amazonses.com"
        }
    },
    "Timestamp": "2015-07-05T19:30:41.179Z",
    "SignatureVersion": "1",
    "Signature": "xxxxx",
    "SigningCertURL": "xxxxx",
    "UnsubscribeURL": "xxxxx"
}





{
    "Type": "Notification",
    "MessageId": "b6e8bb7d-4e73-52ae-b690-f56ec6527ce5",
    "TopicArn": "arn:aws:sns:us-east-1:#####:ses_beamstyle_com_hk",
    "Message": {
        "notificationType": "Bounce",
        "bounce": {
            "bounceSubType": "General",
            "bounceType": "Transient",
            "bouncedRecipients": [
                {
                    "emailAddress": "ooto@simulator.amazonses.com"
                }
            ],
            "timestamp": "2015-07-05T19:30:41.000Z",
            "feedbackId": "xxxxx"
        },
        "mail": {
            "timestamp": "2015-07-05T19:30:40.000Z",
            "messageId": "xxxxx",
            "destination": [
                "<ooto@simulator.amazonses.com>"
            ],
            "source": "<no-reply@bs.com.hk>"
        }
    },
    "Timestamp": "2015-07-05T19:30:41.315Z",
    "SignatureVersion": "1",
    "Signature": "xxxxx",
    "SigningCertURL": "xxxxx",
    "UnsubscribeURL": "xxxxx"
}

SMTP 投递的性质,即 SES 用于所有出站投递(无论您使用 SMTP 还是 API),退回和投递 有时确实如此在同一封邮件上出现

打个比方,假设我请你代表我给一家公司打电话,并给简·史密斯留言,即使(你不知道)该公司没有叫这个名字的人。将发生以下两种情况之一:

  • 在通话结束之前,您会被告知,"I'm sorry, there is no one here by that name," 或,

  • 您将留言,然后挂断电话,因为接听留言的人假设有人叫这个名字,或者可能是接听者不知道的前雇员的名字'意识到不再存在。

在第一种情况下,如果我问,"did you leave a message for Jane?" 你会说 "no." 但在第二种情况下,你会说 "yes."

但是...在你结束通话后,在第二种情况下,公司的某个人随后会意识到消息是发给一个陌生人的。如果他们有礼貌,他们可能会给你回电话说,"we can't deliver your message, because there is no one here by that name."

现在,你打电话给我说,"I couldn't deliver that message." "Wait, what? You told me you already did."

但是,即使您说您做到了,但您实际上没有传达该信息的原因已经很清楚了。

同样的问题发生在电子邮件上。可以说,接收邮件服务器的正确行为是立即拒绝无法投递的邮件。

不幸的是,在 SMTP 交易开始时,大量电子邮件提供商不会验证电子邮件地址。相反,他们接受他们应该接受的域的所有邮件,并将可传递性检查推迟到以后,这样他们就不可能主动拒绝传入的消息......这是 SES 避免发送 "false alarm" 交货通知。通过延迟检查,收件人系统有必要实际生成一封电子邮件返回给发件人(由于他们格式化消息的方式,结果是 SES)。在没有真正退回的情况下,SES首先认为邮件已送达,然后认为邮件被退回。

大多数 情况下,returns 来自 SES 的退回通知的电子邮件确实被退回了...无论您收到任何送达通知。通常情况下,交货应该是第一位的,但也有可能出现订单混乱的情况——尽管那应该是个例外。

For ISP bounces, Amazon SES reports only hard bounces and soft bounces that will no longer be retried by Amazon SES. In these cases, your recipient did not receive your email message, and Amazon SES will not try to resend it.

http://docs.aws.amazon.com/ses/latest/DeveloperGuide/notifications.html

这很简单...但是,当然,有一个恼人的例外:

You are notified of out-of-the-office (OOTO) messages through the same method as bounces, although they don't count toward your bounce statistics.

不在办公室的回复,在线路上,看起来很像弹跳。据推测,当 SES 无法确定要报告的更好的退回类型时,基于在目的地已经——显然——接受了你的消息之后发回的退回消息的结构……他们使用你在你的示例:

        "bounceSubType": "General",
        "bounceType": "Transient",

有关可能的组合,请参阅 http://docs.aws.amazon.com/ses/latest/DeveloperGuide/notification-contents.html#bounce-types

您最好的方法是可能存储所有响应,以防万一这被证明是一个不太准确的评估,并将 Transient/General 退回通知视为外出警报。

其他临时子类型可能被解释为您将来可以成功发送给的人,而永久子类型是您应该避免发送的地址,因为该地址被认为是永久无法送达的。

除了不在办公室外,退回邮件(收件人方面没有配置错误)应该是一个相当可靠的指标,表明此特定邮件没有通过。