Html-шаблоны электронной почты с помощью django

Как отправлять HTML письма со встроенными изображениями в приложении django? Как встроить изображения, например, логотипы, которые будут отображаться в отправленных письмах?

Я попробовал использовать {% load static %} в шаблоне html-почты, но все равно не получилось

Думаю, вам стоит использовать библиотеку «WeasyPrint». Она создает HTML-файл, в который вы можете передавать переменные (например, изображения из статики, текст или что-то еще), и, наконец, вы можете отправить его людям по электронной почте.


pip install weasyprint

from weasyprint import HTML

html_string = render_to_string('invoice.html', order_data)

html = HTML(string=html_string)
pdf_file = BytesIO()
html.write_pdf(pdf_file)

pdf_content = pdf_file.getvalue()

send_email(
    'sender',
    'subject',
    'body',
    pdf_content
)

Надеюсь, я смог вам помочь.

задавайте дополнительные вопросы gpt.

Поскольку письмо будет отображаться на других серверах (например, Gmail), не следует использовать относительный адрес для загрузки изображения в шаблоне письма, а нужно использовать полный адрес с hostname для загрузки изображения в письмо.

Мы используем {% load_static %} в обычных шаблонах для адресации и загрузки изображений. Например, :

<img src={% static "images/logo.png" %}>

Но в шаблонах писем нужно добавить hostname вместо тега static. например, :

<img src="{{YOUR_HOST_NAME}}/static/images/logo.png">

Мне удалось найти простой способ решения проблемы, который заключается в передаче изображений в качестве переменных в ваш почтовый шаблон. Вкратце, я отправлял несколько писем пользователям, к письму были прикреплены файлы[imageA.jpg, imageB.jpg], а также несколько статических изображений [img1.jpg, img2.jpg]

def send_notice_email(sender, instance, created, **kwargs):
    
 if created:
    all_users = CustomUser.objects.all()

    subject = **********
    context = {
      'title': ********,
      'content': ********,
            }
    
    # List of image paths to attach
    image_paths = [
      'static/images/imageA.jpg',
      'static/images/imageB.jpg',
       ]
            
     for user in all_users:
    
        context['user'] = user 
                
        html_content=render_to_string('yourappname/email_template.html', 
        context)
        text_content = strip_tags(html_content)
    
        email_message = EmailMultiAlternatives(
            subject=subject,
            body=text_content,
            from_email='youremail@domain',
            to=[user.email],
)
    
# Attach images
for image_path in image_paths:
    with open(image_path, 'rb') as img:
       image_name = image_path.split('/')[-1]
       email_message.attach(image_name, img.read(), 'image/jpeg')  
    
html_content = html_content.replace('src="img1.jpg"', 'src="cid:img1.jpg"')
html_content = html_content.replace('src="img2.jpg"', 'src="cid:img2.jpg"')
    
email_message.attach_alternative(html_content, 'text/html')

email_message.send()

В ваш html-шаблон письма картинки вы будете включать следующим образом:

<img src="{cid:img1.jpg}" alt="img1">
<img src="{cid:img2.jpg}" alt="img2">

Поскольку {% load static %} не работает для шаблона электронной почты, используйте следующий формат

https://www.your-domain.com/static/path_to_image/image_file_name.extension

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