Как отправлять красивые письма в Python-проектах

Создаём email-шаблоны с HTML и CSS: инструкция, шаблон и код для отправки.

PythonРазработка

6 мин

Отправка красивых писем — важная часть любого современного приложения. Будь то регистрация, уведомление или рассылка — простой text/plain уже не вызывает эмоций. А вот HTML-письма — это уже настоящий маркетинг 💥

В этой статье разберём, как создавать и использовать email-шаблоны с HTML и CSS внутри Python-проекта. Это просто и очень полезно!

🔧 Зачем нужны HTML-шаблоны для писем?

  • 📌 Упорядочить структуру письма

  • 🖼 Добавить стили, кнопки, изображения

  • 👀 Сделать письмо визуально привлекательным

  • 📱 Адаптировать под мобильные устройства

🛠️ Что будем использовать?

  • smtplib — для отправки писем

  • email.message.EmailMessage — для формирования письма

  • Jinja2 — для генерации HTML с переменными

  • HTML + встроенный CSS — для оформления

📁 Структура проекта

email_project/
├── main.py
├── templates/
│   └── welcome.html

🧠 Шаг 1: HTML-шаблон письма (templates/welcome.html)

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <style>
    body { font-family: Arial, sans-serif; background-color: #f9f9f9; padding: 20px; }
    .container { background: white; padding: 30px; border-radius: 10px; max-width: 600px; margin: auto; }
    h1 { color: #333; }
    p { color: #555; }
    .button { background-color: #007bff; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; }
  </style>
</head>
<body>
  <div class="container">
    <h1>Привет, {{ name }}!</h1>
    <p>Спасибо за регистрацию. Добро пожаловать в наш проект!</p>
    <a href="{{ link }}" class="button">Подтвердить email</a>
  </div>
</body>
</html>

🧪 Шаг 2: Генерация письма в main.py

import smtplib
from email.message import EmailMessage
from jinja2 import Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('welcome.html')
html_content = template.render(name="Кодик", link="https://itcodik.com/confirm")

msg = EmailMessage()
msg['Subject'] = 'Добро пожаловать!'
msg['From'] = 'noreply@example.com'
msg['To'] = 'user@example.com'
msg.set_content("У вас новое письмо")
msg.add_alternative(html_content, subtype='html')

with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
    smtp.login('your_email@gmail.com', 'your_password')
    smtp.send_message(msg)

Важно: никода не хардкодьте пароль — используйте переменные окружения или .env

📌 Советы по верстке писем

Что учитывать

Почему важно

✅ Инлайн-стили

Почтовики режут <style>

✅ Простая структура

Лучше <table> для надёжности

❌ Не использовать JS

Он не работает в письмах

✅ Изображения через URL

Не прикладывать как файлы без нужды

✅ Тестировать в Gmail, Outlook

Разные движки отображения

📤 Примеры использования

  • Регистрация: письмо с подтверждением

  • Восстановление пароля

  • Новостная рассылка

  • Уведомление о заказе

  • Письмо поддержки

👀 Как протестировать письмо?

Можно сохранить HTML-файл локально:

with open("preview.html", "w", encoding="utf-8") as f:
    f.write(html_content)

🧩 Где пригодится

  • Во Flask-проектах (flask-mail)

  • В Django (EmailMultiAlternatives)

  • В FastAPI через асинхронные SMTP-библиотеки

  • В серверных ботах, уведомлениях, CRM-интеграциях

🧠 Заключение

Создание HTML-писем в Python — это просто! Главное — шаблон, немного стилей и аккуратная отправка.

Если хочешь поэкспериментировать с рассылками и автогенерацией писем — в приложении Кодик ты найдёшь пошаговые курсы, шаблоны и поддержку сообщества. Заходи или пиши в наш телеграм-чат ✌️

💬 Хочешь шаблон письма с адаптивной версткой или интеграцией с Mailgun / SendGrid? Напиши — сделаем продолжение!

Комментарии