Domanda

Voglio inviare messaggi di posta elettronica HTML, utilizzando i modelli di Django in questo modo:

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

non riesco a trovare nulla di send_mail e django-mailer invia solo modelli HTML, senza dati dinamici.

Come faccio a usare template engine di Django per generare e-mail?

È stato utile?

Soluzione

la documentazione , a inviare e-mail HTML che si desidera utilizzare tipi di contenuti alternativi, in questo modo:

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

probabilmente si vorrà due modelli per la tua e-mail - un testo in chiaro quella che sembra qualcosa di simile, memorizzato nella directory dei modelli sotto email.txt:

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

e uno HTMLy, stoccato in email.html:

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

È quindi possibile inviare una e-mail utilizzando entrambi questi modelli, facendo uso di get_template , in questo modo:

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

Altri suggerimenti

ragazzi e ragazze!

Dal Django di 1,7 nel send_email metodo il parametro html_message è stato aggiunto.

  

html_message: Se viene fornito html_message, l'e-mail risultante sarà   un'email multipart / alternative con il messaggio di come il testo di contenuti / plain   tipo e html_message come text / html tipo di contenuto.

Quindi, si può semplicemente:

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

ho fatto django-su modelli-mail nel tentativo di risolvere questo problema, ispirato da questa soluzione (e la necessità di, ad un certo punto, passare da Django modelli di utilizzare un set MailChimp ecc di modelli per transazionali, e-mail su modelli per il mio progetto). E 'ancora un work-in-progress, però, ma per l'esempio precedente, si farebbe:

from templated_email import send_templated_mail
send_templated_mail(
        'email',
        'from@example.com',
        ['to@example.com'],
        { 'username':username }
    )

Con l'aggiunta delle seguenti operazioni per settings.py (per completare l'esempio):

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

Questa cercherà automaticamente modelli definiti 'templated_email / email.txt' e 'templated_email / email.html' per il normale e HTML parti, rispettivamente, nelle normali modelli di Django dirs / caricatori (lamentarsi se non riesce a trovare almeno una di quelli).

Utilizzare EmailMultiAlternatives e render_to_string a fare uso di due modelli alternativi (uno in testo normale e uno 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 = ['to@example.com']
email.send()

Ho creato Django Simple Mail avere un semplice, template personalizzabile e riutilizzabile per ogni email transazionale che si desidera inviare.

Messaggi di posta elettronica contenuti e modelli possono essere modificati direttamente da amministrazione di Django.

Con il vostro esempio, è necessario registrare il proprio 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)

E inviare in questo modo:

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)

mi piacerebbe ottenere tutte le risposte.

C'è un errore nell'esempio .... se lo si utilizza come scritto, verifica il seguente errore:

  

: oggetto 'dict' non ha un attributo 'render_context'

Sarà necessario aggiungere la seguente importazione:

from django.template import Context

e cambiare il dizionario di essere:

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

http: //docs.djangoproject. com / it / 1.2 / ref / templates / api / # il rendering-a-contesto

Django posta su modelli è un ricco di funzionalità Django all'applicazione di inviare messaggi di posta elettronica con il sistema di template Django.

Installazione:

pip install django-mail-templated

Configurazione:

INSTALLED_APPS = (
    ...
    'mail_templated'
)

Template:

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

Più informazioni: https://github.com/artemrizhov/django-mail-templated

ho scritto un frammento che consente di inviare messaggi di posta elettronica resi con modelli memorizzati nel database. Un esempio:

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

Se vuoi modelli di posta elettronica dinamici per la posta quindi salvare il contenuto della posta elettronica nelle tabelle del database. Questo è ciò che ho salvato come codice HTML nel database =

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

Nel vostro punto di vista:

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

Questo invierà l'HTML dinamico modello di quello che hai, salvo in Db.

Mi piace usare questo strumento per permettere facilmente inviare e-mail HTML e TXT con facilità di lavorazione contesto: https: //github.com/divio/django-emailit

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top