Django send_mail() работает от оболочки, но не в производстве nginx
Я хотел бы отправить электронное письмо из представления django. Я получил его для работы на моей локальной машине с сервером разработки django со следующими настройками:
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
У моего представления есть
from django.core.mail import send_mail
def my_view(request):
send_mail('subject','body','[email protected]',['[email protected]'],fail_silently=False)
return render(request, 'index.html')
Когда я запускаю send_mail() из оболочки manage.py на моем рабочем сервере, письмо успешно отправляется. Однако, когда представление вызывается в процессе производства (nginx + uwsgi + django), отправление электронной почты не отправляется, хотя представление работает без ошибок и возвращает ожидаемый ответ. Я не вижу ошибки в error.log.
Пожалуйста, помогите мне установить правильные разрешения и конфигурации для nginx, чтобы это сработало.
ПРИМЕЧАНИЕ. Этот вопрос похож на Send_mail в Django, работает в оболочке, работает локально, а не на вид, который не был разрешен.
EDIT: Когда я делаю
sudo -u www-data python manage.py shell
для запуска в качестве пользователя nginx, я все равно могу успешно отправить почту, что еще больше смущает меня.
Ответы
Ответ 1
Если электронное письмо напечатано в консоли, вы, вероятно, установили
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
который печатает письмо вместо его отправки.
Если эта строка включена в альтернативный файл настроек (по умолчанию), ее можно каким-то образом использовать в настройках развертывания, тогда как оболочка продолжает использовать файл настроек по умолчанию, в котором для бэкэнд либо установлено:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
или вообще не установлен, и в этом случае значение по умолчанию равно smtp
, а
Ответ 2
Попробуйте следующее:
from django.core.mail import EmailMessage
def sendMail(subject, body, from, to):
# if "to" is not a list of e-mails but a string
# it will be converted to a single item list
if not isinstance(to, list):
to = to.strip().split()
email = EmailMessage(subject, body, from, to)
email.content_subtype = "html"
email.send()
Поэтому вам просто нужно вызвать функцию sendMail
, передав необходимые аргументы
то есть.