Skip to content

Documentation

Send email from Django.

Five settings in settings.py, and every send_mail call goes through Mailtruss.

Before you start

You need a verified sending domain (see Domains) and an API key (under API keys in the dashboard; it is shown once). For SMTP the key is the password, and a sending-only key is enough. Keep the key in an environment variable on your server, never in code that runs in a browser or an app.

The settings

Django's default email backend is SMTP, so only the connection settings change. The API key is the password, and any username works.

settings.py
import os
​
EMAIL_HOST = "smtp.mailtruss.com"
EMAIL_PORT = 587
EMAIL_HOST_USER = "mailtruss"
EMAIL_HOST_PASSWORD = os.environ["MAILTRUSS_API_KEY"]
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = "hello@yourdomain.com"

Try it without sending real mail

From python manage.py shell, send a message to the test address. It needs no verified domain and reaches no real mailbox.

python manage.py shell
from django.core.mail import send_mail
send_mail("Test", "Hello from Django", "hello@yourdomain.com", ["delivered@mailtruss.test"])

See what happened

Open the message under Emails in the dashboard: it shows the recorded timeline, what each event proves, and a diagnosis if something went wrong. Mail sent over SMTP appears there like any other message. To be told as it happens, add a webhook.

If it fails

The relay answers with a reply code:

  • 535: the API key is wrong or revoked. Fix the password.
  • 550: refused for good (unverified domain, suppressed recipient, invalid message). Do not retry; the reply says why.
  • 552: too large, or the monthly limit is reached.
  • 451 or 452: temporary (rate limit, daily limit, or a brief problem on our side). Retry later; mail servers do this automatically.

Problems that happen after a message is accepted (bounces, complaints) are explained under delivery errors.

Other guides

Last updated

Something wrong or unclear on this page?

Report an issue