mirror of
https://github.com/pacnpal/django-anymail.git
synced 2025-12-20 03:41:05 -05:00
Drop Python 2 and Django 1.11 support
Minimum supported versions are now Django 2.0, Python 3.5. This touches a lot of code, to: * Remove obsolete portability code and workarounds (six, backports of email parsers, test utils, etc.) * Use Python 3 syntax (class defs, raise ... from, etc.) * Correct inheritance for mixin classes * Fix outdated docs content and links * Suppress Python 3 "unclosed SSLSocket" ResourceWarnings that are beyond our control (in integration tests due to boto3, python-sparkpost)
This commit is contained in:
@@ -7,7 +7,7 @@ ESP's templating languages and merge capabilities are generally not compatible
|
||||
with each other, which can make it hard to move email templates between them.
|
||||
|
||||
But since you're working in Django, you already have access to the
|
||||
extremely-full-featured :mod:`Django templating system <django.template>`.
|
||||
extremely-full-featured :doc:`Django templating system <django:topics/templates>`.
|
||||
You don't even have to use Django's template syntax: it supports other
|
||||
template languages (like Jinja2).
|
||||
|
||||
@@ -15,7 +15,7 @@ You're probably already using Django's templating system for your HTML pages,
|
||||
so it can be an easy decision to use it for your email, too.
|
||||
|
||||
To compose email using *Django* templates, you can use Django's
|
||||
:func:`~django.template.loaders.django.template.loader.render_to_string`
|
||||
:func:`~django.template.loader.render_to_string`
|
||||
template shortcut to build the body and html.
|
||||
|
||||
Example that builds an email from the templates ``message_subject.txt``,
|
||||
@@ -24,16 +24,14 @@ Example that builds an email from the templates ``message_subject.txt``,
|
||||
.. code-block:: python
|
||||
|
||||
from django.core.mail import EmailMultiAlternatives
|
||||
from django.template import Context
|
||||
from django.template.loader import render_to_string
|
||||
|
||||
merge_data = {
|
||||
'ORDERNO': "12345", 'TRACKINGNO': "1Z987"
|
||||
}
|
||||
|
||||
plaintext_context = Context(autoescape=False) # HTML escaping not appropriate in plaintext
|
||||
subject = render_to_string("message_subject.txt", merge_data, plaintext_context)
|
||||
text_body = render_to_string("message_body.txt", merge_data, plaintext_context)
|
||||
subject = render_to_string("message_subject.txt", merge_data).strip()
|
||||
text_body = render_to_string("message_body.txt", merge_data)
|
||||
html_body = render_to_string("message_body.html", merge_data)
|
||||
|
||||
msg = EmailMultiAlternatives(subject=subject, from_email="store@example.com",
|
||||
@@ -41,6 +39,9 @@ Example that builds an email from the templates ``message_subject.txt``,
|
||||
msg.attach_alternative(html_body, "text/html")
|
||||
msg.send()
|
||||
|
||||
Tip: use Django's :ttag:`{% autoescape off %}<autoescape>` template tag in your
|
||||
plaintext ``.txt`` templates to avoid inappropriate HTML escaping.
|
||||
|
||||
|
||||
Helpful add-ons
|
||||
---------------
|
||||
@@ -48,8 +49,6 @@ Helpful add-ons
|
||||
These (third-party) packages can be helpful for building your email
|
||||
in Django:
|
||||
|
||||
.. TODO: flesh this out
|
||||
|
||||
* :pypi:`django-templated-mail`, :pypi:`django-mail-templated`, or :pypi:`django-mail-templated-simple`
|
||||
for building messages from sets of Django templates.
|
||||
* :pypi:`premailer` for inlining css before sending
|
||||
|
||||
@@ -73,10 +73,10 @@ Basic usage is covered in the
|
||||
:ref:`webhooks configuration <webhooks-configuration>` docs.
|
||||
|
||||
If something posts to your webhooks without the required shared
|
||||
secret as basic auth in the HTTP_AUTHORIZATION header, Anymail will
|
||||
secret as basic auth in the HTTP *Authorization* header, Anymail will
|
||||
raise an :exc:`AnymailWebhookValidationFailure` error, which is
|
||||
a subclass of Django's :exc:`~django.core.exceptions.SuspiciousOperation`.
|
||||
This will result in an HTTP 400 response, without further processing
|
||||
This will result in an HTTP 400 "bad request" response, without further processing
|
||||
the data or calling your signal receiver function.
|
||||
|
||||
In addition to a single "random:random" string, you can give a list
|
||||
|
||||
Reference in New Issue
Block a user