Skip to main content

与 Django 一起使用或独立使用的时事通讯应用程序。

项目描述

努蒂乌斯

Nuntius 是 Django 的时事通讯应用程序。

Nuntius 与您的 Django 项目集成。它与您的订阅者和订阅者列表模型非常不可知。

它具有Mosaico,一个拖放式电子邮件编辑器,用于向您的订阅者发送精美的电子邮件。

这个怎么运作

Nuntius 不知道您的订阅者模型。您可以使用您当前的使用模型,只要它实现了一些必需的方法。

为了允许您的最终用户选择收件人,您可以选择实施一个或多个“细分”模型。段模型实现所需的方法 get_subscribers_queryset

然后,您可以在 Django 管理面板中创建活动,并将它们发送到现有细分。

安装

  1. 将“nuntius”添加到您的 INSTALLED_APPS 设置中,如下所示:

        INSTALLED_APPS = [
            'django.contrib.admin',
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',
            ...
            'nuntius',
        ]
    
  2. 在您的项目中包含 Nuntius urlconf,urls.py如下所示:

        path('nuntius/', include('nuntius.urls')),
    
  3. 定义您的订阅者模型,使其与 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()}

  4. 告诉 Nuntius 如何在settings.py

    NUNTIUS_SUBSCRIBER_MODEL = 'myapp.MySubscriberModel'
    
  5. 在后台启动 nuntius worker。在生产环境中,这应该通过像 upstart 或 systemd 这样的进程监视器来完成。

    export DJANGO_SETTINGS_MODULE=myapp.settings
    python ./manage.py nuntius_worker
    
  6. 除非您使用自定义管理站点,否则 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_statusget_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 跟踪电子邮件状态并为您提供有关活动的统计信息,以及在订阅者反弹时更新订阅者状态。

  1. Anymail 文档中所述配置电子邮件跟踪。
  2. set_subscriber_status(self, email, status)在您的订阅者模型管理器上实现该方法。

Nuntius 会自动监听 Anymail 信号,并在需要时调用此方法。

处理非 nuntius 事件(可选)

如果您通过 Nuntius 以外的其他方式向订阅者发送电子邮件(例如交易电子邮件),您将收到与您发送的活动无关的 webhook 事件。默认情况下,Nuntius 将创建一个记录电子邮件和事件类型的活动结果事件,但它不会将其链接到活动或订阅者模型。

如果您希望您的事件始终链接到订阅者模型,则必须get_subscriber(self, email_address)在订阅者模型管理器上实现一个方法。

BaseSubscriberManager

Nuntius 与 BaseSubscriberManager 打包在一起,它实现 set_subscriber_statusget_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段对象的属性,如果属性不存在则为空字符串

在某些情况下,两个细节可能对您很重要:

  1. utm_campaign, utm_content, 和utm_term, 这些只是默认值,也可以直接在链接上设置。utm_source并且utm_medium将永远被覆盖。
  2. utm_content并且utm_term在发送时设置,之后不能更改。utm_campaign在点击时设置,在从 nuntius 跟踪 URL 重定向到目标 URL 期间,因此如果您在发送后更改广告系列级别的值,则所有新点击的值都会更改。

执照

版权归 Jill Royer 和 Arthur Cheysson 所有。

您可以在 GPLv3 条款下使用 Nuntius。