Machen Sie Django build-in send_mail Funktion Arbeiten mit HTML standardmäßig
-
11-10-2019 - |
Frage
Ich mag Ersatz build-in send_mail Funktion, die nur mit Klartext-E-Mail, mit meiner eigenen Smart send_mail Funktion arbeitet, die sowohl HTML-und einfarbiger erzeugt Textversionen automatisch. Alles funktioniert wie für meine eigenen E-Mails zu erwarten, in meiner eigenen Anwendung definiert. Ich kann auf diese Weise in views.py tun:
from django.core import mail
from utils import send_mail as send_html_mail
mail.send_mail = send_html_mail
Aber das Problem scheint immer noch mit E-Mail von Drittseitigen Anwendungen. Dort werden alle Importe bereits abgeschlossen, bevor mein Code mit Affe-Patchen von send_mail Funktion.
Ist es möglich, diese Funktion außer Kraft zu setzen, bevor alle Einfuhren aller django-Anwendungen? Oder kann es eine andere Lösung für dieses Problem ist. Ich möchte wirklich nicht Code flicken mit E-Mails dieser Anwendungen von Drittanbietern zu senden. Es ist viel einfach nur setzen HTML-Vorlage.
Lösung 4
schrieb ich Anwendung für schnell von Klartext-E-Mail Schalen basierte E-Mails für alle Projekte Anwendungen in HTML. Es wird funktionieren, ohne dass Django-Code oder Code von Drittteiligen Anwendungen zu modifizieren.
Überprüfen Sie es hier heraus: https://github.com/ramusus/django-email-html
Andere Tipps
Django 1.2 ermöglicht für steckbare E-Mail-Backends: http://docs.djangoproject.com/en/1.2/topics/email/#defining-a-custom-e-mail-backend
Von Django docs: http: // docs .djangoproject.com / en / dev / Themen / E-Mail / # Senden-alternative-Content-Typen
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()
Nein send_mail () erforderlich ist.
klingt wie eine Menge Leute sind Verlesen Ihre Frage.
Um den Import von Drittanbieter-Module außer Kraft setzen, sys.modules['django.core.mail']
funktionieren könnte überschrieben werden.
Es funktioniert in einfachen Tests, aber es ist nicht gründlich getestet.
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
Zum Beispiel, wenn ich diesen Code in meinem settings.py
setzen und starten Sie die manage.py shell
und Import send_mail
, erhalte ich meine Version.
Meine Shell-Sitzung
In [1]: from django.core.mail import send_mail
In [2]: send_mail()
Sent!11
Hinweis
Ich habe noch nie etwas getan, wie diese und nicht wissen, ob es irgendwelche flippigen Verzweigungen sind.
Wie wäre es django
ein wenig verändert und Original-Code mit Ihrer eigenen Funktion ersetzen? Sie können tatsächlich nur Ihre eigene Funktion hinzufügen und entfernen Sie nicht die alten, wie die letzte Definition importiert werden. Ich weiß nicht, wie solche Lösungen, weil ich nicht wie externe Bibliotheken Patchen (Sie brauchen, um über das Patchen sie wieder zu erinnern, wenn Sie ein Upgrade), aber dies Ihr Problem schnell lösen würde.
In Django 1.7 zusätzliches Attribute html_message
zu send_mail()
Funktion hinzugefügt HTML-Nachricht zu senden.
https://docs.djangoproject.com/en/1.8 / Themen / E-Mail / # send-mail