framework · django
Send email from Django
Anymail is the canonical bridge. Most providers ship Anymail backends; pick a provider with a maintained backend rather than a raw SDK.
Anymail standardizes Django EmailBackend across providers, with first-class webhook handling. Async sends require Celery or a worker.
patterns
Send patterns
- Anymail EmailBackend in settings.py.
- Celery tasks for async sends.
- Webhook views via Anymail signal handlers.
- Django templates rendered to HTML before send.
pitfalls
Common mistakes
- Synchronous send blocks the request without a worker.
- Anymail backend mismatch between dev and prod.
- EMAIL_BACKEND env override forgotten in CI.
provider picks for Django
- 01
Postmark
TransactionalFirst-class Anymail backend; webhook signature helpers built in.
100/mo developer plan · $15/mo for 10,000 emails - 02
Mailgun
TransactionalAnymail backend; queue-friendly.
100/day on Foundation trial · $15/mo for 10,000 emails (Basic) - 03
Amazon SES
TransactionalAnymail SES backend; pairs naturally with AWS-hosted Django.
3,000 message charges/mo free for first 12 months · $0.10 per 1,000 emails - 04
SendGrid
Transactional MarketingAnymail backend; mature.
60-day free trial only (permanent free tier was removed May 2025) · $19.95/mo for 50,000 emails
Want a language-level SDK comparison instead? See the SDK hub.