Django email backends for Mailgun, Postmark, SendGrid and other transactional ESPs
Project description
EARLY DEVELOPMENT
This project is undergoing rapid development to get to a 1.0 release. Before 1.0, minor version bumps might include breaking changes. Please check the release notes
Anymail integrates several transactional email service providers (ESPs) into Django, with a consistent API that lets you use ESP-added features without locking your code to a particular ESP.
It currently fully supports Mailgun, Postmark, SendGrid, and SparkPost, and has limited support for Mandrill.
Anymail normalizes ESP functionality so it “just works” with Django’s built-in django.core.mail package. It includes:
Support for HTML, attachments, extra headers, and other features of Django’s built-in email
Extensions that make it easy to use extra ESP functionality, like tags, metadata, and tracking, with code that’s portable between ESPs
Simplified inline images for HTML email
Normalized sent-message status and tracking notification, by connecting your ESP’s webhooks to Django signals
“Batch transactional” sends using your ESP’s merge and template features
Support is also planned for:
Normalized inbound email processing through your ESP
Anymail is released under the BSD license. It is extensively tested against Django 1.8–1.10 (including Python 2.7, Python 3 and PyPy). Anymail releases follow semantic versioning.
Resources
Full documentation: https://anymail.readthedocs.io/en/v0.4.2/
Package on PyPI: https://pypi.python.org/pypi/django-anymail
Project on Github: https://github.com/anymail/django-anymail
Anymail 1-2-3
This example uses Mailgun, but you can substitute Postmark or SendGrid or SparkPost or any other supported ESP where you see “mailgun”:
Install Anymail from PyPI:
$ pip install django-anymail[mailgun]
(The [mailgun] part installs any additional packages needed for that ESP. Mailgun doesn’t have any, but some other ESPs do.)
Edit your project’s settings.py:
INSTALLED_APPS = ( ... "anymail" ) ANYMAIL = { "MAILGUN_API_KEY": "<your Mailgun key>", } EMAIL_BACKEND = "anymail.backends.mailgun.MailgunBackend" # or sendgrid.SendGridBackend, or... DEFAULT_FROM_EMAIL = "you@example.com" # if you don't already have this in settings
Now the regular Django email functions will send through your chosen ESP:
from django.core.mail import send_mail send_mail("It works!", "This will get sent through Mailgun", "Anymail Sender <from@example.com>", ["to@example.com"])
You could send an HTML message, complete with an inline image, custom tags and metadata:
from django.core.mail import EmailMultiAlternatives from anymail.message import attach_inline_image_file msg = EmailMultiAlternatives( subject="Please activate your account", body="Click to activate your account: http://example.com/activate", from_email="Example <admin@example.com>", to=["New User <user1@example.com>", "account.manager@example.com"], reply_to=["Helpdesk <support@example.com>"]) # Include an inline image in the html: logo_cid = attach_inline_image_file(msg, "/path/to/logo.jpg") html = """<img alt="Logo" src="cid:{logo_cid}"> <p>Please <a href="http://example.com/activate">activate</a> your account</p>""".format(logo_cid=logo_cid) msg.attach_alternative(html, "text/html") # Optional Anymail extensions: msg.metadata = {"user_id": "8675309", "experiment_variation": 1} msg.tags = ["activation", "onboarding"] msg.track_clicks = True # Send it: msg.send()
See the full documentation for more features and options.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.