mitol-django-mail
This is the Open Learning Django Mail app. It provides a few key features around mail:
- Templated multipart html emails
- Automatic generation of plaintext portion of multipart email
- CSS inlining for email html
Getting started
pip install mitol-django-mail
Add the mail app:
INSTALLED_APPS = [
...
"mitol.mail.apps.MailApp",
]
Settings
Common Django settings
SITE_BASE_URL- the website's host url, including the protocol (e.g. "https://example.com/")SITE_NAME- the website's name
Mail app settings
All settings for the mitol-django-mail app are namespaced in django settings with MITOL_MAIL_ prefix.
MITOL_MAIL_FROM_EMAIL- the default from email for all messagesMITOL_MAIL_REPLY_TO_ADDRESS- the default reply-to email for all messagesMITOL_MAIL_MESSAGE_CLASSES- a list of fully qualified message class names that make the message classes available in the debuggerMITOL_MAIL_ENABLE_EMAIL_DEBUGGER-Trueif the email debugger should be enabled, you probably want to set this to the same value asDEBUGMITOL_MAIL_RECIPIENT_OVERRIDE- only used locally, this overrides the recipient of all outgoing email messagesMITOL_MAIL_FORMAT_RECIPIENT_FUNC- (optional) set to a custom function to format recipients. You'll typically use this if you're storing the name in a place other that Django's builtinUsermodel. Default:"mitol.mail.defaults.format_recipient".MITOL_MAIL_CAN_EMAIL_USER_FUNC- (optional) set to a custom function to determine whether a user can be sent an email. You'll typically use this if you have additional criteria beyond the user having an email. Default:"mitol.mail.defaults.can_email_user".MITOL_MAIL_CONNECTION_BACKEND- the connection backend to use for email sending. You'd use this only if you're doing something really custom thatanymaildoesn't give you. Default:"anymail.backends.mailgun.EmailBackend".
Usage
Create message classes
This involves subclassing mitol.mail.messages.TemplatedMessage. To subclass, do the following:
template_nameattribute -strthat denotes the directory withintemplates/mailthat this message's templates reside in (e.g."password_reset")nameattribute - a human-friendly name for your message (e.g."Password Reset")get_debug_template_context- static method that returns a context dict for rendering the email in the debugger
Define templates
In your apps's templates directory, create some templates:
templates/
mail/
{template_name}/
subject.txt
body.html
Configure settings.py
Add your custom message class to MITOL_MAIL_MESSAGE_CLASSES so it is available in the debugger.
Optional customizations
Optionally, you can also override:
get_base_template_context- extend the default base template context used with all emails of this type. Return type is adict. As a best practice you should be merging withsuper().get_base_template_context().get_default_headers- extend the default headers included with all emails of this type. Return type is adict. As a best practice you should be merging withsuper().get_default_headers().
Metadata
Release files for mitol-django-mail 2026.10.30
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mitol_django_mail-2026.10.30.tar.gz | 14.3 kB | With provenance | Details for mitol_django_mail-2026.10.30.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mitol_django_mail-2026.10.30-py3-none-any.whl | Python 3 | none | any | Details for mitol_django_mail-2026.10.30-py3-none-any.whl |
Total release size: 33.7 kB
Release files / mitol_django_mail-2026.10.30.tar.gz
| Download URL | mitol_django_mail-2026.10.30.tar.gz |
|---|---|
| Size | 14.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
45d8a768d810fbd7f89a2a0447932e924d8106d597363729d92bd5add11a52b4
|
|
BLAKE2b-256 checksum How to use checksums |
a5b49169631a7c9d656f2c957ce249f325f532d7093b638e837d16d5b6e6fa7a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / mitol_django_mail-2026.10.30-py3-none-any.whl
| Download URL | mitol_django_mail-2026.10.30-py3-none-any.whl |
|---|---|
| Size | 19.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
30d634578430e0ef55f0208cc799b9ecebbf99e9dc3d86183567f406701d2fb6
|
|
BLAKE2b-256 checksum How to use checksums |
0d105dacb8095bf7b5522adcf573f5b9c3cc5ea57f8075ee98979319b0f4a42a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logSecurity for mitol-django-mail 2026.10.30
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for mitol_django_mail-2026.10.30.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.