Création de modèles de Django email
-
25-09-2019 - |
Question
Je veux envoyer des e-mails HTML, en utilisant des modèles Django comme ceci:
<html>
<body>
hello <strong>{{username}}</strong>
your account activated.
<img src="mysite.com/logo.gif" />
</body>
Je ne trouve rien send_mail
, et django-mailer envoie uniquement des modèles HTML, sans données dynamiques.
Comment puis-je utiliser le moteur de template de Django pour générer des e-mails?
La solution
De les docs , à envoyer HTML e-mail que vous souhaitez utiliser des types de contenu-alternatives, comme ceci:
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()
Vous voudrez probablement deux modèles pour votre e-mail - un texte brut qui ressemble à quelque chose comme ça, stocké dans votre répertoire de modèles sous email.txt
:
Hello {{ username }} - your account is activated.
et un HTMLy un, stocké sous email.html
:
Hello <strong>{{ username }}</strong> - your account is activated.
Vous pouvez envoyer un e-mail en utilisant ces deux modèles en utilisant get_template
, comme ceci:
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template
from django.template import Context
plaintext = get_template('email.txt')
htmly = get_template('email.html')
d = Context({ 'username': username })
subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = plaintext.render(d)
html_content = htmly.render(d)
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
Autres conseils
Garçons et filles!
Depuis Django 1.7 send_email méthode du paramètre html_message
a été ajouté.
html_message: Si html_message est fourni, l'e-mail résultant sera un e-mail multipart / alternative avec le message que le texte / contenu simple type et html_message comme le type de contenu texte / html.
Vous pouvez simplement:
from django.core.mail import send_mail
from django.template.loader import render_to_string
msg_plain = render_to_string('templates/email.txt', {'some_params': some_params})
msg_html = render_to_string('templates/email.html', {'some_params': some_params})
send_mail(
'email title',
msg_plain,
'some@sender.com',
['some@receiver.com'],
html_message=msg_html,
)
J'ai fait django-templated-email dans un effort pour résoudre ce problème, inspiré par cette solution (et la nécessité de, à un moment donné, passer de l'aide de modèles de django à l'aide d'un MailChimp etc. ensemble de modèles pour e-mails transactionnels, pour mon propre templated projet). Il est encore un travail en cours bien, mais pour l'exemple ci-dessus, vous feriez:
from templated_email import send_templated_mail
send_templated_mail(
'email',
'from@example.com',
['to@example.com'],
{ 'username':username }
)
Avec l'ajout des éléments suivants à settings.py (pour compléter l'exemple):
TEMPLATED_EMAIL_DJANGO_SUBJECTS = {'email':'hello',}
automatiquement rechercher les modèles nommés « templated_email / email.txt » et « templated_email / email.html » pour les parties respectivement et HTML, dans le modèle de django normales dirs / chargeurs (si elle peut se plaignant pas trouver au moins un de celles-ci).
Utilisez EmailMultiAlternatives et render_to_string d'utiliser deux modèles alternatifs (un en texte brut et un en html):
from django.core.mail import EmailMultiAlternatives
from django.template import Context
from django.template.loader import render_to_string
c = Context({'username': username})
text_content = render_to_string('mail/email.txt', c)
html_content = render_to_string('mail/email.html', c)
email = EmailMultiAlternatives('Subject', text_content)
email.attach_alternative(html_content, "text/html")
email.to = ['to@example.com']
email.send()
J'ai créé Django Simple Mail pour avoir un modèle simple, personnalisable et réutilisable pour chaque courriel transactionnel que vous souhaitez envoyer.
contenu des e-mails et les modèles peuvent être modifiés directement à partir admin de django.
Avec votre exemple, vous enregistrez votre e-mail:
from simple_mail.mailer import BaseSimpleMail, simple_mailer
class WelcomeMail(BaseSimpleMail):
email_key = 'welcome'
def set_context(self, user_id, welcome_link):
user = User.objects.get(id=user_id)
return {
'user': user,
'welcome_link': welcome_link
}
simple_mailer.register(WelcomeMail)
envoyer cette façon:
welcome_mail = WelcomeMail()
welcome_mail.set_context(user_id, welcome_link)
welcome_mail.send(to, from_email=None, bcc=[], connection=None, attachments=[],
headers={}, cc=[], reply_to=[], fail_silently=False)
J'aimerais obtenir des commentaires.
Il y a une erreur dans l'exemple .... si vous l'utilisez comme écrit, l'erreur suivante se produit:
: objet 'dict' n'a pas d'attribut 'render_context'
Vous devrez ajouter l'importation suivante:
from django.template import Context
et changer le dictionnaire être:
d = Context({ 'username': username })
Voir http: //docs.djangoproject. com / fr / 1.2 / ref / templates / api / # rendu-un-contexte
Django Courrier Templated est un Django fonctionnalité riche application d'envoyer des e-mails avec un système de template Django.
Installation:
pip install django-mail-templated
Configuration:
INSTALLED_APPS = (
...
'mail_templated'
)
Modèle:
{% block subject %}
Hello {{ user.name }}
{% endblock %}
{% block body %}
{{ user.name }}, this is the plain text part.
{% endblock %}
Python:
from mail_templated import send_mail
send_mail('email/hello.tpl', {'user': user}, from_email, [user.email])
Plus d'infos: https://github.com/artemrizhov/django-mail-templated
J'ai écrit un extrait qui vous permet d'envoyer des e-mails rendus avec des modèles stockés dans la base de données. Un exemple:
EmailTemplate.send('expense_notification_to_admin', {
# context object that email template will be rendered with
'expense': expense_request,
})
Si vous voulez des modèles de courrier électronique dynamique pour votre courrier puis enregistrez le contenu du courrier électronique dans vos tables de base de données. C'est ce que je code HTML sauvegardé dans la base de données =
<p>Hello.. {{ first_name }} {{ last_name }}. <br> This is an <strong>important</strong> {{ message }}
<br> <b> By Admin.</b>
<p style='color:red'> Good Day </p>
Dans votre point de vue:
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template
def dynamic_email(request):
application_obj = AppDetails.objects.get(id=1)
subject = 'First Interview Call'
email = request.user.email
to_email = application_obj.email
message = application_obj.message
text_content = 'This is an important message.'
d = {'first_name': application_obj.first_name,'message':message}
htmly = FirstInterviewCall.objects.get(id=1).html_content #this is what i have saved previously in database which i have to send as Email template as mentioned above HTML code
open("partner/templates/first_interview.html", "w").close() # this is the path of my file partner is the app, Here i am clearing the file content. If file not found it will create one on given path.
text_file = open("partner/templates/first_interview.html", "w") # opening my file
text_file.write(htmly) #putting HTML content in file which i saved in DB
text_file.close() #file close
htmly = get_template('first_interview.html')
html_content = htmly.render(d)
msg = EmailMultiAlternatives(subject, text_content, email, [to_email])
msg.attach_alternative(html_content, "text/html")
msg.send()
envoie le modèle HTML dynamique ce que vous avez enregistrer dans Db.
J'aime utiliser cet outil pour permettre facilement d'envoyer HTML et TXT e-mail avec un traitement facile du contexte: https: //github.com/divio/django-emailit