django中的电子邮件模板

Oli*_*Oli 7 email django django-templates django-email

众所周知(或应该),您可以使用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,])
Run Code Online (Sandbox Code Playgroud)

这有一个缺陷:要编辑电子邮件的主题和内容,您必须编辑视图和模板.虽然我可以证明给管理员用户访问模板是合理的,但我并没有让他们访问原始的python!

真正酷的是,如果您可以在电子邮件中指定块并在发送电子邮件时单独将它们拉出来:

{% block subject %}This is my subject{% endblock %}
{% block plaintext %}My body{% endblock%}
{% block html %}My HTML body{% endblock%}
Run Code Online (Sandbox Code Playgroud)

但是你会怎么做?你会如何一次只渲染一个块?

Oli*_*Oli 11

这是我的第三次迭代.它假设你有一个像这样的电子邮件模板:

{% block subject %}{% endblock %}
{% block plain %}{% endblock %}
{% block html %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我已经重构了默认情况下迭代通过列表发送的电子邮件,并且有一些实用程序方法可以发送到单个电子邮件和django.contrib.auth Users(单个和多个).我覆盖的可能比我明智的需要还要多,但你去了.

我也可能已经超越了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)
Run Code Online (Sandbox Code Playgroud)

和往常一样,如果你可以改进,请做.