如何通过 Amazon SES 重新发送由于速率限制而未发送的电子邮件

How to resend emails via Amazon SES which didn't go because of rate limiting

提问人:deathByChocolate 提问时间:11/15/2023 更新时间:11/15/2023 访问量:38

问:

我正在使用 Amazon SES 通过 cron 作业发送批量电子邮件。我的应用程序每秒处理大约 40-50 封电子邮件,但我只能通过 SES 发送 22 封电子邮件。enter image description here

如果我发送超过 22 封电子邮件,我会遇到以下错误 -

com.amazonaws.services.simpleemail.model.AmazonSimpleEmailServiceException: Maximum sending rate exceeded. 
(Service: AmazonSimpleEmailService; Status Code: 400; Error Code: Throttling; 
Request ID: 5xxxxxx-xxxx-xxxx-xxxx-xxxxxxx8a4; Proxy: null)

我知道,为了避免将来出现这种情况,我将不得不在我的代码中通过使用本文档中提到的降频、指数退避等来优雅地处理它。

但是,我想知道是否有任何方法可以重新发送由于速率限制而未通过的电子邮件(过去发送)。 我可以看到requestId以及错误。SES是否将其记录在某个地方并提供任何重新发送机制?

即使我能得到未通过的电子邮件列表,也会有所帮助。

Amazon-Web-Services SMTP Amazon-CloudWatch Amazon-SES 速率限制

评论

1赞 stdunbar 11/15/2023
我希望稍微改变一下您的架构,并将消息放入 SQS 队列中。让 Lambda 或其他进程将它们从队列中拉出并尝试发送。如果发送失败,则不应从队列中删除该消息,并且在可见性超时后将再次可见。这将允许消息最终爆发出去。唯一可能的问题是消息非常大,因为 SQS 只能处理 256K。在这种情况下,您可能还需要利用 S3。
0赞 deathByChocolate 11/15/2023
我可以在未来实施很多机制。但是我有一些电子邮件没有发出。所以我正在寻找我是否能找到一些方法来重新发送它们。
0赞 stdunbar 11/15/2023
AWS 在某处没有为您保留的未发送邮件数据库。错误代码告诉您的代码无法发送。之后,由您来保存它。

答:

1赞 Quassnoi 11/15/2023 #1

如果您的请求因任何原因被 SES 拒绝,它甚至没有进入管道,因此它不会存储在 AWS 上的任何位置。

即使这样做了,SES 也不会现成地记录消息元数据。他们有一篇博文就解决了这个问题:

目前,SES提供了各种指标,如发送次数、拒绝次数等,但在发送电子邮件时没有直接的方法来记录发件人电子邮件身份、收件人电子邮件身份、主题、时间戳、源IP地址、messageId等信息。

,其中他们建议构建一个涉及 SNS 和 Lambda 的自定义解决方案,以实现 SES 作业的详细日志记录。

这是许多服务的问题,因此我喜欢实现的一个低代码解决方案是通过 API Gateway 代理这些调用,并在网关级别启用 Cloud Watch 日志。它确实会略微增加您的 AWS 账单,但它为进出 AWS 服务的内容提供了更多的可见性。

作为附带奖励,它降低了与AWS的耦合,因为AWS网关可以设置为仅使用访问密钥,因此HTTP客户端成为唯一的依赖项。

我知道它现在对你没有帮助,但我会把它留在这里给未来的访客。

评论

1赞 Michael - sqlbot 11/15/2023
这篇博文是关于SES接受的消息,所以它并没有真正解决手头的问题,但你的第一句话是正确的——当消息受到限制时,服务永远不会看到它们。
0赞 Quassnoi 11/15/2023
@Michael-SQLBOT:谢谢你指出这一点。我正在重写这篇文章,关键部分被编辑掉了。