读取保存到 SES 中的 s3 存储桶的传入电子邮件

Reading incoming emails saved to s3 bucket in SES

我已经配置 AWS SES 来发送和接收电子邮件 我已经验证了我的域并创建了规则集,所有收到的电子邮件现在都将存储在 S3 bucketobject key prefix as email 中。我发现以下用于从 S3 存储桶读取文件的代码: http://docs.aws.amazon.com/AmazonS3/latest/dev/RetrievingObjectUsingJava.html

我正在尝试阅读电子邮件。我的 SES 规则将所有传入电子邮件存储到我指定的 s3 存储桶中。我正在尝试添加读取存储桶的代码,获取电子邮件。下次我读桶的时候,我怎么知道哪些邮件是以前读过的,哪些是要读的。那么有什么方法可以让我读取带有电子邮件的存储桶并将它们设为已读,这样我就不必再次处理它们

S3 只是存储。它没有 "read" 与 "unread," 的区别,如果您通过在存储桶中列出对象来发现消息,您最好的解决方案是这样的:

处理每封邮件后,将其移至其他位置。这可能是另一个桶,或同一桶中的不同前缀。

S3 没有 "move" 操作,但它有复制和删除...因此,对于您处理的每条消息,修改对象键(路径+文件名)。

如果您的电子邮件存储时带有前缀,例如 "incoming/",这样单个邮件就有一个看起来像(例如)"incoming/jozxyqkblahexample," 的键,将该字符串更改为 "processed/jozxyqkblahexample." 然后告诉 S3 从旧的复制到新的。成功后,告诉 S3 删除原件。

这(主要是?)解决了您的问题,因为由于您只列出了带有前缀 "incoming/" 的对象,所以下次您将看不到它们——它们现在已经不在了。

但是,此解决方案存在一个潜在问题...具体来说,您可能 运行 与 S3 一致性模型冲突。 S3 不保证获取对象列表会 立即 给你一个响应,反映你最近完成的所有 activity 对存储桶......对象有可能删除后会在对象列表中停留一小段时间...因此在删除后仍然可以在列表中看到一条消息。机会相当低,但你需要意识到这种可能性。

当 SES 将消息放入您的存储桶时,也可以将其配置为通知您它刚刚执行了该操作。

通常,比轮询邮件桶更好的解决方案是让 SES send you an SNS notification 收到邮件。通知将包含有关消息的信息,包括消息存储在存储桶中的密钥。然后您从存储桶中准确获取该消息并对其进行处理,因此不需要存储桶对象列表。

请注意,SES 有两​​种不同的通知类型——对于小型电子邮件,SES 实际上可以将邮件包含在 SNS 通知中,但这不是上面提到的通知类型。以上,我建议您调查使用 alert notification 的可能性,该 alert notification 由 SES 通过 SNS 发送,以告知您有关每封电子邮件的信息,因为它被放入 S3。