从Wagtail创建和发送电子邮件活动
项目描述
Wagtail插件,允许您从Wagtail内部创建、发送、预览、编辑和测试电子邮件活动。活动模板使用mjml创建。
基本用法
安装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 %}
现在您可以开始了!
自定义联系人模型
默认情况下,包含的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之外的其他后端用于发送电子邮件,以便收集分析数据(电子邮件打开、退订等)
编辑时重新加载预览
更广泛的营销活动权限(发送、预览、测试发送)
项目详情
下载文件
下载适合您平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。