跳转到主要内容

处理Amazon简单通知服务(SNS)发送的邮件发送弹跳和滥用报告的方法

项目描述

Django Bouncy是一个Django包,用于处理通过亚马逊网络服务(AWS)的简单通知服务(SNS)发送的邮件发送弹跳和滥用报告。

简介

亚马逊简单电子邮件服务(SES)允许亚马逊客户使用亚马逊的出站SMTP服务器向第三方发送电子邮件。作为最终交付步骤的一部分,亚马逊有时会获取可能对其客户有用的信息。亚马逊提供了通过JSON编码和签名简单通知服务(SNS)消息将第三方SMTP服务器接收到的信息传递给客户的能力。

目前,亚马逊提供了3种消息供传递。弹跳(邮件地址不可用,无论是永久性的“硬弹跳”还是临时的“软弹跳”),投诉(用户将邮件标记为垃圾邮件),和成功交付(邮件被收件人的邮件服务器接受)

Django Bouncy的目的是作为SES的端点,确认通知来自亚马逊,然后正确记录交付、弹跳或投诉,供项目中其他应用程序使用。

安装与配置

安装Django Bouncy相对简单。

步骤1:将Django Bouncy添加到您的Django应用

在配置亚马逊之前,确保Django Bouncy已安装到您的Django应用程序中非常重要。

首先,将django_bouncy添加到应用程序的INSTALLED_APPS设置中。

然后,将django_bouncy.urls添加到您应用程序中的urlpatterns中,这些urlpatterns位于应用程序的urls.py文件中。

例如,如果您想在 http://yourapp.com/bouncy/ 创建一个端点,您的 urls.py 文件将看起来像这样

from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
    url(r'^bouncy/', include('django_bouncy.urls')),
)

接下来的步骤涉及通过 AWS 管理控制台 与 AWS 进行交互。

步骤 2:创建一个新的 SNS 主题。

Django-Bouncy 需要创建一个简单的通知服务(SNS)主题,并将您的新 Django Bouncy 端点设置为订阅者。您可以在 AWS 文档中找到有关如何 创建 SNS 主题 的信息

步骤 3:确保您的应用程序已部署并带有有效的 Django-Bouncy 端点。

由于订阅 SNS 主题需要有效的接收端点,该端点在创建订阅时可以回复 SNS,因此您的应用程序必须运行,并且 Django Bouncy 必须在您打算在生产环境中使用的 URL 上设置。

请注意,您可以将一个配置选项添加到项目中的 settings.py 文件,即 BOUNCY_TOPIC_ARN。这是一个 Django-Bouncy 将在收到请求时关注的 SNS 主题 ARN 列表。虽然此设置不是必需的,但强烈建议您设置此选项,否则另一个 AWS 客户端可能会向您的应用程序发送大量虚假的退订报告。

步骤 4:为您的话题创建一个新的 SNS 订阅。

AWS 文档很好地描述了如何 将 HTTP URL 订阅到 SNS 主题。此 URL 将是您在 urls.py 中设置的 Django Bouncy 端点。

当您订阅新的 SNS 主题时,亚马逊将向 Django-Bouncy 发送订阅验证请求,Django-Bouncy 将立即验证并回复。只有经过验证的订阅才能发送 SNS 通知,因此在使用这些步骤之前,请确保 Django Bouncy 在您选择的端点上运行!

AWS 控制面板应迅速显示新端点已成功订阅。如果在几分钟内,您的新订阅状态标记为“待验证”,则可能是 Django Bouncy 发生了错误。

步骤 5. 将简单电子邮件服务(SES)配置为使用您的新 SNS 主题进行订阅。

AWS 文档很好地解释了如何 将 SES 通知首选项切换为使用 SNS

如果您想测试新的 Django Bouncy 实现,亚马逊提供了一个 邮箱模拟器,您可以使用它发送将返回有效的退订或投诉给 Django Bouncy 的 SES 电子邮件。

处理退订和投诉

