This project is unsupported. Please use https://github.com/anymail/django-anymail instead.
A Django email backend for use with Mailgun
Django-Mailgun is a drop-in mail backend for Django.
Install django-mailgun:
pip install django-mailgun
Add the following to your settings.py
:
EMAIL_BACKEND = 'django_mailgun.MailgunBackend' MAILGUN_ACCESS_KEY = 'ACCESS-KEY' MAILGUN_SERVER_NAME = 'SERVER-NAME' MAILGUN_REQUIRE_TLS = True/False MAILGUN_API_URL = 'https://api.mailgun.net/v3/'
Replace ACCESS-KEY
with the "API-KEY" value from your Mailgun account details and
SERVER-NAME
with the last part of your "API Base URL"
(eg. https://api.mailgun.net/v3/<your_server_name>), also found in your Mailgun
account details.
When setting MAILGUN_REQUIRE_TLS
to False
, Mailgun will deliver the message over a plain SMTP connection when an error occurs
establishing the TLS connection. Set this to True if you prefer the message to only be delivered over TLS and an error to be
raised when this is not possible.
Maulgun has introduced a new URL endpoint for their EU server. If your domain is created under the EU region you will need to
set the MAILGUN_API_URL
to 'https://api.eu.mailgun.net/v3/'
Now, when you use django.core.mail.send_mail
, Mailgun will send the messages.
Mailgun also includes the ability to send emails to a group of recipients via a single
API call (https://documentation.mailgun.com/user_manual.html#batch-sending). To make use of this,
you need to pass Recipient Variables along with your API call. To do so with Django-Mailgun,
add a valid JSON string to the extra_headers
attribute of EmailMessage
and Django-Mailgun will
remove the string from the headers and send it appropriately. For example:
email = EmailMessage('Hi!', 'Cool message for %recipient.first_name%', '[email protected]', [[email protected], [email protected]]) email.extra_headers['recipient_variables'] = '{"[email protected]":{"first_name":"Joe"}, "[email protected]":{"first_name":"Jane"}}' email.send()
When Jane receives her email, its body should read 'Cool message for Jane', and Joe will see 'Cool message for Joe'.
Mailgun provides the ability to track certain events that concern your emails. The
API exposes these options (see https://documentation.mailgun.com/api-sending.html#sending). These
options can also be passed to Mailgun's SMTP server (see "Passing Sending Options" under
https://documentation.mailgun.com/user_manual.html#sending-via-smtp). If you add
any of the SMTP options to the extra_headers
attribute of EmailMessage
, Django-Mailgun
will map those values over to the appropriate API parameter. For example:
email = EmailMessage('Hi!', 'Cool message for Joe', '[email protected]', [[email protected]]) email.extra_headers['X-Mailgun-Tag'] = ['Tag 1', 'Tag 2'] email.send()
When the email is sent, it will be tagged with 'Tag 1' and 'Tag 2'. You can provide a string for any value, or a list or tuple that contains strings for options that can take multiple values.
When sending, you can attach data to your messages by passing custom data to X-Mailgun-Variables header (see https://documentation.mailgun.com/user_manual.html#attaching-data-to-messages). Data should be formatted as JSON, and it will be included in any webhook event releated to the email containing the custom data. For example:
email = EmailMessage('Hi!', 'Cool message for Joe', '[email protected]', [[email protected]]) email.extra_headers['X-Mailgun-Variables'] = {'my-id': 'email_id', 'my-variable':'variable'} email.send()
Later, you can read this data in your Mailgun webhook handler. For example:
def mailgun_webhook(request): email_id = request.data.get('my-id') my_variable = request.data.get('my-variable') # Do something with your variables return Response(status=status.HTTP_200_OK)
NOTE: Django-Mailgun does NOT validate your data for compliance with Mailgun's API; it merely maps over whatever values you provide. For example, Mailgun's API states that no more than 3 tags are allowed per email, and each tag must be no greater than 128 characters (https://documentation.mailgun.com/user_manual.html#tagging). If you provide 4 tags, or a tag longer than 128 characters, Django-Mailgun will attempt to send such (potentially) invalid data. You must ensure what you send is appropriate.