与 Django 一起使用或独立使用的时事通讯应用程序。
项目描述
努蒂乌斯
Nuntius 是 Django 的时事通讯应用程序。
Nuntius 与您的 Django 项目集成。它与您的订阅者和订阅者列表模型非常不可知。
它具有Mosaico,一个拖放式电子邮件编辑器,用于向您的订阅者发送精美的电子邮件。
这个怎么运作
Nuntius 不知道您的订阅者模型。您可以使用您当前的使用模型,只要它实现了一些必需的方法。
为了允许您的最终用户选择收件人,您可以选择实施一个或多个“细分”模型。段模型实现所需的方法
get_subscribers_queryset
。
然后,您可以在 Django 管理面板中创建活动,并将它们发送到现有细分。
安装
-
将“nuntius”添加到您的 INSTALLED_APPS 设置中,如下所示:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ... 'nuntius', ]
-
在您的项目中包含 Nuntius urlconf,
urls.py
如下所示:path('nuntius/', include('nuntius.urls')),
-
定义您的订阅者模型,使其与 Nuntius 一起使用。您必须继承
nuntius.models.AbstractSubscriber
并实现所有必要的方法。一种简单的方法是直接使用或扩展BaseSubscriber
,但您可以AbstractSubscriber
按照您想要的方式实现方法。以下是您必须实施的方法:
-
get_subscriber_status()
必须返回其中之一AbstractSubscriber.STATUS_CHOICES
。您也可以简单地定义一个subscriber_status
属性。 -
get_subscriber_email()
必须为订阅者返回一个唯一的电子邮件地址。您也可以简单地定义一个email
属性。 -
get_subscriber_data()
必须返回可用作电子邮件中的替换值的字典。默认为{"email": self.get_subscriber_email()}
。
-
-
告诉 Nuntius 如何在
settings.py
NUNTIUS_SUBSCRIBER_MODEL = 'myapp.MySubscriberModel'
-
在后台启动 nuntius worker。在生产环境中,这应该通过像 upstart 或 systemd 这样的进程监视器来完成。
export DJANGO_SETTINGS_MODULE=myapp.settings python ./manage.py nuntius_worker
-
除非您使用自定义管理站点,否则 Nuntius 的管理面板将被 自动发现 并添加到您的管理站点。如果您使用自定义管理站点,则需要使用以下内容注册 Nuntius 模型:
admin_site.register(nuntius.models.Campaign, nuntius.admin.CampaignAdmin) admin_site.register(nuntius.models.CampaignSentEvent, nuntius.admin.CampaignSentEventAdmin)
其他设置
使用NUNTIUS_DEFAULT_FROM_EMAIL
, NUNTIUS_DEFAULT_FROM_NAME
, NUNTIUS_DEFAULT_REPLY_TO_EMAIL
,
NUNTIUS_DEFAULT_REPLY_TO_NAME
更改管理表单中的默认字段值。
高级用法
列出细分市场
如果您想对收件人进行更多控制,可以创建分段模型。
细分的一个例子是一个简单的模型,它与订阅者保持多对多关系。
另一个示例是根据用户上次登录日期过滤订阅者的分段模型:
from django.db import models
from django.db.models import fields
from datetime import datetime
from nuntius.models import BaseSegment
class LastLoginDateSegment(BaseSegment, models.Model):
last_login_duration = fields.DurationField()
def get_display_name(self):
return f'Last login : {str(datetime.now() - self.last_login_duration)}'
def get_subscribers_queryset(self):
return MySubscriberClass.objects.filter(last_login__gt=datetime.now() - self.last_login_duration)
def get_subscribers_count(self):
return MySubscriberClass.objects.filter(last_login__gt=datetime.now() - self.last_login_duration, subscribed=True)
get_subscribers_queryset
允许返回订阅者,不管他们的subscriber_status
,get_subscriber_status
将在每个实例上调用。get_subscribers_count
只是为了方便在管理面板中存在,它不一定是准确的。但是,如果您想让它准确,您应该考虑您的订阅者状态。
然后,将您的分段模型添加到 Nuntius 设置:
NUNTIUS_SEGMENT_MODEL = 'myapp.lastlogindatesegment'
自定义模板
您可以编写自己的 Mosaico 模板以满足您的需求。要使其在管理员中可用,请在NUNTIUS_MOSAICO_TEMPLATES
. 该模板可以由 Django 静态文件系统提供,或者您喜欢的任何其他方式。
NUNTIUS_MOSAICO_TEMPLATES = [
("/static/mosaico_templates/versafix-2/template-versafix-2.html", "Custom template")
]
发送参数
工作人员将产生几个子进程以加快发送活动。可以使用该NUNTIUS_MAX_CONCURRENT_SENDERS
设置配置将同时发送电子邮件的进程数。
大多数 ESP 强制执行最大发送速率。Nuntius 不会NUNTIUS_MAX_SENDING_RATE
以每秒消息数的速度发送消息。
使用 SMTP 时,某些 ESP 会限制可以使用单个连接发送的电子邮件数量。
NUNTIUS_MAX_MESSAGES_PER_CONNECTION
发送这么多消息后,将强制 Nuntius 重置连接。
Nuntius 工作人员每秒钟检查一次NUNTIUS_POLLING_INTERVAL
是否已安排或取消任何发送。对于大多数用途,应找到默认值 2 秒。
为了帮助您配置这些参数,您可以将 SIGUSR1 发送到主工作进程,它将打印发送统计信息stderr
。请特别注意当前发送速率和当前存储桶容量:如果您的发送速率低于您配置的最大值,则很可能意味着您选择的值NUNTIUS_MAX_CONCURRENT_SENDERS
不够高,因为您使用 ESP 获得的延迟.
ESP 和 Webhook
如果您有多个订阅者,那么维护您自己的 SMTP 服务器来发送您的时事通讯可能是个坏主意。您可以将 Anymail与 Nuntius 一起使用,以使用电子邮件服务提供商。Anymail 支持很多 ESP,例如 Amazon SES、Mailgun、Mailjet、Postmark、SendGrid、SendinBlue 或 SparkPost。
请参考Anymail 1-2-3中的步骤
安装 Anymail。如果您只想为 Nuntius 配置 Anymail 并保留默认电子邮件后端以供其他用途,您可以使用该设置NUNTIUS_EMAIL_BACKEND
而不是默认的EMAIL_BACKEND
.
此外,使用 Anymail 配置 Nuntius 将允许您使用 ESP 跟踪功能并在电子邮件发送后跟踪其状态。
网络挂钩
配置 webhhoks 允许 Nuntius 跟踪电子邮件状态并为您提供有关活动的统计信息,以及在订阅者反弹时更新订阅者状态。
- 如 Anymail 文档中所述配置电子邮件跟踪。
set_subscriber_status(self, email, status)
在您的订阅者模型管理器上实现该方法。
Nuntius 会自动监听 Anymail 信号,并在需要时调用此方法。
处理非 nuntius 事件(可选)
如果您通过 Nuntius 以外的其他方式向订阅者发送电子邮件(例如交易电子邮件),您将收到与您发送的活动无关的 webhook 事件。默认情况下,Nuntius 将创建一个记录电子邮件和事件类型的活动结果事件,但它不会将其链接到活动或订阅者模型。
如果您希望您的事件始终链接到订阅者模型,则必须get_subscriber(self, email_address)
在订阅者模型管理器上实现一个方法。
BaseSubscriberManager
Nuntius 与 BaseSubscriberManager 打包在一起,它实现
set_subscriber_status
和get_subscriber
,假设您email
的订阅者模型上有一个字段。这是 . 使用的默认管理器BaseSubscriber
。
反弹处理
大多数 ESP 根据你的硬跳出率给你一个声誉。Mosaico 巧妙地处理反弹,以在必要时更改您的订阅者状态。
如果 Nuntius 在没有其他发送事件的电子邮件地址上收到退回事件,set_subscriber_status(email, status)
则调用AbstractSubscriber.STATUS_BOUNCED
.
如果此地址存在成功发送事件,则考虑三个参数:
- 如果在最后
duration
几天内,退回的次数不超过limit
一次且至少成功发送一次,则不采取任何措施 - 如果在最后的事件中至少有一次成功发送
consecutive
,则不采取任何行动 - 否则,
set_subscriber_status(email, status)
调用AbstractSubscriber.STATUS_BOUNCED
您可以更改这些默认值:
NUNTIUS_BOUNCE_PARAMS = {
"consecutive": 1,
"duration": 7,
"limit": 3
}
例子 :
- 您每周发送 3 个广告系列。几个月后,订阅者的邮箱已满。在第一次和第二次退回的活动中,没有采取任何行动,因为在过去 7 天内成功发送,并且退回次数不超过 3 次。在第三次活动中,如果用户的邮箱清空,一切都很好。否则,订阅者将被标记为永久退回。
- 您每天发送一个广告系列。用户有一个错误的电子邮件服务器。本周,用户已经有 3 次反弹。当您收到第 4 次退回时,如果之前发送成功,则一切正常。否则,订阅者将被标记为永久退回。
追踪
通过添加白色像素和替换电子邮件中的链接来跟踪打开和点击。
Nuntius 还使用以下值将UTM 参数添加到每个 URL:
utm_source
:“努蒂斯”utm_medium
:“电子邮件”utm_campaign
:用户在活动级别配置的值utm_content
: "link-{number}"基于邮件中的链接位置utm_term
:utm_term
段对象的属性,如果属性不存在则为空字符串
在某些情况下,两个细节可能对您很重要:
utm_campaign
,utm_content
, 和utm_term
, 这些只是默认值,也可以直接在链接上设置。utm_source
并且utm_medium
将永远被覆盖。utm_content
并且utm_term
在发送时设置,之后不能更改。utm_campaign
在点击时设置,在从 nuntius 跟踪 URL 重定向到目标 URL 期间,因此如果您在发送后更改广告系列级别的值,则所有新点击的值都会更改。
执照
版权归 Jill Royer 和 Arthur Cheysson 所有。
您可以在 GPLv3 条款下使用 Nuntius。