默认情况下,使Django内置的send_mail函数与html一起工作

默认情况下,使Django内置的send_mail函数与html一起工作,django,django-email,Django,Django Email,我想用我自己的智能send_-mail功能代替内置的send_-mail功能,该功能只适用于纯文本电子邮件,自动生成html和纯文本版本。在我自己的应用程序中定义的我自己的电子邮件中,一切都按预期工作。我可以在views.py中以以下方式执行此操作: from django.core import mail from utils import send_mail as send_html_mail mail.send_mail = send_html_mail 但问题仍然出现在第三方应用程序的

我想用我自己的智能send_-mail功能代替内置的send_-mail功能,该功能只适用于纯文本电子邮件,自动生成html和纯文本版本。在我自己的应用程序中定义的我自己的电子邮件中,一切都按预期工作。我可以在views.py中以以下方式执行此操作:

from django.core import mail
from utils import send_mail as send_html_mail
mail.send_mail = send_html_mail
但问题仍然出现在第三方应用程序的电子邮件中。在我的代码之前,已经完成了所有导入,并使用了send_mail功能的monkey补丁


是否可以在所有django应用程序的所有导入之前重写此函数?或者可能有另一种解决方案。我真的不想用发送这些第三方应用程序的电子邮件来修补代码。只需放置html模板就很容易了。

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

来自Django docs:

从django.core.mail导入电子邮件
主题,从电子邮件发送至='你好','from@example.com', 'to@example.com'
text_content='这是一条重要的消息。'
这是一条非常重要的信息。

' msg=emailmultialternations(主题、文本内容、发件人/电子邮件[收件人]) msg.附加可选内容(html内容,“文本/html”) msg.send()

不需要发送邮件。

Django 1.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\u mail
,我就会得到我的版本

我的shell会话

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

我从来没有做过这样的事情,也不知道是否会有任何令人讨厌的后果。

我编写了一个应用程序,用于为所有项目的应用程序快速从纯文本电子邮件切换到基于html的电子邮件。它不会修改任何Django代码或其他第三方应用程序的代码


在这里查看:

在Django 1.7中,添加了额外的属性
html\u message
send\u mail()
函数来发送html消息


第三方应用程序中的电子邮件问题,我不想重写。他们使用内置的发送邮件功能,但我想将我网站的所有电子邮件切换到html版本。如果你感兴趣,请查看此应用程序,谢谢。这是可能的,但我发现了一个更干净的解决方案,如果我可以这样称呼这种解决方案:-)。不修改django代码如果您感兴趣,请查看此应用程序您到底是如何替换旧的send函数的?为什么现在它发生在其他模块导入它之前?我很想知道,能够再次使用这个技巧。是的,听起来很合理。尽管依赖模块的加载顺序似乎有点冒险。我想知道,无论如何导入模块,是否都能实现这一目标。我的问题更深。我已经使用来自mailer应用程序的自定义后端。此应用程序首先将电子邮件发送到Db,然后通过cron job发送。由于某些原因,不可能在*mailer电子邮件后端编写包装器。因为此应用程序使用多种方式将电子邮件放入数据库。如果您引用的是
django-mailer
,它确实有自己的后端将邮件放入数据库。但是,有一个设置可以更改发送邮件的后端:
MAILER\u EMAIL\u backend
是的,我很清楚,谢谢。这一定行得通,但我认为这有不好的一面。我们将生成,放入数据库,从数据库中获取错误创建的电子邮件消息,并且只有在最后一刻,才能使其正确(使用html和纯文本正文)。那一点也不好。例如,如果我需要通过测试覆盖这个系统,我需要将电子邮件后端切换到本地内存后端,并处理生成错误的电子邮件。我实现了我的想法。如果您感兴趣,请查看此应用程序github.com/ramusus/django-email-htmli如果您感兴趣,请查看此应用程序github.com/ramusus/django-email-html
In [1]: from django.core.mail import send_mail
In [2]: send_mail()
Sent!11