it-swarm.com.de

Erstellen von E-Mail-Vorlagen mit Django

Ich möchte HTML-E-Mails mit folgenden Django Vorlagen versenden:

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

Ich kann nichts über send_mail Finden und Django-Mailer sendet nur HTML-Vorlagen ohne dynamische Daten.

Wie benutze ich Djangos Template-Engine, um E-Mails zu generieren?

190
Anakin

Von die Dokumente , um HTML-E-Mails zu senden, möchten Sie alternative Inhaltstypen verwenden, wie folgt:

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

Sie benötigen wahrscheinlich zwei Vorlagen für Ihre E-Mail - eine einfache Textvorlage, die in etwa so aussieht und in Ihrem Vorlagenverzeichnis unter email.txt Gespeichert ist:

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

und ein HTMLy, gespeichert unter email.html:

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

Sie können dann eine E-Mail mit diesen beiden Vorlagen senden, indem Sie get_template wie folgt verwenden:

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

Jungen und Mädchen!

Seit Djangos 1.7 in send_email Methode ist das html_message Parameter wurde hinzugefügt.

html_message: Wenn html_message angegeben ist, handelt es sich bei der resultierenden E-Mail um eine mehrteilige/alternative E-Mail mit Nachricht als Text-/Nur-Inhaltstyp und html_message als Text-/HTML-Inhaltstyp.

Sie können also einfach:

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

Ich habe Django-templated-email gemacht, um dieses Problem zu lösen, inspiriert von dieser Lösung (und der Notwendigkeit, irgendwann von der Verwendung von Django zu wechseln Vorlagen für die Verwendung eines Mailchimp usw. Vorlagen für Transaktions-E-Mails mit Vorlagen für mein eigenes Projekt.) Es ist zwar noch in Arbeit, aber für das obige Beispiel würden Sie Folgendes tun:

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

Mit dem folgenden Zusatz zu settings.py (um das Beispiel zu vervollständigen):

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

Dies sucht automatisch nach Vorlagen mit den Namen 'templated_email/email.txt' und 'templated_email/email.html' für den einfachen bzw. den HTML - Teil in den normalen Django Vorlagenverzeichnissen/- ladern (beschwert sich, wenn es kann nicht mindestens einen von diesen finden).

26
Darb

Verwenden Sie EmailMultiAlternatives und render_to_string, um zwei alternative Vorlagen zu verwenden (eine im Klartext und eine in 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

Ich habe Django Simple Mail erstellt, um eine einfache, anpassbare und wiederverwendbare Vorlage für jede Transaktions-E-Mail zu haben, die Sie senden möchten.

E-Mail-Inhalte und -Vorlagen können direkt vom Django-Administrator bearbeitet werden.

Mit Ihrem Beispiel würden Sie Ihre E-Mail registrieren:

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)

Und senden Sie es auf diese Weise:

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)

Ich würde mich über Feedback freuen.

4
Charlesthk

Django Mail Templated ist eine funktionsreiche Anwendung Django zum Versenden von E-Mails mit dem Vorlagensystem Django .

Installation:

pip install Django-mail-templated

Aufbau:

INSTALLED_APPS = (
    ...
    'mail_templated'
)

Vorlage:

{% 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])

Weitere Informationen: https://github.com/artemrizhov/Django-mail-templated

3
raacer

In dem Beispiel ist ein Fehler aufgetreten. Wenn Sie es wie beschrieben verwenden, tritt der folgende Fehler auf:

<type 'exceptions.Exception'>: Objekt 'dict' hat kein Attribut 'render_context'

Sie müssen den folgenden Import hinzufügen:

from Django.template import Context

und ändere das Wörterbuch in:

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

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

3
idbill

Wenn Sie dynamische E-Mail-Vorlagen für Ihre E-Mail wünschen, speichern Sie den E-Mail-Inhalt in Ihren Datenbanktabellen. Dies ist, was ich als HTML-Code in database = gespeichert habe

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

In Ihren Ansichten:

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

Dadurch wird die dynamische HTML-Vorlage gesendet, die Sie in Db gespeichert haben.

0
Javed

Ich habe ein Snippet geschrieben, mit dem Sie E-Mails senden können, die mit in der Datenbank gespeicherten Vorlagen erstellt wurden. Ein Beispiel:

EmailTemplate.send('expense_notification_to_admin', {
    # context object that email template will be rendered with
    'expense': expense_request,
})
0
Andrey Zarubin