保持DRY在Django中发送邮件

时间:2011-05-20 22:35:52

标签: django email dry

我在很多观点中都有以下两段代码。我正在寻找一种方法来抽象它们,而不是在每个视图中重复这个代码。接收者,主题行和正文当然会有所不同,所以我希望能够将这些字符串传递给这个函数 - “函数”是正确的术语,对吗?

mailt = loader.get_template('membership/signup_email.txt')
mailc = Context({
    'signin_url': signin_url,
    'name': firstname + ' ' + lastname,
    'username': username,
    'membership_level': membership_level.name,
    'membership_number': membership_number,
    'payment_plan': payment_plan
})
msg = EmailMessage(
    'You are now a Member!',
    mailt.render(mailc),
    'membership@domain.org',
    [email]
)
msg.content_subtype = "html"
msg.send()

# Nofity our staff
admin_mailt = loader.get_template('membership/signup_admin_email.txt')
admin_mailc = Context({
    'site': current_site,
    'user': user,
    'payment_plan': payment_plan
})
admin_msg = EmailMessage(
    '[myproject] New Membership Signup',
    admin_mailt.render(admin_mailc),
    'membership@domain.org',
    ['membership@domain.org']
)
admin_msg.content_subtype = "html"
admin_msg.send()

2 个答案:

答案 0 :(得分:0)

我不确定你的变量来自哪里......但....你可以简单地创建一个函数来说一个utils.py吗?将上面的代码放在那里,并在需要时使用参数调用它。所以你的观点可能会有如下内容。对您在其他地方创建的函数的调用。

custom_send_mail(recipient, subject, body)

答案 1 :(得分:0)

你可以使用内置的django电子邮件方法并稍微抽象它们以获得你想要的东西,它不会给你带来那么多,但是你去了。

请参阅此处的文档:http://docs.djangoproject.com/en/1.3/topics/email/

以下是使用内置django电子邮件方法的方法。

from django.core.mail import send_mail

send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

所以上面的一个例子就会变成这个。

# Nofity our staff
admin_mailt = loader.get_template('membership/signup_admin_email.txt')
admin_mailc = Context({
    'site': current_site,
    'user': user,
    'payment_plan': payment_plan
})

send_mail('[myproject] New Membership Signup', admin_mailt.render(admin_mailc), 'membership@domain.org', ['membership@domain.org'])

你可以稍微包装一下,这样你就可以传递模板名称和上下文,这样可以使它更清洁。

send_my_email(subject, to_address, template, context, from_address='membership@domain.org'):
    admin_mailt = loader.get_template(template)
    send_mail(subject, admin_mailt.render(context), from_address, to_address)