Как все мы знаем (или если), можно использовать шаблонную систему Django для рендеринга почтовых тел:
def email(email, subject, template, context):
from django.core.mail import send_mail
from django.template import loader, Context
send_mail(subject, loader.get_template(template).render(Context(context)), 'from@domain.com', [email,])
Это имеет один дефект в моем уме: для редактирования предмета и содержания электронного письма необходимо отредактировать и представление и шаблон. В то время как я могу выровнять по ширине предоставляющий администраторский пользовательский доступ к шаблонам, я не предоставляю им доступ к необработанному Python!
То, что было бы действительно прохладно, - то, если Вы могли бы указать блоки в электронном письме и вытащить их отдельно при отправке электронного письма:
{% block subject %}This is my subject{% endblock %}
{% block plaintext %}My body{% endblock%}
{% block html %}My HTML body{% endblock%}
Но как Вы сделали бы это? Как Вы пошли бы о рендеринге всего одного блока за один раз?
Это моя третья рабочая итерация. Предполагая, что у вас есть шаблон электронной почты, как так:
{% block subject %}{% endblock %}
{% block plain %}{% endblock %}
{% block html %}{% endblock %}
Я по умолчанию, по умолчанию по умолчанию повторял по электронной почте, и есть методы утилиты для отправки на одну электронную почту и Django.contrib.auth
Пользователь
S (одноместный и многократный). Я покрываю, возможно, больше, чем я чувствую, но там вы идете.
Я также мог пойти сверху с Python-Love.
def email_list(to_list, template_path, context_dict):
from django.core.mail import send_mail
from django.template import loader, Context
nodes = dict((n.name, n) for n in loader.get_template(template_path).nodelist if n.__class__.__name__ == 'BlockNode')
con = Context(context_dict)
r = lambda n: nodes[n].render(con)
for address in to_list:
send_mail(r('subject'), r('plain'), 'from@domain.com', [address,])
def email(to, template_path, context_dict):
return email_list([to,], template_path, context_dict)
def email_user(user, template_path, context_dict):
return email_list([user.email,], template_path, context_dict)
def email_users(user_list, template_path, context_dict):
return email_list([user.email for user in user_list], template_path, context_dict)
Как никогда, если вы можете улучшить это, пожалуйста, сделайте.
Просто использование два шаблона: один для корпуса и один для предмета.