Django рендерит HTML-файл без включения статических файлов (стилей CSS, изображений).
Там я попытался отобразить HTML-файл
html_message = get_template('mail.html').render(context=data)
email = EmailMultiAlternatives(
"Subject",
html_message,
settings.EMAIL_HOST_USER,
['example@gmail.com', ],
)
email.attach_alternative(html_message, 'text/html')
email.send(fail_silently=False)
Файл HTML
{% load static %}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Title</title>
<link rel="stylesheet" href="{% static 'mail.css' %}">
</head>
<body>
<header>
<div>
<img class="logo" src="{% static 'logo.svg' %}" alt="">
</div>
</header>
</body>
Как результат HTML файл был отрисован без статических файлов
Проблема в том, что сгенерированная часть с помощью static использует относительные URL для статических активов (например, /static/logo.svg). Я думаю, что это ожидаемое поведение, и поскольку URL не является абсолютным (отсутствует часть имени хоста), почтовый клиент никак не сможет получить его правильно.
Это также объясняет, почему он работает в онлайн-версии.
Вы можете найти хорошую зацепку здесь: Django Получение абсолютных url для статических файлов
Редактирование: более точно, тег static генерирует путь актива, используя настройку STATIC_URL, которую люди обычно используют по умолчанию static/. Одним из способов решения вашей проблемы было бы установить здесь абсолютный базовый url (т.е. https://your-hostname.com/static/)