Changelog
August 29, 2026 · View on GitHub
Version 3.11.3 (2026-08-29)
- Fixed a connection leak in
_send_bulk(). Thanks @simonphilips!
Version 3.11.2 (2026-04-16)
_send_emailshould dispatch email using it's own connection. Thanks @ibadarrohman!
Version 3.11.1 (2026-04-15)
- Fixed a bug where
connections.close()is not called when exceptions are raised. Thanks @selwin! - Fixed a bug where
connections.close()does not clear connections cache. Thanks @selwin!
Version 3.11 (2026-01-04)
- Added Python 3.14 and Django 6.0 compatibility. Thanks @selwin!
- Replaced
bleachwithnh3for HTML sanitization.bleachhas been deprecated since 2023. Thanks @selwin! - Added
SESWebhookHandlerandSparkPostWebhookHandlerfor handling webhook events (beta feature). Thanks @selwin! - Optimized the way templates are fetched during email delivery. Thanks @selwin!
Version 3.10.1 (2025-08-04)
- Fixed an issue where
email.last_updatedis not updated during email delivery. Thanks @marsha97!
Version 3.10.0 (2025-07-15)
- Added
email.recipient_delivery_statusfield for tracking delivery issues. Thanks @hery733! - Added
FILE_STORAGEoption inPOST_OFFICEconfig to specify the storage backend for attachments. Thanks @blag! - Added Czech translation. Thanks @fdobrovolny!
- Lots of packaging work and converted setup.py to pyproject.toml. Thanks @blag!
- Various admin improvements. Thanks @blag!
- Updated tests and translations. Thanks @samiashi!
mail.send_many()now returns a list ofEmailinstances. Thanks @chromium7!
Version 3.9.0 (2024-06-19)
- Added a new
LOCK_FILE_NAMEwhich lets you change post office's lock file name. Thanks @mogost! - Fixes a bug where
email_queuedsignal is not sent in certain cases. Thanks @diesieben07! - Fixes an issue where attachment admin page would not render with large number of emails. Thanks @petrprikryl!
- Fixes a crash when email instances are made with context, but without a template. Thanks @pacahon!
- Other miscellaneous fixes and house keeping tasks by @mogost!
Version 3.8.0 (2023-10-22)
- Added
BATCH_DELIVERY_TIMEOUTthat specifies the maximum time allowed for each batch to be delivered. Defaults to 180 seconds. Thanks @selwin!
Version 3.7.1 (2023-08-08)
- Optimized a queryset in
get_queued()that doesn't use indexes in Postgres. Thanks @marsha97! - Removed
date_hierarchyoption which causes admin to load slowly on DBs with a large number of emails. Thanks @selwin! - Optimized
cleanup_expired_mails()so that deletes emails in smaller batches. Thanks @marsha97!
Version 3.7.0 (2023-05-30)
- Changed JSON columns to use Django's
JSONFieldand dropjsonfielddependency. Thanks @jrief! - Fixed saving HTML emails that have
quoted_printable. Thanks @gabn88! - Fixes an issue where emails are rendered without context in Django's admin interface. Thanks @zagl!
- This version no longer supports Django 3.1.
Version 3.6.3 (2022-10-27)
- Fixed an issue where emails may not be rendered with context. Thanks @zagl!
- Fixed a few packaging issues. Thanks @zagl and @adamchainz!
send_messages()now mimics Django's SMTP Backend return value. Thanks @JiriKr!
Version 3.6.2 (2022-10-12)
- Improvement to attachment handling in admin interface. Thanks @petrprikryl!
- Fixed a bug where HTML body is not displayed in admin interface. Thanks @robbieadi!
- Explicitly specify
default_auto_fieldto supress migration warnings. Thanks @CirXe0N! - Fixed a bug where
email.templateis not saved in certain cases. Thanks @franciscobmacedo!
Version 3.6.1 (2022-07-04)
- Support for bleach >= 5.0. Thanks @franciscobmacedo!
- Ensure that
Reply-Toheaders are correctly set. Thanks @christophmeissner! - Add a
Resendbutton in admin to easily resend an email. Thanks @domdinicola!
Version 3.6.0 (2021-12-21)
- Support for Django 4.0. Thanks @domdinicola!
cleanup_mailnow deletes emails in batches, which is much nicer to DB when deleting millions of emails. Thanks @stevemc4!- Failure to send an email are now logged as an exception. Thanks @SaturnFromTitan!
- Added
eslocale. Thanks @ahmontero! - Fixed admin template discovery issue for case-sensitive filesystems. Thanks @fasih!
- Fixes:
SMTPServerDisconnectederror. Thanks @weimens! - Various maintenance work by @jrief and @mogost.
Version 3.5.3 (2020-12-04)
- Fixed an issue with Celery integration that could cause duplicate emails. Thanks @jrief!
Version 3.5.2 (2020-11-05)
- Fixed an issue where Post Office's admin interface doesn't show. Thanks @christianciu!
Version 3.5.1 (2020-11-03)
- Added missing migration file (some model fields now offer a help text).
Version 3.5.0 (2020-10-31)
- Added the capability to configure retries via
MAX_RETRIESandRETRY_INTERVALconfiguration settings. Thanks @Houtmann and @jrief! - The admin interface has been improved to show previews of emails. If you want HTML emails to be rendered,
please install
bleach. Thanks @jrief! - Add
Message-IDto the Email model. This allows administrators to trace back emails. Thanks @jrief! - Added
CELERY_ENABLEDsettings. Thanks @elineda! - Fixes an issue that prevents PDS attachments from being sent. Thanks @patroqueeet!
Version 3.4.1 (2020-05-16)
- Allow
tasks.pyto be imported when Celery is not installed. This allows auto-discovery by other task systems such as Huey to succeed. - Fix duplicate key problem in template editor in Django admin.
Version 3.4.0 (2020-04-13)
- Signals that emails have been put into the queue.
- Celery integration for immediate asynchronous delivery.
- Changed version handling.
Version 3.3.1 (2020-02-28)
- Drop support for Django < 2.2.
- Revert
jsonfield2back tojsonfieldto make upgrade from < 3.3.0 smoother. Thanks @rpkilby!
Version 3.3.0
- Support for Django 3.0. Thanks @Mogost!
- Drop support for Django < 1.11 and Python < 3.5. Thanks @Mogost!
- Replace unsupported dependency
jsonfieldwith supported forkjsonfield2. Thanks @Mogost! - Added
OVERRIDE_RECIPIENTSfor testing purposes. Thanks @Houtmann! - Improved admin interface. Thanks @ilikerobots and @cwuebbels!
Version 3.2.1
- Fix #264: Replace unicode elipsis against 3 dots.
Version 3.2.0
- Drop support for Python-3.3.
- Drop support for Django-1.8 and 1.9.
- Add functionality to attach images as inlines to email body.
- Add special template engine to render HTML emails with inlined images.
- Update German translation strings.
Version 3.1.0 (2018-07-24)
- Improvements to attachments are handled. Thanks @SeiryuZ!
- Added
--delete-attachmentsflag tocleanup_mailmanagement command. Thanks @Seiryuz! - I18n improvements. Thanks @vsevolod-skripnik and @delneg!
- Django admin improvements. Thanks @kakulukia!
Version 3.0.4
- Added compatibility with Django 2.0. Thanks @PreActionTech and @PetrDlouhy!
- Added natural key support to
EmailTemplatemodel. Thanks @maximlomakin!
Version 3.0.3
- Fixed memory leak when multiprocessing is used.
- Fixed a possible error when adding a new email from Django admin. Thanks @ivlevdenis!
Version 3.0.2
_send_bulknow properly catches exceptions when preparing email messages.
Version 3.0.1
- Fixed an infinite loop bug in
send_queued_mailmanagement command.
Version 3.0.0
_send_bulknow allows each process to use multiple threads to send emails.- Added support for mimetypes in email attachments. Thanks @clickonchris!
- An
EmailTemplatecan now be used as defaults multiple times in one language. Thanks @sac7e! send_queued_mailmanagement command will now check whether there are more queued emails to be sent before exiting.- Drop support for Django < 1.8. Thanks @fendyh!
Version 2.0.8
- Django 1.10 compatibility fixes. Thanks @hockeybuggy!
- Fixed an issue where Django would sometimes create migration files for post-office. Thanks @fizista!
Version 2.0.7
- Fixed an issue with sending email to recipients with display name. Thanks @yprez!
Version 2.0.6
- Fixes Django 1.10 deprecation warnings and other minor improvements. Thanks @yprez!
- Email.subject can now accept up to 989 characters. This should also fix minor migration issues. Thanks @yprez!
Version 2.0.5
- Fixes more Django 1.8 deprecation warnings.
Email.dispatch()now closes backend connection by default. Thanks @zwack- Compatibility fixes for Django 1.9. Thanks @yprez!
Version 2.0.2
Email.dispatch()now closes backend connection by default. Thanks @zwack- Compatibility fixes for Django 1.9. Thanks @yprez!
Version 2.0.1
- Fixes migration related packaging issues.
- Fixes deprecation warning in Django 1.8.
Version 2.0
- Added multi backend support. Now you can use multiple email backends with
post-office! - Added multi language support. Thanks @jrief!
Version 1.1.2
- Adds Django 1.8 compatibility.
Version 1.1.1
- Fixes a migration error. Thanks @garry-cairns!
Version 1.1.0
- Support for Django 1.7 migrations. If you're still on Django < 1.7,
South migration files are stored in
south_migrationsdirectory.
Version 1.0.0
- IMPORTANT: in older versions, passing multiple
recipientsintomail.send()will create multiple emails, each addressed to one recipient. Starting from1.0.0, only one email with multiple recipients will be created. - Added
LOG_LEVELsetting. mail.send()now supportsccandbcc. Thanks Ștefan Daniel Mihăilă (@stefan-mihaila)!- Improvements to
admininterface; you can now easily requeue multiple emails. Logmodel now stores the type of exception caught during sending.send_templated_mailcommand is now deprecated.- Added
EMAIL_BACKENDsetting to the new dictionary-styled settings.
Version 0.8.4
send_queued_mailnow accepts an extra--log-levelargument.mail.send()now accepts an extralog_levelargument.- Drop unused/low cardinality indexes to free up RAM on large tables.
Version 0.8.3
send_queued_mailnow accepts--lockfileargument.- Lockfile implementation has been modified to use symlink, which is an atomic operation across platforms.
Version 0.8.2
- Added
CONTEXT_FIELD_CLASSsetting to allow other kinds of context field serializers.
Version 0.8.1
- Fixed a bug that causes context to be saved when
render_on_deliveryis False
Version 0.8.0
- Added a new setting
DEFAULT_PRIORITYto set the default priority for emails. Thanks Maik Hoepfel (@maikhoepfel)! mail.send()gains arender_on_deliveryargument that may potentially result in significant storage space savings.- Uses a new locking mechanism that can detect zombie PID files.
Version 0.7.2
- Made a few tweaks that makes
post_officemuch more efficient on systems with large number of rows (millions).
Version 0.7.1
- Python 3 compatibility fix.
Version 0.7.0
- Added support for sending attachments. Thanks @yprez!
- Added
descriptionfield toEmailTemplatemodel to store human readable description of templates. Thanks Michael P. Jung (@bikeshedder)! - Changed
django-jsonfielddependency tojsonfieldfor Python 3 support reasons. - Minor bug fixes.
Version 0.6.0
- Support for Python 3!
- Added mail.send_many() that's much more performant when sending a large number emails
Version 0.5.2
- Added logging
- Added BATCH_SIZE configuration option
Version 0.5.1
- Fixes various multiprocessing bugs
Version 0.5.0
- Email sending can now be parallelized using multiple processes (multiprocessing)
- Email templates are now validated before save
- Fixed a bug where custom headers aren't properly sent
Version 0.4.0
- Added support for sending emails with custom headers (you'll need to run South when upgrading from earlier versions)
- Added support for scheduled email sending
- Backend now properly persist emails with HTML alternatives
Version 0.3.1
- IMPORTANT:
mail.sendnow expects recipient email addresses as the first argument. This change is to allow optionalsenderparameter which defaults tosettings.DEFAULT_FROM_EMAIL - Fixed a bug where all emails sent from
mail.sendhave medium priority
Version 0.3.0
- IMPORTANT: added South migration. If you use South and had post-office installed before 0.3.0, you may need to manually resolve migration conflicts
- Allow unicode messages to be displayed in
/admin - Introduced a new
mail.sendfunction that provides a nicer API to send emails createdfields now useauto_now_addlast_updatedfields now useauto_now
Version 0.2.1
- Fixed typo in
admin.py
Version 0.2
- Allows sending emails via database backed templates
Version 0.1.5
- Errors when opening connection in
Email.dispatchmethod are now logged