Flask-Mail — це розширення для Flask, яке спрощує надсилання електронних листів із вашого Flask додатку. Воно ідеально підходить для відправлення вітальних листів, сповіщень, скидань паролів тощо.
Цей блог пояснить, що таке Flask-Mail, як його налаштувати та інші методи надсилання листів у Flask додатку.
Що таке Flask-Mail?
Flask-Mail — це розширення, яке додає можливість надсилання електронних листів у вашому додатку. Воно побудоване на основі вбудованої бібліотеки Python для Simple Mail Transfer Protocol (smtplib), що дозволяє легко працювати з поштовими протоколами та налаштуваннями.
Flask-Mail підтримує такі можливості:
- Надсилання простих текстових і HTML листів
- Використання шаблонів електронних листів для динамічного вмісту
- Інтеграція з різними поштовими сервісами (наприклад, Gmail, SendGrid тощо)
Чому використовувати Flask-Mail?
Flask-Mail спрощує інтеграцію електронної пошти таким чином, що це інтуїтивно зрозуміло та відповідає принципам дизайну Flask. Основні переваги:
- Легкість у використанні: За мінімальної конфігурації ви можете без зусиль надсилати листи.
- Можливість налаштування: Підтримка шаблонів електронних листів та вкладень.
- Гнучкість: Добре інтегрується з екосистемою Flask та іншими розширеннями, такими як Flask-WTF або Flask-Security.
Налаштування Flask-Mail
Перед тим як налаштувати Flask-Mail, переконайтесь, що у вас встановлені Python та Flask у вашому середовищі. Flask-Mail можна встановити за допомогою pip або pipenv:
pip install flask-mail
Або pipenv
pipenv install flask-mail
Конфігурація
У вашому Flask додатку налаштуйте необхідні параметри для Flask-Mail:
from flask_mail import Mail # Імпортуємо клас Mail для роботи з електронною поштою
# Ініціалізація Flask додатку
app = Flask(__name__)
# Конфігурація Flask-Mail
app.config['MAIL_SERVER'] = 'smtp.gmail.com' # SMTP сервер для Gmail
app.config['MAIL_PORT'] = 587 # Номер порту для TLS шифрування (зазвичай 587)
app.config['MAIL_USE_TLS'] = True # Включає TLS шифрування для безпечного обміну листами
app.config['MAIL_USERNAME'] = '[email protected]' # Ваша електронна адреса (використовується для автентифікації)
app.config['MAIL_PASSWORD'] = 'your_email_password' # Ваш пароль від електронної пошти (використовується для автентифікації)
app.config['MAIL_DEFAULT_SENDER'] = '[email protected]' # За замовчуванням адреса відправника для листів
# Ініціалізація Flask-Mail з Flask додатком
mail = Mail(app) # Створюється екземпляр Mail і асоціюється з Flask додатком
У вашому файлі .env додайте наступне:
MAIL_SERVER=smtp.example.com # Поштовий сервер, який ви використовуєте (замініть на фактичний сервер, наприклад smtp.gmail.com)
MAIL_PORT=587 # Порт для поштового сервера (587 — типовий для SMTP)
MAIL_USE_TLS=True # Чи використовувати TLS шифрування, має бути 'True' для безпечних листів
[email protected] # Ваша електронна адреса (наприклад, [email protected])
MAIL_PASSWORD=my_secure_password # Ваш пароль від електронної пошти (повинен бути конфіденційним)
[email protected] # За замовчуванням адреса відправника для вашого додатку (зазвичай це ваша електронна адреса)
SESSION_SECRET=my_random_secret_key # Секретний ключ для управління сесіями в Flask
Надсилання листів
Далі нам потрібно вибрати маршрут, де це використовуватиметься.
У цьому прикладі я створюю маршрут для реєстрації, щоб, коли хтось реєструється, відправлялося привітальне повідомлення.
from flask_mail import Message
from flask import render_template, current_app
import datetime
class Signup:
# Метод для відправлення привітального листа користувачу
def send_welcome_email(self, user):
try:
# Переконуємось, що код працює в правильному контексті Flask додатку
with current_app.app_context(): # Поточний контекст додатку необхідний для розширень Flask, таких як Flask-Mail
# Створюємо нове повідомлення
msg = Message(
"Welcome to Our App!", # Тема листа
recipients=[user.email], # Список отримувачів (електронна адреса користувача)
)
# Рендеримо HTML вміст листа за допомогою шаблону
msg.html = render_template(
"welcome_message.html", # HTML шаблон для вмісту листа
user=user, # Передаємо об'єкт користувача в шаблон для персоналізації (ім'я користувача)
current_year=datetime.datetime.now().year # Передаємо поточний рік для відображення в листі
)
# Надсилаємо лист за допомогою розширення Flask-Mail
mail.send(msg) # Надсилання електронного листа
print("Welcome email sent successfully!") # Виводимо повідомлення про успішне надсилання листа
except Exception as e:
# Якщо виникає помилка під час відправлення листа, ловимо виключення і виводимо повідомлення про помилку
print(f"Error sending email: {e}")
Пояснення:
- Message Class: Використовується для визначення теми, отримувачів і вмісту листа.
- HTML Templates: Функція render-template динамічно генерує вміст листа.
- Обробка помилок: Блок try-except забезпечує реєстрацію проблем без переривання роботи додатку.
Шаблони
Шаблони — чудовий спосіб зробити ваші електронні листи привабливими та динамічними. В прикладі вище показано, як використовувати render_template. Створіть папку templates у головному каталозі вашого сервера та створіть HTML файл для вмісту листа. Ось простий приклад:
Welcome, {{ user.name }}!
Thank you for signing up! We're thrilled to have you as part of our community.
Stay tuned for more exciting content coming your way!
© {{ current_year }} Our Blog. All rights reserved.
```
## Альтернативні бібліотеки для електронної пошти
Деякі інші бібліотеки, які ви можете розглянути для використання:
- SMTP з smtplib: вбудована бібліотека Python для низькорівневого контролю над відправкою листів через SMTP сервіси.
- SendGrid: надає Python SDK для відправлення листів через свій API, що ідеально підходить для масштабованості. SendGrid також чудово підходить для відправлення листів у великих обсягах та має розширені функції, як-от аналітика.
## Висновок
Flask-Mail — потужний інструмент для інтеграції функціоналу електронної пошти у ваші Flask додатки з мінімальними зусиллями. Незалежно від того, чи відправляєте ви прості текстові листи, чи динамічно згенеровані HTML вмісти, він надає всі інструменти для створення надійних функцій на основі електронної пошти.
Для більш складних вимог розгляньте альтернативні бібліотеки, такі як SendGrid або smtplib для прямої інтеграції з SMTP.
Щасливого кодування!
Перекладено з: [Introduction to Flask-Mail](https://medium.com/@kalebmalone7/introduction-to-flask-mail-89cccfeba067)