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

Django не отправляет электронные письма администраторам

В соответствии с документацией, если DEBUG установлен в False, и что-то предоставляется в настройке ADMINS, Django будет отправляйте электронное письмо, когда код вызывает код состояния 500. У меня есть настройки электронной почты, заполненные должным образом (поскольку я могу использовать send_mail в порядке), но всякий раз, когда я намеренно выставляю ошибочный код, я получаю свой шаблон 500.html, но не отправляется сообщение об ошибке. Что может заставить Django не делать этого?

4b9b3361

Ответ 1

В моем случае причина отсутствовала SERVER_EMAIL.

По умолчанию для SERVER_EMAIL указано [email protected]. Но многие почтовые серверы, включая мой почтовый провайдер не принимает электронные письма с таких подозрительных адресов. Они молча отбрасывают письма.

Изменение адреса электронной почты отправителя на [email protected] решило проблему. В settings.py:

SERVER_EMAIL = '[email protected]'

Ответ 2

Еще одна возможность для ошибки - проблема с настройкой ADMINS. Следующая настройка приведет к тому, что отправка администратору почты будет отключена тихо:

ADMINS = (
  ('your name', '[email protected]')
)

Что не так с этим? Ну, ADMINS должен быть кортежем кортежей, поэтому выше нужно отформатировать как

ADMINS = (
  ('your name', '[email protected]'),
)

Обратите внимание на конечную запятую. Без пропущенной запятой адрес "на" по электронной почте будет некорректно отформатирован (а затем, вероятно, будет отключен вашим SMTP-сервером).

Ответ 3

У меня была такая же ситуация. Я создал новый проект и приложение, и это сработало, поэтому я знал, что это мой код. Я отследил его до словаря LOGGING в settings.py. Несколько недель назад я сделал несколько изменений для регистрации с Sentry, но по какой-то причине ошибка началась только сегодня. Я вернулся к оригиналу и получил его работу:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

Затем я сделал некоторые изменения медленно и заставил его работать с Sentry и отправлять электронную почту ADMINS.

Кроме того, конфигурация LOGGING по умолчанию объединяется с DEFAULT_LOGGING, поэтому полезно посмотреть исходный код django.utils.log.DEFAULT_LOGGING, чтобы понять, что еще может повлиять на вашу конкретную ситуацию.

Ответ 4

Убедитесь, что EMAIL_HOST и EMAIL_PORT настроены прямо в settings.py(они относятся к вашему SMTP-серверу). Возможно, предполагается, что у вас есть SMTP-сервер, работающий на localhost.

Чтобы протестировать это локально, запустите встроенный тестовый SMTP-сервер Python:

python -m smtpd -n -c DebuggingServer localhost:1025

Затем установите эти значения в settings.py

EMAIL_HOST='localhost'
EMAIL_PORT=1025

Запустите ошибку 500, и вы увидите, что сообщение электронной почты появляется в окне терминала python smtpd.

Ответ 5

Мой веб-хостинг-провайдер - Webfaction - позволяет отправлять сообщения электронной почты. Из письма, которое было явно создано на панели администратора. Создание исправлено.

Ответ 6

Еще одна особенность, которую стоит отметить, заключается в том, что настройки handler500 могут обойти механизм, который отправляет ошибки на 500, если ответ от представления не имеет кода состояния 500. Если у вас есть набор handler500, тогда в этом представлении ответьте что-то вроде этого.

t = loader.get_template('500.html')
response = HttpResponseServerError(
    t.render(RequestContext(request, {'custom_context_var': 
        'IT BROKE OMG FIRE EVERYONE'})))
response.status_code = 500
return response

Ответ 7

Попробуйте это

# ./manage shell
>>> from django.core.mail import send_mail
>>> send_mail('Subject here', 'Here is the message.', '[email protected]',['[email protected]'], fail_silently=False)

С адресом [email protected], на который вы действительно получаете электронную почту.

Ответ 8

Убедитесь, что у вас DEBUG = False

Ответ 9

Извините, если это слишком наивно, но в моем случае электронные письма были отправлены, но поступали непосредственно в папку SPAM. Прежде чем пытаться более сложные вещи, сначала проверьте папку SPAM.

Ответ 10

Хотя это было какое-то время, вот мой ответ, чтобы другие люди могли извлечь выгоду в будущем.

В моем случае, что предотвращало отправку сообщений электронной почты в список ADMINS, когда произошла ошибка, была настройка конкретного приложения. Я использовал django-piston, который предоставляет атрибуты настройки PISTON_EMAIL_ERRORS и PISTON_DISPLAY_ERRORS. Таким образом, установив их, сервер приложений мог уведомлять меня по почте, когда поршень сработает.

Ответ 11

Если по какой-то причине вы установите для DEBUG_PROPAGATE_EXCEPTIONS значение True (по умолчанию оно ложно), электронная почта для администратора не будет работать.

Ответ 12

... и затем появляется ошибка facepalm, когда вы использовали это в разработке для предотвращения выхода электронной почты, а затем случайно скопировали настройку в файл:

# Print emails to console
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

(конечно, вы не видите, что их печатают на консоль при использовании сервера wsgi). Удаление установки из производства исправило это для меня.

Ответ 13

И еще одна вещь, которая может пойти не так (я просто добавлю ее в список, для тех людей, которые оказались здесь, несмотря на все замечательные ответы выше):

