【问题标题】:Forward Bounce Notifications for Undeliverable SES Messages?转发无法投递的 SES 消息的退回通知?
【发布时间】:2019-08-16 07:27:49
【问题描述】:
我希望能够将从 SES 退回的电子邮件的收件人的电子邮件地址转发到另一个端点以进行进一步处理。
到目前为止,我对这件事的想法是为退回通知设置典型的 SNS 主题,并在退回的电子邮件上触发 lambda。
收件人数据可以直接从 SNS 消息中获取,因此可以解析事件参数,并且 lambda 可以通过 SES 发送电子邮件,通知团队电子邮件被退回并且需要采取特定的补救措施。
基本上我只是想通知一个团队,如果无法联系到相关用户(即该用户不存在于我们自己的系统中,但仍存在于 AWS 中),则应删除一个帐户。
我不确定是否有人以前做过这个或有任何我没有想到的想法,我愿意接受任何事情,因为我将这件作品添加到我当前的自动化中。
【问题讨论】:
标签:
amazon-web-services
aws-lambda
amazon-sns
【解决方案1】:
这真的很简单,而且您已经提供了解决方案。
以下是两种方式:
为您的 SES 配置一个 SNS 主题,以将电子邮件发送给您想要的收件人。你不需要 lambda。请参阅this。
缺点:对于每封退回的电子邮件,您在 SNS 中配置的收件人都会收到一封电子邮件。它可能符合您的要求,也可能不符合您的要求,具体取决于跳出率。
此外,您可能不喜欢所发送电子邮件的内容。它是一个 json 格式。
我使用的其他解决方案是:为 SES 配置 SNS 主题以在 SQS 队列中发送通知。(不是电子邮件)此通知是 json 对象,其中包含电子邮件退回的目标电子邮件地址好吧,如果它是硬弹跳或软弹跳。硬退回是指收件人电子邮件地址不存在的情况。软退回是由一些临时网络问题、大量电子邮件内容等引起的,可以手动或通过自动重试解决。
然后运行一个小的 python 代码从 SQS 队列中提取消息并找出电子邮件地址。
我偶尔运行此脚本来获取电子邮件地址列表,并与 IT 团队共享以删除帐户。
max_queue_messages = 10
message_bodies = []
sqs = boto3.resource('sqs')
queue = sqs.get_queue_by_name(QueueName='SES-Email-Bounce')
while True:
messages_to_delete = []
for message in queue.receive_messages(MaxNumberOfMessages=max_queue_messages):
data = json.loads(message.body)
data1 = json.loads(data['Message'])
data2 = data1['mail']
data3 = data2['destination']
data4 = ''.join(data3)
print(data4)
with open('invaild_emails.txt', 'a') as file:
file.write(data4.lstrip('[\'').rstrip('\']') + "\n")
file.close()
# add message to delete
messages_to_delete.append({
'Id': message.message_id,
'ReceiptHandle': message.receipt_handle
})
# message.delete()
# if you don't receive any notifications the
# messages_to_delete list will be empty
if len(messages_to_delete) == 0:
break
# delete messages to remove them from SQS queue
# handle any errors
else:
delete_response = queue.delete_messages(
Entries=messages_to_delete)