4

我想用我自己的智能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函数的猴子补丁。

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

4

6 回答 6

4

Django 1.2 允许可插入的电子邮件后端:http ://docs.djangoproject.com/en/1.2/topics/email/#defining-a-custom-e-mail-backend

于 2011-01-13T22:12:52.417 回答
2

来自 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()。

于 2011-01-13T22:11:54.290 回答
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

例如,如果我将该代码放入 mysettings.py并启动manage.py shelland import send_mail,我会得到我的版本。

我的 shell 会话

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

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

于 2011-01-13T22:56:19.767 回答
1

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

在这里查看:https ://github.com/ramusus/django-email-html

于 2011-01-15T21:14:20.520 回答
0

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

于 2011-01-13T22:02:39.757 回答
0

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

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

于 2015-11-05T16:36:41.070 回答