В соответствии с документацией, если DEBUG
установлен в False
, и что-то предоставляется в настройке ADMINS
, Django будет отправляйте электронное письмо, когда код вызывает код состояния 500. У меня есть настройки электронной почты, заполненные должным образом (поскольку я могу использовать send_mail в порядке), но всякий раз, когда я намеренно выставляю ошибочный код, я получаю свой шаблон 500.html, но не отправляется сообщение об ошибке. Что может заставить Django не делать этого?
Django не отправляет электронные письма администраторам
Ответ 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
Эта проблема раздражала меня достаточно, чтобы мотивировать пост. Я привожу здесь шаги, которые я предпринял, чтобы решить эту проблему (коротко говоря):
- Не удалось настроить тестовую страницу (переименовывая test_template.html)
- Проверьте проверки электронной почты через представления для тестовой страницы в производственном процессе, используя send_mail ("Привет", "Привет, мир", "[email protected]", [("Имя", "[email protected]"),], fail_silently = False) где SERVER_EMAIL = '[email protected]' и ADMINS = [('Name', '[email protected]'),] в настройках Django. В моем случае я получил электронное письмо "Привет, мир", но не электронное письмо администратора Django (что было больно).
- Настройте простой пользовательский регистратор для отправки отчетов в файл на сервере:
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 из корневого каталога моего проекта. Это указывает на то, что регистратору не удалось достичь "уровня" ОШИБКИ.
- Понизьте пороговое значение для отчетов для настраиваемого регистратора с ОШИБКИ до ОТЛАДКИ. Теперь переход на тестовую страницу должен предоставить некоторые детали. Изучение этой детали показало, что в моем случае страница 500 по умолчанию была перенаправлена (непреднамеренно) в альтернативный файл шаблона с именем 500.html. Этот файл шаблона использовал переменную для кэширования, и поскольку шаблон не вызывался из представления, которое делало переменную доступной в контексте, вызов кэша не удался с отсутствующей ссылкой на ключ. Переименование 500.html решило мою проблему.