Adding ESP to supercharge your Django Email 🚀
Tags: django, webdev, djangoemail, email
Published: 2024-06-26 17:16:18

Whether you are trying to build your own SAAS or building a project for client a its very important to have email integration for sending invoice, newsletter's, updates and more.

Using the default Django's SMTP email is not scalable, with emails hitting the per day limits or going to spam folders.

[Email Service Providers](https://templates.foxcraft.tech/blog/b/what-are-email-service-providers) (ESPs) offer scalable, highly deliverable, trackable, and compliant email solutions. Many ESPs provide API access, enabling you to send, schedule, and customize emails efficiently. Setting up an ESP for your transactional emails is quick and straightforward, often taking less than 15 minutes, making it a highly recommended addition to your email strategy.

There are many email service providers such as [Sendgrid](https://sendgrid.com/en-us), Brevo, MailGun, Amazon SES etc.

In this tutorial we'll see how to add [Brevo ESP](https://www.brevo.com/) (formally sendinblue) to Django.

Before we get started make sure to signup to Brevo and fill in the details to keep your email complainant.

## Django Setup for ESP
We'll be using Anymail package as it offers API compatible with Django's existing email and can be configured for any ESP.

Start by installing anymail

```
pip install django-anymail[brevo]
```

Now go to you settings.py and add anymail to `INSTALLED_APPS`
```py
INSTALLED_APPS = [
    .
    .
    'anymail',
]
```
Now add brevo as your email backend

```py
EMAIL_BACKEND = "anymail.backends.brevo.EmailBackend"

BREVO_API_URL = "https://api.brevo.com/v3/" # optional

ANYMAIL = {
                "BREVO_API_KEY": 'BREVO_API_KEY', # use brevo api key 
                "IGNORE_RECIPIENT_STATUS": True,
            }
DEFAULT_FROM_EMAIL = 'ben@example.com'  # default from email
```
Anymail works with default Django email, so now import `send_mail`

```py
from django.core.mail import  send_mail

subject = "Test transactional email"
body = f"Hi\nthis is a test email"
html_message = """
 Hi,<br> This is a brevo test mail.
"""

send_mail(subject, message=body, from_email=None, 
          recipient_list=['james@example.com'], 
            html_message=html_message)
```
The `html_message` is necessary to send via Brevo, so ensure you add it. If the `from_email` is set to `None` It uses the default mail you set up in the `settings.py` file.

If you need to add cutsom parameters for brevo to fill in, just use `{{params.name}}` read more about [Brevo templating](https://help.brevo.com/hc/en-us/articles/360000946299-Personalize-your-emails-using-Brevo-Template-Language)

That's all, all you need is you Brevo API key and you'll be able to send messages via Brevo

## Brevo API Key
Go to the top right corner dropdown -> click on SMTP & API


![Brevo API Key](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jaf89ntvk111diu9icgo.png)

Now from the API's tab, click on generate new API key

![generate brevo key](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4jmop07bpa8oazzov3ms.png)


Copy the key and Paste it in the `settings.py` file and you are good to go.

When you send your first test email, you may get a email from Brevo asking you to add it to authorized IP, once you set it, it'll start sending the emails.

You can also disable this by going to profile dropdown -> Security ->Authorized IPs

![Brevo authorized IP](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nqa5m82i8dfaqcva84ji.png)


## Advanced usage
You can also create templates in Brevo and send customized bulk emails with just one API call.

Start by creating a [template](https://app.brevo.com/templates/listing/email). Follow the steps in Brevo to create the template.

Now to send the via template lets make some changes to the code

```py
from django.core.mail import EmailMultiAlternatives

recipient_list = ['ben@example.com', 'james@example.com']
from_email = None # uses default email address
email = EmailMultiAlternatives(from_email=from_email, to=recipient_list)

email.template_id = 8 # your brevo template id

email.merge_data = {
    'ben@example.com': {'name': "Ben", 'order_no': "12345"}, # customize per customer
    'james@example.com': {'name': "James", 'order_no': "54321"},
}
email.merge_global_data = {
    'ship_date': "May 15", # this is common global data for both ben and james
} 

email.send()
```
That's it now you can also send emails using Brevo template's.

If you have any questions, drop a comment.