用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