Электронная почта Django - PullRequest
12 голосов
/ 03 марта 2009

Я использую SMTP-сервер Gmail для отправки электронных писем от пользователей моего сайта.

Это настройки по умолчанию в моих settings.py

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'example@example.com'
EMAIL_HOST_PASSWORD = 'pwd'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

Если я хочу, чтобы пользователь отправил электронное письмо, я переопределяю эти настройки и отправляю электронное письмо, используя методы отправки электронной почты Django. Когда в системе возникает исключение, я получаю электронное письмо от example@example.com. Иногда я получаю письмо от какого-то зарегистрированного пользователя. Это также может означать, что когда пользователь получает электронное письмо, отправленное с моего веб-сайта, адрес отправителя отличается от фактического пользователя.

Что нужно сделать, чтобы избежать этой ситуации?

1 Ответ

23 голосов
/ 04 марта 2009

Django использует только settings.DEFAULT_FROM_EMAIL , когда любая из функций отправки почты передает None или пустую строку в качестве адреса отправителя . Это можно проверить в django/core/mail.py.

При наличии необработанного исключения Django вызывает функцию mail_admins() в django/core/mail.py, которая всегда использует settings.SERVER_EMAIL и only отправляется по адресам, указанным в settings .ADMINS . Это также можно проверить в django/core/mail.py.

Единственное другое место, куда сам Django отправляет электронные письма, - это если settings.SEND_BROKEN_LINK_EMAILS True, то CommonMiddleware отправит почту на все адреса, указанные в settings.MANAGERS и e-mail отправитель почты settings.SERVER_EMAIL .

Таким образом, единственный раз, когда обычный пользователь будет получать электронную почту с вашего сайта, это когда вы звоните send_mail(). Поэтому всегда передавайте реальный адрес в качестве аргумента from_mail, и вы не допустите, чтобы пользователи получали электронную почту из settings.SERVER_EMAIL или settings.DEFAULT_FROM_EMAIL .

Примечание: django-registration - это, по крайней мере, один пример подключаемого модуля Django, который будет отправлять почту из settings.DEFAULT_FROM_EMAIL , поэтому в таких случаях вам необходимо убедиться, что это правильный адрес электронной почты. например, support@yoursite.com или webmaster@yoursite.com.

...