Как в Django реализовать отправку email-сообщений?

Ответ

Отправка email в Django осуществляется через модуль django.core.mail. Процесс включает настройку бэкенда и вызов соответствующей функции.

1. Конфигурация в settings.py

Сначала необходимо настроить параметры SMTP-сервера. Для безопасности никогда не храните учетные данные в коде, используйте переменные окружения.

# settings.py
import os

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.example.com'  # Ваш SMTP-сервер
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')  # Логин из переменных окружения
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS') # Пароль

2. Отправка простого текстового письма

Для быстрой отправки используется функция send_mail.

from django.core.mail import send_mail

send_mail(
    subject='Тема письма',
    message='Текст сообщения.',
    from_email='noreply@example.com', # Должен совпадать с EMAIL_HOST_USER или быть разрешенным
    recipient_list=['recipient1@example.com'],
    fail_silently=False, # Если True, ошибки отправки будут проигнорированы
)

3. Отправка HTML-письма

Для большего контроля и отправки HTML-контента используется класс EmailMessage.

from django.core.mail import EmailMessage
from django.template.loader import render_to_string

# Можно использовать шаблонизатор Django для генерации HTML
html_content = render_to_string('emails/welcome.html', {'user': 'John'})

email = EmailMessage(
    'Тема письма с HTML',
    'Это сообщение будет показано, если почтовый клиент не поддерживает HTML.',
    'from@example.com',
    ['to@example.com']
)
email.attach_alternative(html_content, "text/html")
email.send()

Рекомендации для Production

В production-среде отправку писем следует выполнять асинхронно с помощью очередей задач (например, Celery), чтобы не блокировать основной поток приложения и не замедлять ответ пользователю.

Ответ 18+ 🔞

Ага, смотри, тут про почту в Джанге. Ну, в общем, всё просто, как три копейки, но если накосячить — письма твои в никуда улетят, как хуй с горы.

Слушай, первым делом надо в settings.py всё настроить. Это как на почте контору свою зарегистрировать, понимаешь? Только пароли и логины ни в коем случае в код не пихай, а то какой-нибудь пидарас шерстяной их утянет. Используй переменные окружения, я серьёзно.

# settings.py
import os

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.example.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')

Вот, видишь? os.environ.get — это наш спасательный круг. Без него — пиши пропало, доверия ебать ноль к такому коду.

Ну а дальше, если тебе просто текст отправить, то проще некуда. Функция send_mail — твой друг.

from django.core.mail import send_mail

send_mail(
    subject='Тема письма',
    message='Текст сообщения.',
    from_email='noreply@example.com',
    recipient_list=['recipient1@example.com'],
    fail_silently=False,
)

Только смотри, fail_silently=False поставь, а то письмо не уйдёт, а ты и не узнаешь — волнение ебать потом будет, где же ответ-то.

А если хочешь красоты нахуярить, HTML там всякий, то уже EmailMessage в руки бери. Это как из рогатки стрельнуть или из пушки — разница, блядь, ощутимая.

from django.core.mail import EmailMessage
from django.template.loader import render_to_string

html_content = render_to_string('emails/welcome.html', {'user': 'John'})

email = EmailMessage(
    'Тема письма с HTML',
    'Это сообщение будет показано, если почтовый клиент не поддерживает HTML.',
    'from@example.com',
    ['to@example.com']
)
email.attach_alternative(html_content, "text/html")
email.send()

Вот, attach_alternative — это ключевой момент. Без него твой HTML-шедевр так и останется мечтой, а клиент покажет голый текст. Пиздопроебибна, да?

И главное, запомни на всю жизнь: в продакшене никогда не шли письма прямо из вьюхи! Представь, пользователь кнопку нажал, а твоё приложение тупит, пока письмо на другой конец света плывёт. Терпения ноль ебать у людей. Ставь задачу в очередь, через Celery там или что-то подобное. Пусть работает в фоне, а пользователю сразу ответ отдавай. Иначе — накрылся медным тазом твой юзабилити.

Вот и вся наука. Не так страшен чёрт, как его малюют. Главное — настройки не проёби и в очередь отправляй.