跳转到主要内容

一个用于通过电子邮件向联系名单发送新闻通讯的Django应用程序。

项目描述

问题在于

如何将联系数据库与邮件列表结合起来,并通过Django发送新闻通讯?

假设我们有一个包含某种类型配置文件或类似django.contrib.auth的应用程序,并且您想向他们发送新闻通讯并跟踪活动。

功能

与其长篇大论,以下是主要功能的列表

  • 与其他Django模型结合的能力。

  • 可以在新闻通讯模板中使用变量。

  • 邮件列表管理(合并、导入...)。

  • VCard 3.0格式的联系信息导入/导出。

  • 可配置的SMTP服务器,具有流量限制管理。

  • 工作组。

  • 可以发送新闻通讯预览。

  • 订阅和退订邮件列表。

  • 新闻通讯中的附件。

  • 为每个用户提供唯一的URL。

  • 跟踪统计。

架构

在应用程序架构层面,我们可以看到需要解释的两个原创性。

内容类型

内容类型应用程序用于将任何联系人模型实例链接到另一个模型实例。这允许您创建与不同应用程序相关联的不同类型的联系人,并随时检索关联。

如果某些信息位于链接的模型实例中,这特别有用。

定时任务/命令

直到您运行send_newsletter命令,emencia.django.newsletter应用程序将不会向网站中注册的新闻通讯发送。

$ python manage.py send_newsletter

此命令将启动根据新闻通讯SMTP服务器的信用额度需要启动的新闻通讯。这意味着并非所有新闻通讯都会在命令结束时发送,因为如果您使用公共SMTP服务器,在达到发送限制时可能会暂时被禁止。为了避免被禁止,所有新闻通讯不会同时和立即发送。

因此,建议每小时创建一个cronjob来启动此命令。

安装

您可以从http://github.com/Fantomas42/emencia-django-newsletter获取最新资源,并运行安装脚本

$ python setup.py install

或使用pip

$ pip install -e git://github.com/Fantomas42/emencia-django-newsletter.git#egg=emencia.django.newsletter

对于最新稳定版本,请使用easy_install

$ easy_install emencia.django.newsletter

应用程序

然后在项目的设置中的INSTALLED_APPS部分注册emencia.django.newsletteradmincontenttypestagging

INSTALLED_APPS = (
  # Your favorites apps
  'django.contrib.contenttypes',
  'django.contrib.admin',
  'tagging',
  'emencia.django.newsletter',)

模板上下文处理器

如果您还没有,请添加以下模板上下文处理器。

TEMPLATE_CONTEXT_PROCESSORS = (
  'django.core.context_processors.auth',
  'django.core.context_processors.i18n',
  'django.core.context_processors.request',
  'django.core.context_processors.media',
  'emencia.django.newsletter.context_processors.media',)

URLs

在您的项目urls.py中,添加以下行以包含新闻通讯的urls,以便在HTML中提供新闻通讯。

url(r'^newsletters/', include('emencia.django.newsletter.urls')),

请注意,此urlset提供方便使用,但您可以自定义urls。

url(r'^newsletters/', include('emencia.django.newsletter.urls.newsletter')),
url(r'^mailing/', include('emencia.django.newsletter.urls.mailing_list')),
url(r'^tracking/', include('emencia.django.newsletter.urls.tracking')),
url(r'^statistics/', include('emencia.django.newsletter.urls.statistics')),

媒体文件

您必须从emencia/django/newsletter/media/目录到您的媒体目录创建一个符号链接或创建一个名为edn的副本,但如果要更改此值,请根据需要定义settings.py中的NEWSLETTER_MEDIA_URL。

别忘了提供这个url。

同步

现在,您可以运行一个syncdb来将模型安装到您的数据库中。

数据库管理系统考虑事项

不推荐在生产中使用SQLite。因为SQL查询限制为999个变量,您无法在Django的admin模块中创建超过此限制的邮件列表。建议使用MySQL或PgSQL。

如何使用TinyMCE编辑新闻通讯

对于最终用户来说,拥有一个WYSIWYG编辑器来创建新闻通讯可能很有用。WYSIWYG编辑器的选择是自由的,描述的方法可以应用于任何东西,但我们将关注TinyMCE,因为它具有许多功能,并在其中加载模板的有用插件。

首先,将django-tinymce应用程序安装到您的项目中。

现在,您将在项目的根目录中编写一个名为admin.py的模块。此模块将覆盖emencia.django.newsletter提供的NewsletterAdmin类,并使用TinyMCE编辑器,并将覆盖的类注册到admin站点中。

from django import forms
from django.contrib import admin

from tinymce.widgets import TinyMCE
from emencia.django.newsletter.models import Newsletter
from emencia.django.newsletter.admin import NewsletterAdmin


class NewsletterTinyMCEForm(forms.ModelForm):
    content = forms.CharField(widget=TinyMCE(attrs={'cols': 150, 'rows': 80}))

    class Meta:
        model = Newsletter

class NewsletterTinyMCEAdmin(NewsletterAdmin):
    form = NewsletterTinyMCEForm

admin.site.unregister(Newsletter)
admin.site.register(Newsletter, NewsletterTinyMCEAdmin)

最后一步是调用您的模块以加载代码。一个好的解决方案是在项目的urls.py文件中导入admin.py模块。

import yourproject.admin

享受吧!

如何将您的配置文件应用程序与emencia.django.newsletter关联

如果您想快速将联系人导入到邮件列表中,例如,您可以为您的模型编写一个admin的操作。

我们假设我们有一个名为Profile的模型中的字段emailfirst_namelast_name

在其AdminModel定义中添加此方法,并将其注册到actions属性中。

class ProfileAdmin(admin.ModelAdmin):

    def make_mailing_list(self, request, queryset):
        from emencia.django.newsletter.models import Contact
        from emencia.django.newsletter.models import MailingList

        subscribers = []
        for profile in queryset:
          contact, created = Contact.objects.get_or_create(email=profile.mail,
                                                           defaults={'first_name': profile.first_name,
                                                                     'last_name': profile.last_name,
                                                                     'content_object': profile})
        subscribers.append(contact)
        new_mailing = MailingList(name='New mailing list',
                                  description='New mailing list created from admin/profile')
        new_mailing.save()
        new_mailing.subscribers.add(*subscribers)
        new_mailing.save()
        self.message_user(request, '%s succesfully created.' % new_mailing)
    make_mailing_list.short_description = 'Create a mailing list'

    actions = ['make_mailing_list',]

此操作将创建或检索所有为创建邮件列表所需的Contact实例。

在此之后,您可以向此邮件列表发送新闻通讯。

开发

提供了一个Buildout脚本,以正确初始化任何想要贡献的项目。

首先,请使用VirtualEnv来保护您的系统。

按照以下步骤开始开发

$ git clone git://github.com/Fantomas42/emencia-django-newsletter.git
$ virtualenv --no-site-packages emencia-django-newsletter
$ cd emencia-django-newsletter
$ source ./bin/activate
$ python bootstrap.py
$ ./bin/buildout

构建脚本将解决开发应用程序所需的所有依赖项。

完成这些操作后,您就可以开始开发项目了。

运行此命令以启动测试。

$ ./bin/test

很简单,不是吗?

数据库表示

https://github.com/Fantomas42/emencia-django-newsletter/raw/master/docs/graph_model.png

变更日志

0.1dev(未发布)

  • 初始发布

项目详情


下载文件

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

源分布

emencia.django.newsletter-0.2.tar.gz (506.6 KB 查看哈希值

上传时间:

支持