Creación de plantillas de correo electrónico con Django


Quiero enviar correos electrónicos HTML, usando plantillas de Django como esta:

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

No puedo encontrar nada sobre send_mail, y django-mailer solo envía plantillas HTML, sin datos dinámicos.

¿Cómo uso el motor de plantillas de Django para generar correos electrónicos?

Author: AnFi, 2010-05-11

10 answers

Desde los documentos , para enviar correo electrónico HTML desea utilizar tipos de contenido alternativos, como este:

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

Probablemente querrá dos plantillas para su correo electrónico, una de texto plano que se vea algo como esto, almacenada en su directorio de plantillas bajo email.txt:

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

Y una HTMLy, almacenada bajo email.html:

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

A continuación, puede enviar un correo electrónico utilizando ambas plantillas haciendo uso de get_template, así:

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()
 327
Author: Dominic Rodger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-12 23:08:58

, Niños y Niñas!

Desde el método 1.7 in send_email de Django se añadió el parámetro html_message.

Html_message: Si se proporciona html_message, el correo electrónico resultante será un correo electrónico multiparte / alternativo con mensaje como texto / contenido plano type y html_message como el tipo de contenido text / html.

Así que solo puedes:

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,
)
 168
Author: Andrzej Kostański,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-02 16:04:40

He hecho django-templated-email en un esfuerzo por resolver este problema, inspirado en esta solución (y la necesidad de, en algún momento, cambiar de usar plantillas de django a usar un mailchimp, etc. conjunto de plantillas para correos electrónicos transaccionales y templados para mi propio proyecto). Sin embargo, todavía es un trabajo en progreso, pero para el ejemplo anterior, haría:

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

Con la adición de lo siguiente a settings.py (para completar el ejemplo):

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

Esto automáticamente busque plantillas llamadas ' templated_email / email.txt ' y ' templated_email / email.html ' para las partes plain y html respectivamente, en los dirs/loaders de plantilla de django normales (quejándose si no puede encontrar al menos uno de ellos).

 26
Author: Darb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 22:50:11

Utilice EmailMultiAlternatives y render_to_string para hacer uso de dos plantillas alternativas (una en texto plano y otra 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()
 12
Author: Rick Westera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-31 02:56:17

Hay un error en el ejemplo.... si lo usa como está escrito, se produce el siguiente error:

: el objeto 'dict' no tiene atributo 'render_context'

Tendrá que agregar la siguiente importación:

from django.template import Context

Y cambia el diccionario a:

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

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

 3
Author: idbill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-29 20:14:02

Django Correo con Plantilla es una aplicación Django rica en funciones para enviar correos electrónicos con el sistema de plantillas Django.

Instalación:

pip install django-mail-templated

Configuración:

INSTALLED_APPS = (
    ...
    'mail_templated'
)

Plantilla:

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

Más información: https://github.com/artemrizhov/django-mail-templated

 3
Author: raacer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-17 18:53:36

He creado Django Simple Mail para tener una plantilla simple, personalizable y reutilizable para cada correo electrónico transaccional que le gustaría enviar.

El contenido de los correos electrónicos y las plantillas se pueden editar directamente desde el administrador de django.

Con su ejemplo, registraría su correo electrónico:

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)

Y enviarlo de esta manera:

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)

Me encantaría recibir comentarios.

 1
Author: Charlesthk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-13 04:58:11

Escribí un fragmento que le permite enviar correos electrónicos renderizados con plantillas almacenadas en la base de datos. Un ejemplo:

EmailTemplate.send('expense_notification_to_admin', {
    # context object that email template will be rendered with
    'expense': expense_request,
})
 0
Author: Andrey Zarubin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-17 12:03:31

Si desea plantillas de correo electrónico dinámicas para su correo, guarde el contenido del correo electrónico en las tablas de la base de datos. Esto es lo que guardé como código HTML en 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>

En sus puntos de 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()

Esto enviará la plantilla HTML dinámica lo que ha guardado en la base de datos.

 0
Author: Javed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-26 04:36:28

Me gusta usar esta herramienta para permitir enviar fácilmente HTML y TXT de correo electrónico con un fácil procesamiento de contexto: https://github.com/divio/django-emailit

 -1
Author: matinfo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-20 15:35:42