Мои проекты

Отправляем письма через SMTP

Подключаем почтовый сервер, проверяем отправителя и проходим подтверждение адреса до конца.

Урок 6 / 22 · Commentail 1.3.2

Для гостевых комментариев нужны доставка почты и обработчик очереди. Начнём с SMTP — способа передать письмо вашему почтовому сервису. Если нужен HTTP API, используйте следующий урок вместо SMTP.

Получим параметры

В документации своего почтового сервиса найдите SMTP host, порт, логин и пароль приложения/SMTP. Пароль веб-входа в почту может не подходить. Разрешите адрес отправителя по правилам сервиса. Для доменной почты подтвердите домен и опубликуйте выданные DNS-записи. DNS редактируется там, где обслуживается зона домена, а не обязательно у регистратора.

DKIM позволяет проверить подпись, SPF — разрешённые источники отправки, DMARC — политику проверки домена. Копируйте значения из кабинета провайдера; универсальных записей здесь нет. При существующем SPF объединяйте разрешённые источники по инструкции провайдера, не создавайте вторую SPF-запись для того же имени. Не удаляйте MX действующей входящей почты ради отправки комментариев.

Настроим Django

Задайте окружение в терминале macOS/Linux; для PowerShell используйте форму $env:ИМЯ = 'значение' из урока 5:

sh
export EMAIL_HOST='YOUR_SMTP_HOST'
export EMAIL_HOST_USER='YOUR_SMTP_USERNAME'
export EMAIL_HOST_PASSWORD='YOUR_SMTP_PASSWORD'
export DEFAULT_FROM_EMAIL='Comments <comments@YOUR_VERIFIED_DOMAIN>'

В активном settings-файле замените прежний console/API backend:

python
import os

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = os.environ["EMAIL_HOST"]
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False
EMAIL_HOST_USER = os.environ["EMAIL_HOST_USER"]
EMAIL_HOST_PASSWORD = os.environ["EMAIL_HOST_PASSWORD"]
DEFAULT_FROM_EMAIL = os.environ["DEFAULT_FROM_EMAIL"]
EMAIL_TIMEOUT = 20

Это вариант STARTTLS на 587. Если провайдер требует 465, установите EMAIL_PORT = 465, EMAIL_USE_TLS = False, EMAIL_USE_SSL = True. Не включайте TLS и SSL одновременно. Не отключайте шифрование как средство борьбы с ошибкой пароля.

Перезапустите сайт и обработчик, выполните python manage.py check. Проверьте Send emails для нужного Site. Адрес сайта, порт и HTTPS-настройки должны давать корректные ссылки в письме.

Проверим весь путь

В приватном окне отправьте гостевой комментарий на адрес, который вы контролируете и который разрешён текущими ограничениями аккаунта провайдера. В Comments → Email delivery должна появиться очередь. Запустите:

sh
python manage.py process_commentail

Дождитесь письма, проверьте отправителя, домен ссылки и папку спама. Откройте ссылку и подтвердите действие кнопкой. Одобрите комментарий; следующим запуском обработчика доставьте ссылку редактирования. Отправьте прямой ответ другим автором, одобрите его и проверьте уведомление с отпиской.

Если статус sent, но письма нет, Django backend принял отправку: ищите событие у провайдера и ограничения получателя. Если письмо queued, проверьте расписание и базу обработчика. Если failed, исправьте причину и повторите разрешённую отправку через админку; старый срок ссылки не продлевается.

Подписка создаётся у новых отправок с почтой при включённой доставке, без отдельного checkbox. Уведомления приходят о прямых опубликованных ответах. Выключение Send emails отменяет очередь; последующее включение не возвращает отменённые задания.

Другие уроки по этой задаче

Документация по теме

Была ли статья полезна?

Комментарии 0

Имя: до 40 символов.

После отправки мы пришлём письмо со ссылкой для подтверждения email.

Не более 5000 символов.

Опубликованных комментариев пока нет.