Наша настройка django использовала SendGrid в качестве хоста smtp и имела один адрес электронной почты администратора, определенный в настройках django. Это работало нормально в течение некоторого времени, но в какой-то момент почта перестала прибывать.

Как выясняется, почтовый адрес оказался в списке "Отказано" от SendGrid по какой-то неизвестной причине, в результате чего электронные письма на этот адрес будут тихо опущены навсегда. Удаление адреса из этого списка и его белый список устранены.

Ответ 14

Если вы используете или хотите использовать SendGrid, используйте настройки ниже в рабочей среде.

Установить пакет

pip install sendgrid-django

Добавьте эти настройки в settings.py (производство)

DEBUG = False

EMAIL_BACKEND = "sendgrid_backend.SendgridBackend"

SENDGRID_API_KEY = "That you generate in sendgrid account"

ADMINS = (
    ("Your Name", "[email protected]")
)

Ответ 15

Просто была та же проблема после обновления до Django 2.1 с Django 1.11. Видимо разделы ADMINS в settings.py изменились. Теперь требуется список кортежей, а не старый кортеж кортежей. Это исправлено для меня.

##### old #####
ADMINS = (
    ("Your Name", "[email protected]")
)

##### new #####
ADMINS = [
    ("Your Name", "[email protected]")
]

Re: https://docs.djangoproject.com/en/2.1/ref/settings/#admins

Ответ 16

Хотя, вероятно, не идеальный, я нашел использование Gmail, поскольку хост SMTP работает отлично. Существует полезный справочник по nathanostgard.com.

Не стесняйтесь публиковать соответствующие разделы settings.py(включая EMAIL_ *, SERVER_EMAIL, ADMINS (просто вытащите свой реальный адрес электронной почты), MANAGERS и DEBUG), если вы хотите, чтобы дополнительный набор глаз проверялся на опечатки!

Ответ 17

Для чего это стоило, у меня была эта проблема, и ни одно из этих предложений не работало для меня. Оказывается, моя проблема заключалась в том, что SERVER_EMAIL был установлен на адрес, который сервер (Webfaction) не распознал. Если этот сайт размещен на Webfaction (как и на моих других сайтах), это не будет проблемой, но поскольку это было на другом сервере, серверы Webfaction не только проверяют подлинность отправляемого сообщения электронной почты, но также и From:.

Ответ 18

В моем случае это include_html в mail_admins.

Когда я устанавливаю include_html в True, сервер электронной почты отклоняет отправку моего сообщения, потому что он считает, что мои письма являются спамом.

Все работает отлично, когда я устанавливаю include_html в False.

Ответ 19

Информация ниже представлена в https://docs.djangoproject.com/en/2.1/howto/error-reporting/#email-reports.

EMAIL_HOST = "email host"

EMAIL_HOST_USER = "Email username"

EMAIL_HOST_PASSWORD = "Email Password"

DEBUG = False

ADMINS = (
    ("Your Name", "[email protected]")
)

Для отправки электронной почты Django требуется несколько настроек, сообщающих ему, как подключиться к вашему почтовому серверу. По крайней мере, вам нужно указать EMAIL_HOST и, возможно, EMAIL_HOST_USER и EMAIL_HOST_PASSWORD, хотя в зависимости от конфигурации ваших почтовых серверов могут потребоваться и другие настройки. Обратитесь к документации по настройкам Django для получения полного списка настроек, связанных с электронной почтой.

Ответ 20

Эта проблема раздражала меня достаточно, чтобы мотивировать пост. Я привожу здесь шаги, которые я предпринял, чтобы решить эту проблему (коротко говоря):

  1. Не удалось настроить тестовую страницу (переименовывая test_template.html)
  2. Проверьте проверки электронной почты через представления для тестовой страницы в производственном процессе, используя send_mail ("Привет", "Привет, мир", "[email protected]", [("Имя", "[email protected]"),], fail_silently = False) где SERVER_EMAIL = '[email protected]' и ADMINS = [('Name', '[email protected]'),] в настройках Django. В моем случае я получил электронное письмо "Привет, мир", но не электронное письмо администратора Django (что было больно).
  3. Настройте простой пользовательский регистратор для отправки отчетов в файл на сервере:
LOGGING = {
  'version': 1,
  'disable_existing_loggers': False,
  'handlers': {
    'errors_file': {
      'level': 'ERROR',
      'class': 'logging.FileHandler',
      'filename': 'logs/debug.log',
    },
  },
  'loggers': {
    'django': {
      'handlers': ['errors_file'],
      'level': 'ERROR',
      'propagate': True,
    },
  },
}

В моем случае переход на тестовую страницу не привел к выводу в файле debug.log в каталоге logs из корневого каталога моего проекта. Это указывает на то, что регистратору не удалось достичь "уровня" ОШИБКИ.

  1. Понизьте пороговое значение для отчетов для настраиваемого регистратора с ОШИБКИ до ОТЛАДКИ. Теперь переход на тестовую страницу должен предоставить некоторые детали. Изучение этой детали показало, что в моем случае страница 500 по умолчанию была перенаправлена (непреднамеренно) в альтернативный файл шаблона с именем 500.html. Этот файл шаблона использовал переменную для кэширования, и поскольку шаблон не вызывался из представления, которое делало переменную доступной в контексте, вызов кэша не удался с отсутствующей ссылкой на ключ. Переименование 500.html решило мою проблему.