Faire Django accumulation dans le travail de la fonction send_mail avec html par défaut

StackOverflow https://stackoverflow.com/questions/4685774

  •  11-10-2019
  •  | 
  •  

Question

Je veux remplacer l'accumulation send_mail fonction, qui ne fonctionne qu'avec des e-mails en texte brut, avec mon propre smart send_mail fonction , qui génère à la fois html et Plain- versions texte automatiquement. Tout fonctionne comme prévu pour mes propres courriels, définis dans ma propre application. Je peux le faire en views.py de cette façon:

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

Mais le problème apparaît toujours avec des e-mails des applications tierces côté. Là toutes les importations déjà effectuées avant mon code avec le singe ragréage de send_mail fonction .

Est-il possible de passer outre cette fonction avant toutes les importations de toutes les applications django? Ou peut-être il y a une autre solution de ce problème. Je ne veux vraiment pas patcher le code avec l'envoi de courriels de ces applications tierces. Il est beaucoup plus facile que de mettre html-template.

Était-ce utile?

La solution 4

J'ai écrit la demande de commutation rapidement des e-mails en texte brut aux e-mails HTML pour toutes les applications de projet. Il fonctionnera sans modifier le code Django ou un code d'autres applications tierces parties.

Check it out ici: https://github.com/ramusus/django-email-html

Autres conseils

De Django docs: http: // docs .djangoproject.com / fr / dev / sujets / email / # Fautes-content-types alternatifs

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()

Non send_mail () nécessaire.

Les sons comme beaucoup de gens interprètent mal votre question.

Pour passer outre l'importation de modules tiers, travail pourrait écraser de sys.modules['django.core.mail'].

Il fonctionne dans des tests simples, mais il est pas complètement testé.

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

Par exemple, si je mets ce code dans mon settings.py et lancer le manage.py shell de send_mail et l'importation, je reçois ma version.

Ma session shell

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

Disclaimer J'ai jamais fait quoi que ce soit comme ça et je ne sais pas s'il y a des ramifications funky.

Que diriez-vous de changer django un peu et son remplacement par code original avec votre propre fonction? Vous pouvez en fait juste ajouter votre propre fonction et ne retirez pas l'ancien, comme la dernière définition sera importée. Je ne aime pas ces solutions, parce que je ne aime pas patcher les bibliothèques externes (vous devez retenir sur les retaper à nouveau lorsque vous mettez à niveau), mais cela résoudrait votre problème rapidement.

Dans Django 1.7 ajouté html_message attribut supplémentaire à la fonction send_mail() pour envoyer un message html.

https://docs.djangoproject.com/en/1.8 / sujets / email / #-mail envoyer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top