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?

Était-ce utile?

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

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