Skip to main content
 首页 » 编程设计

python之在电子邮件的 Pyramid View 中呈现 jinja2 模板的正确方法是什么

2025年05月04日30xiaohuochai

我使用 pyramid_mailer 包在我的 Pyramid 应用程序中发送电子邮件。

我找到了示例,其中仅使用简单的字符串作为电子邮件的正文。显然,在实际应用中,我需要使用更复杂的模板,并在可调用 View 中填充信息。

例如:

# 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}) 

它可以工作,但看起来有点困惑。

那么,这里的问题是:这样做正确的方法吗?

请您参考如下方法:

请看下面的代码:

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)