Skip to main content

Send emails with Django template system

Project description

Info:

Send emails using Django template system

Author:

Artem Rizhov (https://github.com/artemrizhov)

Overview

This is a tiny wrapper around the standard EmailMessage class and send_mail() function that provides an easy way to create email messages using the Django template system Just pass template_name and context as the first parameters then use as normal.

Features:

  • Built with OOP, KISS and flexibility in mind. Really small and simple, but yet full-featured (I hope).

  • Extends and mimics the built-in Django EmailMessage and send_mail(). Compatible as much as possible.

  • Fully supports Django template system including template inheritance (thanks to BradWhittington for the note about the problem).

  • Supports any possible template engines and loaders.

  • Supports serialisation (thanks to arjandepooter).

  • Fully covered with tests.

  • Tested with Django 1.4-1.9.

  • Compatible with Python 3.

Installation

Run:

pip install django-mail-templated

And register the app in your settings file:

INSTALLED_APPS = (
    ...
    'mail_templated'
)

Usage

Each email template should extend "mail_templated/base.tpl" or it’s clone either directly or via descendants. This is the only way to provide robust and full support for template inheritance, because Django template engine takes a lot of changes from time to time.

Note that first and last newlines inside of block contents will be removed.

Plain text message:

{% extends "mail_templated/base.tpl" %}

{% block subject %}
Hello {{ user.name }}
{% endblock %}

{% block body %}
This is a plain text message.
{% endblock %}

HTML message:

{% extends "mail_templated/base.tpl" %}

{% block subject %}
Hello {{ user.name }}
{% endblock %}

{% block html %}
This is an <strong>html</strong> message.
{% endblock %}

Multipart message:

{% extends "mail_templated/base.tpl" %}

{% block subject %}
Hello {{ user.name }}
{% endblock %}

{% block body %}
This is a plain text message.
{% endblock %}

{% block html %}
This is an <strong>html</strong> message.
{% endblock %}

Partial template without subject:

{% extends "mail_templated/base.tpl" %}

{% block body %}
This is a plain text message.
{% endblock %}

Fast method with send_mail() function:

from mail_templated import send_mail
send_mail('email/hello.tpl', {'user': user}, from_email, [user.email])

More control with EmailMessage class:

from mail_templated import EmailMessage

# Create new empty message.
message = EmailMessage()

# Initialize message on creation.
message = EmailMessage('email/hello.tpl', {'user': user}, from_email,
                       to=[user.email])

# Set default subject and body.
message = EmailMessage(subject=subject, body=body)

# Initialize message and render template immediately.
message = EmailMessage('email/hello.tpl', {'user': user}, from_email,
                       to=[user.email], render=True)

# Initialize message later.
message.subject = 'Default subject'
message.context = {'user': user}
message.template_name = 'email/hello.tpl'
message.from_email = from_email
message.to = [user.email]

# Attach alternatives, files, etc., as if you'd use standard
# EmailMultiAlternatives object.
message.attach_alternative('HTML alternative', 'text/html')

# Serialize message after initialization if needed.
save_message_to_db(pickle.dumps(message))
# Then restore when ready to continue.
message = pickle.loads(get_message_from_db())

# Force immediate template load if you want to handle this somehow.
try:
    message.load_template('email/hello.tpl')
except TemplateDoesNotExist:
    message.load_template('email/default.tpl')

# You can also set template object manually.
message.template = get_template('mail_templated_test/plain.tpl')

# Force template rendering. If template is not loaded on this stage then
# it will be loaded automatically, so you actually don't have to call
# `load_template()` manually.
message.render()

# Get compiled subject and body as if you'd use standard Django message
# object.
logger.debug('Sending message with subject "{}" and body "{}"'.format(
    message.subject, message.body))

# Change subject and body manually at any time. But remember they can be
# overwritten by template rendering if not rendered yet.
message.subject = subject
message.body = body

# This is also good point for serialization. Subject and body will be also
# serialized, the template system will not be used after deserialization.
message = pickle.loads(pickle.dumps(message))

# Send message when ready. It will be rendered automatically if needed.
message.send()

Look into the source code for more info.

Please create an issue at GitHub if you have any notes. Pull requests are welcome!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-mail-templated-2.4.2.tar.gz (10.1 kB view details)

Uploaded Source

File details

Details for the file django-mail-templated-2.4.2.tar.gz.

File metadata

File hashes

Hashes for django-mail-templated-2.4.2.tar.gz
Algorithm Hash digest
SHA256 2c2b23d4b88988225fbf66e2658f6774c5bf4f2b81a3ebec7bb3a3f7396d9363
MD5 91b52f70ee97e6169e75a9b4da998e73
BLAKE2b-256 cb4e7c7318004d0a213702045f3e92ed8e5ebd2863f24918b2c20bc703d7ca08

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page