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-теги. У вас может быть два варианта:

  1. Используйте функцию 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
)

  1. Используйте класс 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 онлайн

Вернуться на верх