web-dev-qa-db-fra.com

Création de modèles de courrier électronique avec Django

Je veux envoyer des emails HTML, en utilisant Django des templates comme ceci:

<html>
<body>
hello <strong>{{username}}</strong>
your account activated.
<img src="mysite.com/logo.gif" />
</body>

Je ne trouve rien à propos de send_mail, et Django-mailer n’envoie que des modèles HTML, sans données dynamiques.

Comment utiliser le moteur de templates de Django pour générer des e-mails?

190
Anakin

De the docs , pour envoyer un courrier électronique HTML avec lequel vous souhaitez utiliser des types de contenu alternatifs, comme ceci:

from Django.core.mail import EmailMultiAlternatives

subject, from_email, to = 'hello', '[email protected]', '[email protected]'
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 courrier électronique - un modèle en clair qui ressemble à ceci, stocké dans votre répertoire de modèles sous email.txt:

Hello {{ username }} - your account is activated.

et un HTMLy, stocké sous email.html:

Hello <strong>{{ username }}</strong> - your account is activated.

Vous pouvez ensuite envoyer un courrier électronique 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', '[email protected]', '[email protected]'
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()
357
Dominic Rodger

Garçons et filles!

Depuis la version 1.7 de Django dans send_email , utilisez la méthode html_message paramètre a été ajouté.

html_message: si html_message est fourni, l'email résultant sera un email multipart/alternatif avec le message comme type de contenu text/plain et html_message comme type de contenu text/html.

Donc 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,
    '[email protected]',
    ['[email protected]'],
    html_message=msg_html,
)
208
andilabs

J'ai fait Django-templated-email dans le but de résoudre ce problème, inspiré par cette solution (et la nécessité, à un moment donné, de passer de Django modèles pour utiliser un ensemble mailchimp, etc., de modèles pour les e-mails transactionnels et basés sur un modèle pour mon propre projet). Cela reste cependant un travail en cours, mais pour l'exemple ci-dessus, vous feriez:

from templated_email import send_templated_mail
send_templated_mail(
        'email',
        '[email protected]',
        ['[email protected]'],
        { 'username':username }
    )

Avec l’ajout des éléments suivants à settings.py (pour compléter l’exemple):

TEMPLATED_EMAIL_Django_SUBJECTS = {'email':'hello',}

Ceci recherchera automatiquement les modèles nommés 'templated_email/email.txt' et 'templated_email/email.html' pour les parties plain et html, respectivement, dans le normal Django template dirs/loaders (se plaindre si il ne peut pas en trouver au moins un).

26
Darb

Utilisez EmailMultiAlternatives et render_to_string pour 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 = ['[email protected]']
email.send()
14
Rick Westera

J'ai créé Django Simple Mail afin d’avoir un modèle simple, personnalisable et réutilisable pour chaque email transactionnel que vous souhaitez envoyer.

Le contenu et les modèles des e-mails peuvent être modifiés directement à partir de l’administrateur de Django.

Avec votre exemple, vous enregistreriez votre email:

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)

Et envoyez-le de 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 avoir des commentaires.

4
Charlesthk

Django Mail Templated est une application riche en fonctionnalités Django permettant d'envoyer des emails avec le système de templates 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

3
raacer

Il y a une erreur dans l'exemple .... si vous l'utilisez tel quel, l'erreur suivante se produit:

<type 'exceptions.Exception'>: l'objet 'dict' n'a pas d'attribut 'render_context'

Vous devrez ajouter l'importation suivante:

from Django.template import Context

et changez le dictionnaire pour qu'il soit:

d = Context({ 'username': username })

Voir http://docs.djangoproject.com/fr/1.2/ref/templates/api/#rendering-a-context

3
idbill

Si vous souhaitez des modèles de courrier électronique dynamiques pour votre courrier, sauvegardez le contenu du courrier dans vos tables de base de données. C'est ce que j'ai enregistré en tant que code HTML 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 vos vues:

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

Cela enverra au modèle HTML dynamique ce que vous avez enregistré dans Db.

0
Javed

J'ai écrit un extrait qui vous permet d'envoyer des courriels 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,
})
0
Andrey Zarubin