Django rest framework с использованием шаблона для отправки электронного письма
Я хочу отправить стилизованное письмо с использованием HTML-тегов. Письмо отправляется успешно, но без стиля, а HTML-теги представлены в письме как текст.
handles.py
@receiver(order_created)
def on_order_created(sender, **kwargs):
order=kwargs['order']
capture_email= order.customer.user.email
name= order.customer.user.username
title= 'Thank you ' + name
order_items=OrderItem.objects.filter(order=order)
template= render_to_string('index.html',{'order_items':order_items,'name':name})
# text_content = strip_tags(template)
email =EmailMessage(
title,
template,
settings.EMAIL_HOST_USER,
[capture_email],
)
email.fail_silently=False,
email.send()
Класс django.core.mail.EmailMessage отправляет письмо с типом содержимого text/plain, поэтому появляются HTML-теги. У вас может быть два варианта:
- Используйте функцию
django.core.mail.send_mail, указывая в параметреhtml_messageрезультат отрисовки шаблона, примерно так:
# quickly example of sending html mail
from django.core.mail import send_mail
from django.template.loader import get_template
# I preferred get_template(template).render(context) you can use render_to_string if you want
context = {'first_name': 'John', 'last_name': 'Devoe'}
template = get_template('my_custom_template.html').render(context)
send_mail(
'Custom Subject',
None, # Pass None because it's a HTML mail
'from@example.com',
['to@example.com'],
fail_silently=False,
html_message = template
)
- Используйте класс
django.core.mail.EmailMultiAlternatives, если вы хотите реализовать ООП. Таким образом, код будет выглядеть следующим образом:
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template
# I preferred get_template(template).render(context) you can use render_to_string if you want
context = {'first_name': 'John', 'last_name': 'Devoe'}
template = get_template('my_custom_template.html').render(context)
msg = EmailMultiAlternatives(
'Custom Subject',
None, # This is the text context, just send None or Send a string message
'from@example.com',
['to@example.com'],
)
msg.attach_alternative(template, "text/html")
msg.send(fail_silently=False)
Наконец, помните, что отправка по электронной почте не даст доступа к статическим файлам (например, css приложения), поэтому я рекомендую использовать такие инструменты, как Postdrop, которые применяют стили css к HTML онлайн