Django Bouncy 通过两种方式公开有效的投递、退订和投诉:通过 Django Bouncy 的 DeliveryBounceComplaint 模型,以及通过其他 Django 应用程序部分可以附加的信号。

要获取 Django Bouncy 中的所有退订,您只需导入该模型并发出请求即可

from django_bouncy.models import Bounce

# Generate a queryset of all bounces Django Bouncy has processed
all_bounces = Bounce.objects.all()
# Find all hard bounces
all_hard_bounces = Bounce.objects.filter(hard=True)

要找到 DeliveryBounceComplaint 模型的架构,最好的方法是查看 Django Bouncy 附件中的 django_bouncy/models.py 文件。

如果您想订阅通知,例如在您的自己的 Unsubscribe 模型中创建新记录,请简单地附加到 feedback 信号

from django.dispatch import receiver
from django_bouncy.models import Bounce
from django_bouncy.signals import feedback
from my_app.models import Unsubscribe

@receiver(feedback, sender=Bounce)
def process_feedback(sender, **kwargs):
    """Process a bounce received from our email vendor"""
    instance = kwargs['instance']
    if instance.hard:
        Unsubscribe.objects.create(address=instance.address, source='bounce')

配置选项

在您的 django 设置文件中,有多个配置选项可供您选择。

BOUNCY_TOPIC_ARN - 应用程序被授权关注的一个或多个SNS主题列表。强烈建议您设置此设置,尤其是如果您没有禁用 BOUNCY_AUTO_SUBSCRIBE,因为第三方可能会在其自己的SES账户上创建指向您的Django Bouncy端点的主题,从而使他们能够批量创建Django Bouncy将其识别为有效的弹跳。默认值: None

BOUNCY_AUTO_SUBSCRIBE - 所有SNS端点都必须与Amazon确认他们愿意接受SNS通知。这通过在您首次添加新端点时发送的SubscriptionNotification来完成,其中将包含一个唯一的临时URL,该URL必须通过GET请求轮询或通过API传递回Amazon。默认情况下,django-bouncy将确认并确认向其发送的任何订阅请求。它是通过访问SubscriptionNotification提供的SubscribeURL来完成的。

如果您已经确认您的Django Bouncy端点已激活,您可以通过将其设置为 False 来禁用此自动订阅,这将导致Django Bouncy对所有新的SubscriptionNotifications返回404错误。默认值: True

BOUNCY_VERIFY_CERTIFICATE - 作为验证过程的一部分,Django Bouncy将所有通知与Amazon的公共SES密钥进行核对,该密钥是Amazon将其存储在其服务器上的.pem证书的一部分。您可以通过将此设置更改为 False 来禁用此证书检查。默认值: True

BOUNCY_KEY_CACHE - 由于证书的URL根据AWS区域而变化,并且证书有有效期,因此不能假设每个接收到的通知都会使用相同的密钥。为了避免在密钥保存时出现不必要的验证失败,并且为了减少对密钥的缓慢请求,Django Bouncy将在首次接收到通知时请求一个密钥,并将其存储在django的缓存框架中。

您可以通过更改此设置来调整Django Bouncy存储证书的缓存。默认值: default

BOUNCY_CERT_DOMAIN_REGEX - 包含应该用于验证Amazon公共SNS证书URL确实托管在Amazon上的正则表达式的字符串。默认值为 sns.[a-z0-9\-]+.amazonaws.com$(这将匹配sns.region.amazonaws.com),您不太可能需要更改此值。

致谢

Django Bouncy最初在Organizing for Action内部编写,作为Connect项目的一部分,源代码可在Django Bouncy GitHub仓库中找到。

项目详情


下载文件

下载适用于您平台的自定义文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源代码分发

django-bouncy-0.2.8.tar.gz (20.5 kB 查看哈希)

上传时间 源代码

构建分发

django_bouncy-0.2.8-py2-none-any.whl (31.3 kB 查看散列值)

上传时间 Python 2

由以下支持