Mixing email backends
Since you are replacing Django’s global EMAIL_BACKEND
, by default
Anymail will handle all outgoing mail, sending everything through your ESP.
You can use Django mail’s optional connection
argument to send some mail through your ESP and others through a different system.
This could be useful, for example, to deliver customer emails with the ESP, but send admin emails directly through an SMTP server:
from django.core.mail import send_mail, get_connection
# send_mail connection defaults to the settings EMAIL_BACKEND, which
# we've set to Anymail's Mailgun EmailBackend. This will be sent using Mailgun:
send_mail("Thanks", "We sent your order", "[email protected]", ["[email protected]"])
# Get a connection to an SMTP backend, and send using that instead:
smtp_backend = get_connection('django.core.mail.backends.smtp.EmailBackend')
send_mail("Uh-Oh", "Need your attention", "[email protected]", ["[email protected]"],
connection=smtp_backend)
# You can even use multiple Anymail backends in the same app:
sendgrid_backend = get_connection('anymail.backends.sendgrid.EmailBackend')
send_mail("Password reset", "Here you go", "[email protected]", ["[email protected]"],
connection=sendgrid_backend)
# You can override settings.py settings with kwargs to get_connection.
# This example supplies credentials for a different Mailgun sub-acccount:
alt_mailgun_backend = get_connection('anymail.backends.mailgun.EmailBackend',
api_key=MAILGUN_API_KEY_FOR_MARKETING)
send_mail("Here's that info", "you wanted", "[email protected]", ["[email protected]"],
connection=alt_mailgun_backend)
You can supply a different connection to Django’s
send_mail()
and send_mass_mail()
helpers,
and in the constructor for an
EmailMessage
or EmailMultiAlternatives
.
(See the django.utils.log.AdminEmailHandler
docs for more information
on Django’s admin error logging.)
You could expand on this concept and create your own EmailBackend that dynamically switches between other Anymail backends—based on properties of the message, or other criteria you set. For example, this gist shows an EmailBackend that checks ESPs’ status-page APIs, and automatically falls back to a different ESP when the first one isn’t working.