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

wagtail-birdsong的Python项目详细描述


Birdsong Logo

一个wagtail插件,允许你在wagtail中创建、发送、预览、编辑和测试电子邮件活动。 使用mjml创建活动模板。在

基本用途

安装鸟鸣:

pip install wagtail-birdsong

将以下内容添加到已安装的应用程序中:

^{pr2}$

制作一个新的应用程序,例如email,创建一个models.py,该模型扩展了包含的Campaign模型。为了方便起见,birdsong中包含了一些兼容的mjml streamfield块。在

frombirdsong.blocksimportDefaultBlocksfrombirdsong.modelsimportCampaignfromdjango.dbimportmodelsfromwagtail.admin.edit_handlersimportStreamFieldPanelfromwagtail.core.fieldsimportStreamFieldclassSaleEmail(Campaign):body=StreamField(DefaultBlocks())panels=Campaign.panels+[StreamFieldPanel('body'),]

然后在同一个应用程序中,创建一个wagtail_hooks.py,如果它不存在,这就是创建管理员的地方 内容编辑器可以创建/编辑/发送活动。在

CampaignAdmin只是Wagtail的ModelAdmin类的一个扩展,因此大多数相同的选项都可以用于重写功能。在

fromwagtail.contrib.modeladmin.optionsimportmodeladmin_registerfrombirdsong.optionsimportCampaignAdminfrom.modelsimportSaleEmail@modeladmin_registerclassSaleEmailAdmin(CampaignAdmin):campaign=SaleEmailmenu_label='Sale Email'menu_icon='mail'menu_order=200

{app_folder}/templates/mail/{model_name}.html中创建您的活动模板,例如email/templates/mail/sale_email.html, 或者重写活动模型上的get_template方法。在

营销活动模板使用django-mjml编写响应迅速、设计良好的电子邮件。要了解如何设置django-mjml,可以阅读文档here。Birdsong中包含一个可以扩展的基本模板。在

sale_email.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 %}

你现在可以走了!在

Screenshot

自定义联系人模型

默认情况下,每个活动都使用包含的Contact模型,但您可能希望存储额外的数据,如名称和首选项。 您可以通过在“管理”上为您的活动设置一个选项来覆盖默认的Contact模型:

models.py

frombirdsong.modelsimportContactfromdjango.dbimportmodelsclassExtendedContact(Contact):first_name=models.CharField(max_length=255)last_name=models.CharField(max_length=255)location=models.CharField(max_length=255)

wagtail_hooks.py

fromwagtail.contrib.modeladmin.optionsimportModelAdmin,modeladmin_registerfrombirdsong.optionsimportCampaignAdminfrom.modelsimportExtendedContact,SaleEmail@modeladmin_registerclassSaleEmailAdmin(CampaignAdmin):campaign=SaleEmailmenu_label='Sale Email'menu_icon='mail'menu_order=200contact_class=ExtendedContact# You may want to add your own modeladmin here to list/edit/add contacts@modeladmin_registerclassContactAdmin(ModelAdmin):model=ExtendedContactmenu_label='Contacts'menu_icon='user'list_diplay=('email','first_name','last_name','location')

过滤联系人属性

您可能只想将活动发送到您的Contact模型的一个子集。使用django-filter创建筛选器并将其添加到CampaignAdmin中,用户可以对任何属性进行筛选。在

filters.py

fromdjango_filtersimportFilterSetfromdjango_filters.filtersimportAllValuesFilterfrom.modelsimportExtendedContactclassContactFilter(FilterSet):location=AllValuesFilter()classMeta:model=ExtendedContactfields=('location',)

wagtail_hooks.py

fromwagtail.contrib.modeladmin.optionsimportmodeladmin_registerfrombirdsong.optionsimportCampaignAdminfrom.filtersimportContactFilterfrom.modelsimportExtendedContact,SaleEmail@modeladmin_registerclassSaleEmailAdmin(CampaignAdmin):campaign=SaleEmailmenu_label='Sale Email'menu_icon='mail'menu_order=200contact_class=ExtendedContactcontact_filter_class=ContactFilter

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

取消订阅url

birdsong是联系人退订的基本方式,只需包含url配置并将退订url添加到您的电子邮件模板中。在

urls.py

frombirdsongimporturlsasbirdsong_urlsfromdjango.urlsimportinclude,pathurlpatterns=[...path('mail/',include(birdsong_urls)),...]

sale_email.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>
    Click <ahref="{{ site.full_url }}{% url 'birdsong:unsubscribe' contact.id %}">here</a> to unsubscribe.
</mj-section>
{% endblock email_body %}

未来功能:

  • 更多测试!在
  • 适当的文件
  • 后端发送电子邮件的SMTP以外的邮件,以便收集分析(电子邮件打开、退回等)
  • 编辑时重新加载预览
  • 更广泛的活动权限(发送、预览、测试发送)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将字符串转换为自定义对象   java如何从socket方法获取数据?   Java中的soap读取回车和新行   java在单击时替换图像   java推荐的使用RXJava执行异步任务的方法   java MySql连接器JDBC驱动程序不支持连接池吗?   java将活动堆栈清理到顶部   java计数用户输入的数量   java从webservice下载大文件导致应用程序性能问题   JavaLocalDate。EPOCH不可用   java如何在使用Selenium等待一定时间后,在页面无法加载(get(url))时自动刷新页面   java Calendar setLenient方法不允许检查年份字段的健全性   java Eclipse和intelliJ 安卓 SDK问题   java为什么我可以在没有super关键字的情况下调用父方法?   java iText的PDF格式不好