跳转到主要内容

面向Django的模板/事务电子邮件抽象

项目描述

GitterBadge PypiversionBadge PythonVersionsBadge LicenseBadge

信息:

一个面向Django的模板电子邮件发送类

作者:

Bradley Whittington (http://github.com/bradwhittington, http://twitter.com/darb)

测试:

TravisBadge CoverageBadge

概述

django-templated-email旨在发送模板电子邮件。该库支持模板继承,添加cc和bcc收件人,可配置模板命名和位置。

send_templated_email方法可以视为电子邮件的render_to_response快捷方式。

确保您正在阅读正确的文档

develop分支:https://github.com/vintasoftware/django-templated-email/blob/develop/README.rst

stable pypi/master:https://github.com/vintasoftware/django-templated-email/blob/master/README.rst

需求

  • Python (3.6, 3.7, 3.8, 3.9)

  • Django (2.2, 3.1, 3.2)

我们强烈推荐并仅官方支持每个Python和Django系列的最新补丁版本。

入门 - 安装

安装

pip install django-templated-email

您可以将以下内容添加到您的settings.py文件中(但默认情况下它已经配置好了)

TEMPLATED_EMAIL_BACKEND = 'templated_email.backends.vanilla_django.TemplateBackend'

# You can use a shortcut version
TEMPLATED_EMAIL_BACKEND = 'templated_email.backends.vanilla_django'

# You can also use a class directly
from templated_email.backends.vanilla_django import TemplateBackend
TEMPLATED_EMAIL_BACKEND = TemplateBackend

发送模板化电子邮件

使用vanilla_django TemplateBackend后端示例用法

Python发送邮件

from templated_email import send_templated_mail
send_templated_mail(
        template_name='welcome',
        from_email='from@example.com',
        recipient_list=['to@example.com'],
        context={
            'username':request.user.username,
            'full_name':request.user.get_full_name(),
            'signup_date':request.user.date_joined
        },
        # Optional:
        # cc=['cc@example.com'],
        # bcc=['bcc@example.com'],
        # headers={'My-Custom-Header':'Custom Value'},
        # template_prefix="my_emails/",
        # template_suffix="email",
)

如果您需要更精细地控制发送电子邮件,可以使用get_templated_email,这将返回一个使用vanilla_django后端准备的django EmailMessage对象

from templated_email import get_templated_mail
get_templated_mail(
        template_name='welcome',
        from_email='from@example.com',
        to=['to@example.com'],
        context={
            'username':request.user.username,
            'full_name':request.user.get_full_name(),
            'signup_date':request.user.date_joined
        },
        # Optional:
        # cc=['cc@example.com'],
        # bcc=['bcc@example.com'],
        # headers={'My-Custom-Header':'Custom Value'},
        # template_prefix="my_emails/",
        # template_suffix="email",
)

您还可以使用ccbcc收件人,例如使用cc=['example@example.com']

您的模板

templated_email/目录需要是模板目录。

后端将查找my_app/templates/templated_email/welcome.email

{% block subject %}My subject for {{username}}{% endblock %}
{% block plain %}
  Hi {{full_name}},

  You just signed up for my website, using:
      username: {{username}}
      join date: {{signup_date}}

  Thanks, you rock!
{% endblock %}

如果您想在电子邮件中包含HTML部分,只需使用‘html’块

{% block html %}
  <p>Hi {{full_name}},</p>

  <p>You just signed up for my website, using:
      <dl>
        <dt>username</dt><dd>{{username}}</dd>
        <dt>join date</dt><dd>{{signup_date}}</dd>
      </dl>
  </p>

  <p>Thanks, you rock!</p>
{% endblock %}

纯文本部分也可以从HTML计算得出,使用html2text。如果您未指定纯文本块且已安装html2text包,则纯文本部分将从HTML部分计算得出。您可以在settings.py中禁用此行为

TEMPLATED_EMAIL_AUTO_PLAIN = False

您还可以指定一个将HTML转换为纯文本的自定义函数

def convert_html_to_text(html):
    ...

TEMPLATED_EMAIL_PLAIN_FUNCTION = convert_html_to_text

您可以使用以下变量在settings.py中全局覆盖模板目录和文件扩展名

TEMPLATED_EMAIL_TEMPLATE_DIR = 'templated_email/' #use '' for top level template dir, ensure there is a trailing slash
TEMPLATED_EMAIL_FILE_EXTENSION = 'email'

您还可以为每次调用send_templated_mail设置template_prefixtemplate_suffix的值,如果您希望将一组模板存储在不同的目录中。请记住包含一个尾随斜杠。

Django Anymail一起使用

Anymail将多个交易电子邮件服务提供商(ESP)集成到Django中,提供了一个一致的API,允许您使用ESP添加的功能,而无需将代码锁定到特定的ESP。它支持Mailgun、Postmark、SendGrid、SparkPost等。

您可以使用它与django-templated-email,只需遵循他们的快速入门说明来配置它。

可选地,您可以使用他们的自定义EmailMessage类与django-templated-email一起使用,如下设置

# This replaces django.core.mail.EmailMessage
TEMPLATED_EMAIL_EMAIL_MESSAGE_CLASS='anymail.message.AnymailMessage'

# This replaces django.core.mail.EmailMultiAlternatives
TEMPLATED_EMAIL_EMAIL_MULTIALTERNATIVES_CLASS='anymail.message.AnymailMessage'

内联图像

您可以使用InlineImage类将内联图像添加到电子邮件中。

首先从文件或一个ImageField获取图像内容

# From a file
with open('pikachu.png', 'rb') as pikachu:
  image = pikachu.read()

# From an ImageField
# Suppose we have this model
class Company(models.Model):
  logo = models.ImageField()

image = company.logo.read()

然后创建一个InlineImage实例

from templated_email import InlineImage

inline_image = InlineImage(filename="pikachu.png", content=image)

现在在发送电子邮件时将对象传递到上下文中的模板

send_templated_mail(template_name='welcome',
                    from_email='from@example.com',
                    recipient_list=['to@example.com'],
                    context={'pikachu_image': inline_image})

最后,在您的模板的HTML模板块中添加图像

<img src="{{ pikachu_image }}">

注意:您添加到上下文中的所有InlineImage对象都将附加到电子邮件中,即使它们在模板中未被使用。

基于类的视图

在表单提交后发送电子邮件是很常见的。我们包含了一个mixin,用于与继承自Django的FormMixin的任何视图一起使用。

在您的视图中添加mixin和常用的Django属性

from templated_email.generic_views import TemplatedEmailFormViewMixin

class AuthorCreateView(TemplatedEmailFormViewMixin, CreateView):
    model = Author
    fields = ['name', 'email']
    success_url = '/create_author/'
    template_name = 'authors/create_author.html'

默认情况下,模板将在其上下文中包含form_data(如果表单有效)或from_errors(如果表单无效)。

您可以在此处查看示例

现在您可以使用以下属性/方法来自定义其行为

属性

templated_email_template_name(如果您没有实现templated_email_get_template_names()则是强制性的)

指定您要用于电子邮件的模板名称的字符串。例如:templated_email_template_name = ‘welcome’。

templated_email_send_on_success(默认:True)

此属性告诉 django-templated-email 如果表单有效则发送电子邮件。

templated_email_send_on_failure(默认:False)

此属性告诉 django-templated-email 如果表单无效则发送电子邮件。

templated_email_from_email(默认:settings.TEMPLATED_EMAIL_FROM_EMAIL

包含发送电子邮件的电子邮件地址的字符串。

方法

templated_email_get_template_names(self, valid)(如果不设置 templated_email_template_name 则是必填的)

如果方法返回一个字符串,它将使用它作为渲染电子邮件的模板。如果它返回一个列表,它将仅使用第一个存在的模板发送电子邮件。

templated_email_get_recipients(self, form)(必填)

返回电子邮件的收件人列表。例如

def templated_email_get_recipients(self, form):
    return [form.data['email']]
templated_email_get_context_data(**kwargs)(可选)

使用此方法向用于渲染模板的上下文添加额外数据。您应该通过调用 super 获取父类的上下文。例如

def templated_email_get_context_data(self, **kwargs):
    context = super(ThisClassView, self).templated_email_get_context_data(**kwargs)
    # add things to context
    return context
templated_email_get_send_email_kwargs(self, valid, form)(可选)

添加或更改用于发送电子邮件的 kwargs。您应该调用 super 获取默认 kwargs。例如

def templated_email_get_send_email_kwargs(valid, form):
  kwargs = super(ThisClassView, self).templated_email_get_send_email_kwargs(valid, form)
  kwargs['bcc'] = ['admin@example.com']
  return kwargs
templated_email_send_templated_mail(*args, **kwargs)(可选)

此方法调用 django-templated-email 的 send_templated_mail 方法。您可以更改此方法以使用 celery 的任务,例如,或处理错误。

未来计划

请参阅 https://github.com/vintasoftware/django-templated-email/issues?state=open

在第三方应用程序中使用 django_templated_email

如果您想使用 django_templated_email 来处理可重用应用程序中的邮件,请注意

  • 您的 send_templated_mail 调用应该设置 template_dir 的值,这样您就可以将应用程序特定的模板副本保留在应用程序中(尽管如果将电子邮件模板存储在 <your app>/templates/templated_email 中,加载器将找到您的电子邮件模板,如果没有覆盖 TEMPLATED_EMAIL_TEMPLATE_DIR

  • 如果您设置了 template_dir(您应该这样做),请记住包括一个尾随斜杠,例如 ‘my_app_email/’

  • 部署的应用程序可能使用不同的后端,该后端不使用 django 模板后端,因此请记住在 README 中提醒开发者,如果他们已经使用不同的后端使用 django_templated_email,他们需要确保他们的电子邮件提供商可以发送所有模板(理想情况下在方便的地方列出)

关于特定后端的一些说明

使用 vanilla_django

这是默认后端,因此不需要特殊配置,并且可以直接使用。默认情况下,它假设以下设置(如果您想覆盖它们)

TEMPLATED_EMAIL_TEMPLATE_DIR = 'templated_email/' #Use '' for top level template dir
TEMPLATED_EMAIL_FILE_EXTENSION = 'email'

出于兼容性目的,您可以在设置文件中指定电子邮件主题(但,首选方法是使用模板中的 {% block subject %}

TEMPLATED_EMAIL_DJANGO_SUBJECTS = {
    'welcome':'Welcome to my website',
}

此外,您可以调用 send_templated_mail 并可选地覆盖以下参数

template_prefix='your_template_dir/'  # Override where the method looks for email templates (alternatively, use template_dir)
template_suffix='email'               # Override the file extension of the email templates (alternatively, use file_extension)
cc=['fubar@example.com']              # Set a CC on the mail
bcc=['fubar@example.com']             # Set a BCC on the mail
template_dir='your_template_dir/'     # Override where the method looks for email templates
connection=your_connection            # Takes a django mail backend connection, created using **django.core.mail.get_connection**
auth_user='username'                  # Override the user that the django mail backend uses, per **django.core.mail.send_mail**
auth_password='password'              # Override the password that the django mail backend uses, per **django.core.mail.send_mail**

发布此包的新版本

更新 CHANGELOG 文件。

执行以下命令

bumpversion [major,minor,patch]
python setup.py publish
git push origin --tags

商业支持

Vinta Logo

该项目,如其他 Vinta Software 开源项目一样,被 Vinta 的客户的多个产品使用。我们始终在寻找令人兴奋的工作,因此如果您需要任何商业支持,请随时联系:contact@vinta.com.br

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django-templated-email-3.0.1.tar.gz (13.5 kB 查看哈希值)

上传时间

支持者