用Django创build电子邮件模板

我想发送HTML电子邮件,使用像这样的Django模板:

<html> <body> hello <strong>{{username}}</strong> your account activated. <img src="mysite.com/logo.gif" /> </body> 

我找不到关于send_mail任何信息,而django-mailer只发送HTML模板,没有dynamic数据。

我如何使用Django的模板引擎来生成电子邮件?

从文档 ,发送HTML电子邮件,你想使用替代内容types,如下所示:

 from django.core.mail import EmailMultiAlternatives subject, from_email, to = 'hello', 'from@example.com', 'to@example.com' text_content = 'This is an important message.' html_content = '<p>This is an <strong>important</strong> message.</p>' msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) msg.attach_alternative(html_content, "text/html") msg.send() 

您可能需要为您的电子邮件提供两个模板 – 一个类似于以下内容的纯文本模板,存储在您的模板目录下的email.txt下:

 Hello {{ username }} - your account is activated. 

和一个HTMLy的,存储在email.html下:

 Hello <strong>{{ username }}</strong> - your account is activated. 

然后,您可以使用get_template使用这两个模板发送电子邮件,如下所示:

 from django.core.mail import EmailMultiAlternatives from django.template.loader import get_template from django.template import Context plaintext = get_template('email.txt') htmly = get_template('email.html') d = Context({ 'username': username }) subject, from_email, to = 'hello', 'from@example.com', 'to@example.com' text_content = plaintext.render(d) html_content = htmly.render(d) msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) msg.attach_alternative(html_content, "text/html") msg.send() 

男孩和女孩!

由于Django的1.7在send_email方法中添加了html_message参数。

html_message:如果提供了html_message,则生成的电子邮件将是一个多部分/替代电子邮件,其中消息为text / plain内容types,html_message为文本/ html内容types。

所以你可以只是:

 from django.core.mail import send_mail from django.template.loader import render_to_string msg_plain = render_to_string('templates/email.txt', {'some_params': some_params}) msg_html = render_to_string('templates/email.html', {'some_params': some_params}) send_mail( 'email title', msg_plain, 'some@sender.com', ['some@receiver.com'], html_message=msg_html, ) 

为了解决这个问题,我制作了django-templated-email ,这个解决scheme的启发(以及在某种程度上,需要从使用django模板切换到使用mailchimp等模板设置事务性,模板化电子邮件我自己的项目)。 虽然这仍然是一个工作,但是对于上面的例子,你可以这样做:

 from templated_email import send_templated_mail send_templated_mail( 'email', 'from@example.com', ['to@example.com'], { 'username':username } ) 

在settings.py中添加以下内容(完成示例):

 TEMPLATED_EMAIL_DJANGO_SUBJECTS = {'email':'hello',} 

这会自动在普通的django模板目录/加载器中寻找名为“templated_email / email.txt”和“templated_email / email.html”的模板,用于普通的django模板和装载器(抱怨如果至less找不到其中的一个) 。

使用EmailMultiAlternatives和render_to_string来使用两个替代模板(一个是纯文本格式,另一个是html格式):

 from django.core.mail import EmailMultiAlternatives from django.template import Context from django.template.loader import render_to_string c = Context({'username': username}) text_content = render_to_string('mail/email.txt', c) html_content = render_to_string('mail/email.html', c) email = EmailMultiAlternatives('Subject', text_content) email.attach_alternative(html_content, "text/html") email.to = ['to@example.com'] email.send() 

在示例中有一个错误….如果您使用它写入,会出现以下错误:

<type'exceptions.Exception'>:'dict'对象没有属性'render_context'

您将需要添加以下导入:

 from django.template import Context 

并将字典更改为:

 d = Context({ 'username': username }) 

请参阅http://docs.djangoproject.com/en/1.2/ref/templates/api/#rendering-a-context

Django邮件模板是一个function丰富的Django应用程序发送电子邮件与Django模板系统。

安装:

 pip install django-mail-templated 

组态:

 INSTALLED_APPS = ( ... 'mail_templated' ) 

模板:

 {% block subject %} Hello {{ user.name }} {% endblock %} {% block body %} {{ user.name }}, this is the plain text part. {% endblock %} 

python:

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

更多信息: https : //github.com/artemrizhov/django-mail-templated

我喜欢使用这个工具,允许轻松地发送电子邮件的HTML和TXT轻松的上下文处理: https : //github.com/divio/django-emailit