首页 文章

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

提问于
浏览
3

我想用自己的智能 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就好了 .

6 回答

  • 2
  • 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() .

  • 4

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

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

    My shell session

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

    Disclaimer
    我知道是否有任何时髦的后果 .

  • 0

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

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

  • 1

    如何更改 django 一点并用您自己的函数替换原始代码?你实际上可以添加你自己的功能,并且不喜欢这样的解决方案,因为我不喜欢修补外部库(你需要记住在升级时再次修补它们),但这可以快速解决你的问题 .

  • 0

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

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

相关问题