我想替代建筑 发邮件 功能,只能与普通文本电子邮件一起使用,我自己的智能 发邮件 功能,可以自动生成HTML和普通文本版本。一切都按预期的是我自己的电子邮件,在我自己的应用程序中定义。我可以以这种方式以这种方式做到这一点:

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

但是第三端应用程序的电子邮件仍然出现问题。在我的代码之前,所有进口都已经完成 发邮件 功能。

是否可以在所有Django应用程序的所有导入之前覆盖此功能?或者可能还有另一个解决方案。我真的不想通过发送这些第三方应用程序的电子邮件来修补代码。只需放置HTML模板就很容易。

有帮助吗?

解决方案 4

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

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

其他提示

来自Django文档: 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()。

听起来很多人在误读您的问题。

覆盖从第三方模块导入的,覆盖 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, ,我得到了我的版本。

我的外壳会话

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

免责声明
我从未做过这样的事情,也不知道是否有任何时髦的后果。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top