examples - Crear plantillas de correo electrónico con Django
ejemplos de proyectos en django (8)
¡Niños y niñas!
Desde el 1.7 de Django en el método html_message
, se agregó 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 un mensaje como texto / tipo de contenido simple y html_message como el tipo de contenido text / html.
Entonces puedes simplemente:
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,
)
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?
Desde los documentos , para enviar un correo electrónico HTML, quiere usar 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ás dos plantillas para tu correo electrónico, una de texto simple que se ve más o menos así, almacenada en tu directorio de plantillas debajo de email.txt
:
Hello {{ username }} - your account is activated.
y uno HTMLy, almacenado 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
, como este:
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()
Escribí un snippet que le permite enviar correos electrónicos procesados 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,
})
Hay un error en el ejemplo ... si lo usa como está escrito, se produce el siguiente error:
<type ''exceptions.Exception''>: el objeto ''dict'' no tiene atributo ''render_context''
Deberá agregar la siguiente importación:
from django.template import Context
y cambia el diccionario para ser:
d = Context({ ''username'': username })
Ver http://docs.djangoproject.com/en/1.2/ref/templates/api/#rendering-a-context
He hecho django-templated-email en un esfuerzo por resolver este problema, inspirado por esta solución (y la necesidad de, en algún momento, pasar de usar plantillas de django a usar un conjunto de plantillas mailchimp, etc. para correos electrónicos transaccionales y con plantillas para mi propio proyecto). Sin embargo, todavía es un trabajo en progreso, pero para el ejemplo anterior, lo 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 buscará automáticamente plantillas llamadas ''templated_email / email.txt'' y ''templated_email / email.html'' para las partes plain y html respectivamente, en la plantilla django normal dirs / loaders (quejándose si no puede encontrar al menos una de ellas) .
Me gusta usar esta herramienta para permitir enviar correos electrónicos HTML y TXT con facilidad con el procesamiento de contexto fácil: https://github.com/divio/django-emailit
Use EmailMultiAlternatives y render_to_string para hacer uso de dos plantillas alternativas (una en texto sin formato 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()
Django Mail Templated es una aplicación Django rica en características para enviar correos electrónicos con el sistema de plantillas de Django.
Instalación:
pip install django-mail-templated
Configuración:
INSTALLED_APPS = (
...
''mail_templated''
)
Modelo:
{% block subject %}
Hello {{ user.name }}
{% endblock %}
{% block body %}
{{ user.name }}, this is the plain text part.
{% endblock %}
Pitón:
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