默认情况下,让Django内置send_mail函数与html一起使用

时间:2011-01-13 21:57:52

标签: django django-email

我想替换内置的 send_mail 功能,该功能仅适用于纯文本电子邮件,具有我自己的智能 send_mail 功能,可生成html和plain-文本版本自动。一切都按照我自己的电子邮件的预期工作,在我自己的应用程序中定义。我可以用这种方式在views.py中做到这一点:

from django.core import mail
from utils import send_mail as send_html_mail
mail.send_mail = send_html_mail

但问题仍然出现在第三方应用程序的电子邮件中。在使用 send_mail 功能进行猴子修补的代码之前,所有导入都已完成。

是否可以在所有django应用程序的所有导入之前覆盖此功能?或者可能是此问题的另一种解决方案。我真的不想通过发送这些第三方应用程序的电子邮件来修补代码。只需输入html-template就可以了。

6 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

来自Django docs:http://docs.djangoproject.com/en/dev/topics/email/#sending-alternative-content-types

from django.core.mail import EmailMultiAlternatives

subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()

不需要send_mail()。

答案 2 :(得分:2)

听起来很多人都在误解你的问题。

要覆盖从第三方模块导入,覆盖sys.modules['django.core.mail']可能有效。

它适用于简单测试,但尚未经过全面测试。

import sys
from django.core import mail 

def my_send_mail(*args, **kwargs):
    print "Sent!11"

mail.send_mail = my_send_mail
sys.modules['django.core.mail'] = mail


from django.core.mail import send_mail
send_mail('blah')
# output: Sent!11

例如,如果我将该代码放入我的settings.py并启动manage.py shell并导入send_mail,我就会获得我的版本。

我的shell会话

In [1]: from django.core.mail import send_mail
In [2]: send_mail()
Sent!11

<强>声明
我从来没有做过这样的事情,也不知道是否有任何质朴的后果。

答案 3 :(得分:1)

我编写了一个应用程序,可以快速从普通文本电子邮件切换到所有项目应用程序的基于html的电子邮件。它可以在不修改任何Django代码或其他第三方应用程序代码的情况下工作。

请在此处查看:https://github.com/ramusus/django-email-html

答案 4 :(得分:0)

如何更改django一点并用您自己的函数替换原始代码?您实际上只需添加自己的功能,不要删除旧功能,因为最后一个定义将被导入。我不喜欢这样的解决方案,因为我不喜欢修补外部库(你需要记住在升级时再次修补它们),但这会很快解决你的问题。

答案 5 :(得分:0)

在Django 1.7中添加了额外属性html_messagesend_mail()函数来发送html消息。

https://docs.djangoproject.com/en/1.8/topics/email/#send-mail