Подтвердить что ты не робот

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, я все равно могу успешно отправить почту, что еще больше смущает меня.

4b9b3361

Ответ 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, передав необходимые аргументы

то есть.