Anymail lets you send and receive email in Django using your choice of transactional email service providers (ESPs). It extends the standard django.core.mail with many common ESP-added features, providing a consistent API that avoids locking your code to one specific ESP (and making it easier to change ESPs later if needed).
Get started
Install Anymail from PyPI
$ pip install "django-anymail[mailersend]"
The [mailersend] part installs any additional packages needed.
Edit your project's settings.py:
INSTALLED_APPS = [
# ...
"anymail",
# ...
]
ANYMAIL = {
# (exact settings here depend on your ESP...)
"MAILERSEND": "<your MailerSend key>",
"MAILERSEND_SENDER_DOMAIN": 'mg.example.com', # your MailerSend domain, if needed
}
EMAIL_BACKEND = "anymail.backends.mailersend.EmailBackend"
DEFAULT_FROM_EMAIL = "you@example.com" # if you don't already have this in settings
SERVER_EMAIL = "your-server@example.com" # ditto (default from-email for Django errors)
Now the regular Django email functions will send through MailerSend:
from django.core.mail import send_mail
send_mail("It works!", "This will get sent through MailerSend",
"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: https://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="https://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, including receiving messages and tracking sent message status.