在金字塔视图中为电子邮件消息呈现jinja2模板的正确方法是什么?

时间:2015-11-21 21:16:26

标签: python jinja2 pyramid

我使用pyramid_mailer包在我的金字塔应用中发送电子邮件。

我找到了一些例子,其中电子邮件的正文只使用了简单的字符串。显然,在真实的应用程序中,我需要使用更复杂的模板,在视图中填充的信息可以调用。

例如:

# templates/mail/notification.jinja2
Dear {{username}},<br> blah blah blah... 

我使用 Jinja2 进行模板化,并提出以下解决方案:

@view_config(route_name='email', renderer='templates/email.jinja2')
def send_email(request):
    import pyramid_jinja2
    user = # ... got user from DB
    env = pyramid_jinja2.get_jinja2_environment(request)
    template = env.get_template('/templates/mail/notification.jinja2')
    message = template.render({'username': user.name})

它有效,但看起来有点混乱。

所以,这里的问题是:这是正确的方式吗?

1 个答案:

答案 0 :(得分:1)

请参阅以下代码:

from pyramid.renderers import render

from pyramid_mailer import get_mailer
from pyramid_mailer.message import Message

import premailer


def send_templated_mail(request, recipients, template, context, sender=None):
    """Send out templatized HTML and plain text emails.

    Each HTML email should have a plain text fallback. Premailer package is used to convert any CSS styles in HTML email messages to inline, so that email clients display them.  

    The email is assembled from three different templates:

    * Read subject from a subject specific template $template.subject.txt

    * Generate HTML email from HTML template, $template.body.html

    * Generate plain text email from HTML template, $template.body.txt

    Make sure you have configured your template engine (Jinja 2) to read TXT templates beside HTML.

    :param request: HTTP request, passed to the template engine. Request configuration is used to get hold of the configured mailer.

    :param recipients: List of recipient emails

    :param template: Template filename base string for template tripled (subject, HTML body, plain text body). For example ``email/my_message`` would map to templates ``email/my_message.subject.txt``, ``email/my_message.body.txt``, ``email/my_message.body.html``

    :param context: Template context variables as a dict

    :param sender: Override the sender email - if not specific use the default set in the config as ``mail.default_sender``
    """

    assert recipients
    assert len(recipients) > 0
    assert type(recipients) != str, "Please give a list of recipients, not a string"

    subject = render(template + ".subject.txt", context, request=request)
    subject = subject.strip()

    html_body = render(template + ".body.html", context, request=request)
    text_body = render(template + ".body.txt", context, request=request)

    if not sender:
        sender = request.registry.settings["mail.default_sender"]

    # Inline CSS styles
    html_body = premailer.transform(html_body)

    message = Message(subject=subject, sender=sender, recipients=recipients, body=text_body, html=html_body)

    mailer = get_mailer(request)
    mailer.send(message)