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.

War es hilfreich?

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top