Newsletter application for the Django web framework.
What is it?
Django app for managing multiple mass-mailing lists with both plaintext as well as HTML templates with rich text widget integration, images and a smart queueing system all right from the admin interface.
We are currently using this package in several large to medium scale production environments, but it should be considered a permanent work in progress.
Most if not all strings are available in Dutch, German and English. Contributions to translations are welcome through Transifex.
Currently, django-newsletter is being tested to run on Python 2.5-2.7 and the latest Django 1.3 and 1.4 releases. Django 1.5 support is underway.
Please refer to requirements.txt for an updated list of required packes.
Get it from the Cheese Shop:
pip install django-newsletter
Or get the latest & greatest from Github and link it to your application tree:
pip install -e git://github.com/dokterbob/django-newsletter.git#egg=django-newsletter
(In either case it is recommended that you use VirtualEnv in order to keep your Python environment somewhat clean.)
Add newsletter and to INSTALLED_APPS in settings.py and make sure that your favourite rich text widget (optional), some Django contrib dependencies, sorl-thumbnail and django-extensions (the latter is used for the submission jobs) are there as well:
INSTALLED_APPS = ( 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.auth', 'django.contrib.sites', ... # Imperavi (or tinymce) rich text editor is optional 'imperavi', 'django_extensions', 'sorl.thumbnail', ... 'newsletter', ... )
Install and configure your preferred rich text widget (optional).
# Using django-imperavi NEWSLETTER_RICHTEXT_WIDGET = "imperavi.widget.ImperaviWidget" # Using django-tinymce NEWSLETTER_RICHTEXT_WIDGET = "tinymce.widgets.TinyMCE"
If not set, django-newsletter will fall back to Django's default TextField widget.
Import subscription, unsubscription and archive URL's somewhere in your urls.py:
urlpatterns = patterns('', ... (r'^newsletter/', include('newsletter.urls')), ... )
Create required data structure and load default template fixture:
./manage.py syncdb ./manage.py loaddata default_templates
Change the default contact email listed in templates/newsletter/subscription_subscribe.html and templates/newsletter/subscription_update.html.
Run the tests to see if it all works:
If this fails, please contact me! If it doesn't: that's a good sign, chap. You'll probably have yourself a working configuration!
Add jobs for sending out mail queues to crontab:
@hourly /path/to/my/project/manage.py runjobs hourly @daily /path/to/my/project/manage.py runjobs daily @weekly /path/to/my/project/manage.py runjobs weekly @monthly /path/to/my/project/manage.py runjobs monthly
South migrations / upgrading
When upgrading from a pre-South version of newsletter to a current release (in a project for which South has been enabled), you might have to fake the initial migration as the DB tables already exist. This can be done by running the following command:
./manage.py migrate newsletter 0001 --fake
- Start the development server: ./manage.py runserver
- Navigate to /admin/ and: behold!
- Put a submission in the queue.
- Submit your message with ./manage.py runjob submit
- For a proper understanding, please take a look at the model graph.
Fairly extensive tests are available for internal frameworks, web (un)subscription and mail sending. Sending a newsletter to large groups of recipients (+10k) has been confirmed to work in multiple production environments. Tests for pull req's and the master branch are automatically run through Travis CI.
If you find any bugs or have feature request for django-newsletter, don't hesitate to open up an issue on GitHub (but please make sure your issue hasn't been noticed before, finding duplicates is a waste of time). When modifying or adding features to django-newsletter in a fork, be sure to let me know what you're building and how you're building it. That way we can coordinate whether, when and how it will end up in the main fork and (eventually) an official release.
In general: thanks for the support, feedback, patches and code that's been flowing in over the years! Django has a truly great community. <3
This application is released under the GNU Affero General Public License version 3.
Unlimited private and public hosted repositories. Free for small teams!Sign up for free Close