跳转到主要内容

从Wagtail创建和发送电子邮件活动

项目描述

Birdsong Logo

Wagtail插件,允许您从Wagtail内部创建、发送、预览、编辑和测试电子邮件活动。活动模板使用mjml创建。

Birdsong Admin Menu

基本用法

安装Birdsong

pip install wagtail-birdsong

将以下内容添加到您的 INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'mjml',
    'birdsong',
    'wagtail_modeladmin',
    ...
]

创建一个新的应用程序,例如 email,创建一个 models.py 文件,其中包含一个扩展包含的 Campaign 模型的模型。Birdsong包含一些兼容的mjml流字段块以方便使用。

models.py

from birdsong.blocks import DefaultBlocks
from birdsong.models import Campaign
from django.db import models
from wagtail.admin.edit_handlers import StreamFieldPanel
from wagtail.core.fields import StreamField

class SaleCampaign(Campaign):
    body = StreamField(DefaultBlocks())

    panels = Campaign.panels + [
        StreamFieldPanel('body'),
    ]

然后在同一应用程序中,如果不存在,创建一个 wagtail_hooks.py 文件,这是为内容编辑器创建/编辑/发送活动的管理界面。

注意: CampaignAdmin 是Wagtail的 ModelAdmin 类的扩展,因此大多数相同的选项都可用于覆盖功能。

注意: 如果您想直接 modeladmin_register CampaignAdmin,可以使用 BIRDSONG_ADMIN_GROUP 设置禁用 BirdsongAdminGroup

wagtail_hooks.py

from birdsong.wagtail_hooks import (
    CampaignAdmin, ContactAdmin, BirdsongAdminGroup, modeladmin_re_register
)
from .models import SaleCampaign

class CampaignAdmin(CampaignAdmin):
    model = SaleCampaign

@modeladmin_re_register
class BirdsongAdminGroup(BirdsongAdminGroup):
    items = (CampaignAdmin, ContactAdmin)

{app_folder}/templates/mail/{model_name}.html 中创建您的活动模板,例如 email/templates/mail/sale_campaign.html,或者覆盖活动模型的 get_template 方法。

注意: 活动模板使用django-mjml创建响应式、设计良好的电子邮件。要了解如何设置django-mjml,请阅读此处的文档。Birdsong中包含一个基模板,可以扩展。

sale_campaign.html

{% extends "birdsong/mail/base_email.html" %}

{% block email_body %}
<mj-section>
    <mj-column>
        <mj-text>Hello {{ contact.email }}!</mj-text>
        {% for b in self.body %}
            {{ b }}
        {% endfor %}
    </mj-column>
</mj-section>
{% endblock email_body %}

现在您可以开始了!

Birdsong Preview

自定义联系人模型

默认情况下,包含的Contact模型用于每个活动,但您可能想要存储额外的数据,如姓名和偏好。您可以通过在活动的管理中设置选项来覆盖默认的Contact模型。

models.py

from birdsong.models import Contact
from django.db import models

class ExtendedContact(Contact):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    location = models.CharField(max_length=255)

wagtail_hooks.py

from birdsong.wagtail_hooks import (
    CampaignAdmin, ContactAdmin, BirdsongAdminGroup, modeladmin_re_register
)
from .models import SaleCampaign, ExtendedContact # NOTE: Import your custom Contact model

class CampaignAdmin(CampaignAdmin):
    campaign = SaleCampaign
    contact_class = ExtendedContact # NOTE: Teach CampaignAdmin to use your custom Contact model

class ContactAdmin(ContactAdmin): # NOTE: Overload ContactAdmin to list/edit/add your Contacts
    model = ExtendedContact
    list_diplay = ('email', 'first_name', 'last_name', 'location')

@modeladmin_re_register
class BirdsongAdminGroup(BirdsongAdminGroup):
    items = (CampaignAdmin, ContactAdmin)

base.py

# You may want to redefine the test contact (used in previews) with your new ExtendedContact fields
BIRDSONG_TEST_CONTACT = {
    'first_name': 'Wagtail', # new ExtendedContact field
    'last_name': 'Birdsong', # new ExtendedContact field
    'email': 'birdsong@example.com',
    'location': 'us', # new ExtendedContact field
}

基于联系人属性的过滤

您可能只想向您的部分Contact模型发送活动。使用django-filter创建过滤器并将其添加到CampaignAdmin,允许用户基于任何属性进行过滤。

filters.py

from django_filters import FilterSet
from django_filters.filters import AllValuesFilter

from .models import ExtendedContact

class ContactFilter(FilterSet):
    location = AllValuesFilter()

    class Meta:
        model = ExtendedContact
        fields = ('location',)

wagtail_hooks.py

from birdsong.wagtail_hooks import (
    CampaignAdmin, ContactAdmin, BirdsongAdminGroup, modeladmin_re_register
)
from .models import SaleCampaign, ExtendedContact
from .filters import ContactFilter # NOTE: Import your custom Contact filter

class CampaignAdmin(CampaignAdmin):
    campaign = SaleCampaign
    contact_class = ExtendedContact
    contact_filter_class = ContactFilter # NOTE: Use your custom Contact filter

class ContactAdmin(ContactAdmin):
    model = ExtendedContact
    list_diplay = ('email', 'first_name', 'last_name', 'location')

@modeladmin_re_register
class BirdsongAdminGroup(BirdsongAdminGroup):
    items = (CampaignAdmin, ContactAdmin)

用户现在可以根据位置向联系人子集发送活动。

退订URL

在Birdsong中,提供了一个基本的退订方式,只需包含URL配置,并将退订URL添加到您的电子邮件模板中即可。

urls.py

from birdsong import urls as birdsong_urls
from django.urls import include, path

urlpatterns = [
    ...
    path('mail/', include(birdsong_urls)),
    ...
]

sale_campaign.html

{% extends "birdsong/mail/base_email.html" %}

{% block email_body %}
<mj-section>
    <mj-column>
        <mj-text>Hello {{ contact.email }}!</mj-text>
        {% for b in self.body %}
            {{ b }}
        {% endfor %}
    </mj-column>
</mj-section>
<mj-section>
    <mj-column>
        <mj-text align="center">
            Click <a href="{{ site.full_url }}{% url 'birdsong:unsubscribe' contact.id %}">here</a> to unsubscribe.
        </mj-text>
    </mj-column>
</mj-section>
{% endblock email_body %}

未来功能

  • 更多测试!

  • 完善的文档

  • 除了SMTP之外的其他后端用于发送电子邮件,以便收集分析数据(电子邮件打开、退订等)

  • 编辑时重新加载预览

  • 更广泛的营销活动权限(发送、预览、测试发送)

项目详情


下载文件

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

源分布

wagtail_birdsong-2.0.0.tar.gz (20.2 kB 查看哈希)

上传时间

构建分布

wagtail_birdsong-2.0.0-py3-none-any.whl (25.7 kB 查看哈希)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面