Package: django-maja-newsletter
The problematic was :How to couple a contact base to a mailing list and sending newsletters throught Django ?Imagine that we have an application containing some kind of profiles or something like thedjango.contrib.authand you want to send newsletters to them and tracking the activity.This package is a fork of of emencia-django-newsletter with django 1.6 compatibility and other customizationsContentsFeaturesArchitectureContent typesCronjob/CommandInstallationDependenciesGetting the codeApplicationsUrlsMedia FilesSynchronizationSettingsDBMS considerationsHOWTO use TinyMCE for editing the newslettersHOWTO couple your profile application with maja_newsletterDevelopmentDatabase RepresentationChangelog0.30.20.1dev (unreleased)FeaturesMore than a long speech, here the list of the main features :Coupling capacities with another django model.Variables can be used in the newsletter’s templates.Mailing list managements (merging, importing…).Import/Export of the contact in VCard 3.0.Configurable SMTP servers with flow limit management.Working groups.Can send newsletter previews.Subscriptions and unsubscriptions to mailing list.Attachments in newsletters.Unique urls for an user.Tracking statistics.ArchitectureAt the level of the application architecture, we can see 2 originalities who need to be explained.Content typesThecontent typesapplication is used to link anyContactmodel instance to another model instance.
This allow you to create different kinds of contact linked to differents application, and retrieve the association at anytime.This is particulary usefull with the templates variables if certain informations are located in the model instance linked.Cronjob/CommandThe maja_newsletter application will never send the newsletters registered in the site until you launch thesend_newslettercommand.$ python manage.py send_newsletterThis command will launch the newsletters who need to be launched accordingly to the credits of the SMTP server of the newsletter.
That’s mean that not all newsletters will be expedied at the end of the command because if you use a public SMTP server you can be banished temporarly if you reach the sending limit.
To avoid banishment all the newsletters are not sended in the same time and immediately.So it is recommanded to create acronjobfor launching this command every hours for example.InstallationDependenciesMake sure to install these packages prior to installation :Django >= 1.2html2textBeautifulSoupdjango-taggingvobjectxlwtxlrdThe package below is optionnal but handy for rendering a webpage in your newsletter.lxmlGetting the codeYou could retrieve the last sources fromhttp://github.com/nephila/django-maja-newsletterand running the installation script$ python setup.py installor use pip$ pip install -e git://github.com/nephila/django-maja-newsletter.git#egg=maja_newsletterFor the latest stable version use easy_install$ easy_install django-maja-newsletterApplicationsThen registermaja_newsletter,admin,contenttypesandtaggingin the INSTALLED_APPS section of your project’s settings.INSTALLED_APPS = (
  # Your favorites apps
  'django.contrib.contenttypes',
  'django.contrib.sites',
  'django.contrib.admin',
  'django.contrib.sessions',
  'tagging',
  'maja_newsletter',)UrlsIn your project urls.py adding this following line to include the newsletter’s urls for serving the newsletters in HTML.url(r'^newsletters/', include('maja_newsletter.urls')),Note this urlset is provided for convenient usage, but you can do something like that if you want to customize your urls :url(r'^newsletters/', include('maja_newsletter.urls.newsletter')),
url(r'^mailing/', include('maja_newsletter.urls.mailing_list')),
url(r'^tracking/', include('maja_newsletter.urls.tracking')),
url(r'^statistics/', include('maja_newsletter.urls.statistics')),Media FilesYou have to make a symbolic link from maja_newsletter/media/edn/ directory to your media directory or make a copy namededn,
but if want to change this value, define NEWSLETTER_MEDIA_URL in the settings.py as appropriate.Don’t forget to serve this url.SynchronizationNow you can run asyncdbfor installing the models into your database.SettingsYou have to add in your settings the email address used to send the newsletter :NEWSLETTER_DEFAULT_HEADER_SENDER = 'My NewsLetter <newsletter@myhost.com>'DBMS considerationsIt’s not recommended to use SQLite for production use. Because is limited to 999
variables into a SQL query, you can not create a Mailing List greater than this limitations
in the Django’s admin modules. Prefer MySQL ou PgSQL.HOWTO use TinyMCE for editing the newslettersIt can be usefull for the end user to have a WYSIWYG editor for the
creation of the newsletter. The choice of the WYSIWYG editor is free and
the described method can be applied for anything, but we will focus on
TinyMCE because he has many features and a usefull plugin for loading
templates within it.First of all install thedjango-tinymceapplication into your project.That’s done, enjoy !HOWTO couple your profile application with maja_newsletterIf you wan to quickly import your contacts into a mailing list for example,
you can write an admin’s action for your model.We suppose that we have the fieldsemail,first_nameandlast_namein a models nameProfile.In his AdminModel definition add this method and register it into theactionsproperty.class ProfileAdmin(admin.ModelAdmin):

    def make_mailing_list(self, request, queryset):
        from maja_newsletter.models import Contact
        from maja_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']This action will create or retrieve all theContactinstances needed for the mailing list creation.After this you can send a newsletter to this mailing list.DevelopmentABuildoutscript is provided to properly initialize the project
for anybody who wants to contribute.First of all, please useVirtualEnvto protect your system.Follow these steps to start the development :$ git clone git://github.com/nephila/django-maja-newsletter.git
$ virtualenv --no-site-packages maja_newsletter
$ cd maja_newsletter
$ source ./bin/activate
$ python bootstrap.py
$ ./bin/buildoutThe buildout script will resolve all the dependancies needed to develop the application.Once these operations are done, you are ready to develop on the project.Run this command to launch the tests.$ ./bin/testOr you can also launch the demo.$ ./bin/demo syncdb
$ ./bin/demo runserverPretty easy no ?Database RepresentationChangelog0.3Use UTM TagsDemo in the packageImproving importationPremailer for HTML page.New importation capabilitiesCompatibility with django 1.3.1Unique key variable for newsletter’s titleA lot of bug fixes0.2Plugin for django-cmsMultiple importation formatCompatibility with django 1.2A lot of bug fixes0.1dev (unreleased)Initial release