30 мая 2013 г.

django: отправка email шаблонами из FlatPage

Приспичило сделать в django отправку email с удобной настройкой формата(-ов) письма. Понятно, что при этом должны работать какие-то переменные в шаблоне, куда удобно подставится что-то заранее предусмотренное. Ну и придумал для этого использовать FlatPage, которые идут «искаропки» и уже нормально редактируются в админке (я прикрутил туда ещё и TinyMCE). Плюс надо бы письма слать в формате html, для пущей красоты.

Итак, у нас задача декомпозируется на 1) получение FlatPage, 2) рендер шаблона, 3) отправка email. Все три пункта тривиальны и в документации так или иначе описаны. Мне удобнее получать FlatPage по предопределённому url. Рендер использует стандартный шаблонизатор django. Переменные какие надо передаются в шаблон обычным образом через Context. Мыло отправляем через EmailMultiAlternatives, прикладывая html-версию письма. Текстовую версию тоже надо бы предусмотреть, её я получаю просто отрезая теги.

from django.core.mail import EmailMultiAlternatives
from django.contrib.flatpages.models import FlatPage
from django.template.loader import get_template_from_string
from django.template import Context
from django.utils.html import strip_tags
# получаем флэт-паге
mail_template = FlatPage.objects.get(url='/send_mail/')
# рендерим шаблон
t = get_template_from_string(mail_template.content)
body_html = t.render(Context({'var1': ...}))
# текстовый вариант
body_text = strip_tags(body_html)
# отправка
msg = EmailMultiAlternatives(mail_template.title, body_text, settings.SERVER_EMAIL, [mail_to])
msg.attach_alternative(body_html, "text/html")
msg.send()

Если html не нужен, то можно было сделать ещё проще:
from django.core.mail import send_mail
send_mail(mail_template.title, body, settings.SERVER_EMAIL, [mail_to], fail_silently=True)

Комментариев нет:

Отправить комментарий