Django не отправляет электронные письма администраторам - PullRequest
61 голосов
/ 12 сентября 2009

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

Ответы [ 19 ]

93 голосов
/ 01 июля 2011

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

Значение по умолчанию для SERVER_EMAIL равно root@localhost. Но многие почтовые серверы, включая мой провайдер электронной почты не принимает письма с таких подозрительных адресов. Они молча сбрасывают электронные письма.

Изменение адреса электронной почты отправителя на django@my-domain.com решило проблему. В settings.py:

SERVER_EMAIL = 'django@my-domain.com'
37 голосов
/ 09 августа 2013

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

ADMINS = (
  ('your name', 'me@mydomain.com')
)

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

ADMINS = (
  ('your name', 'me@mydomain.com'),
)

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

34 голосов
/ 03 марта 2012

У меня была такая же ситуация. Я создал новый проект и приложение, и оно работало, поэтому я знал, что это был мой код. Я отследил его до словаря 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, чтобы понять, что еще может повлиять на ваш особая ситуация.

16 голосов
/ 12 сентября 2009

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

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

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

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

EMAIL_HOST='localhost'
EMAIL_PORT=1025

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

6 голосов
/ 12 сентября 2009

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

3 голосов
/ 23 января 2015

Еще одна вещь, на которую стоит обратить внимание, это то, что настройки 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
2 голосов
/ 02 декабря 2013

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

2 голосов
/ 12 сентября 2009

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

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

С to@example.com, на который вы действительно получаете письмо.

2 голосов
/ 25 ноября 2009

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

1 голос
/ 21 ноября 2018

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

##### old #####
ADMINS = (
    ("Your Name", "your_email@company.com")
)

##### new #####
ADMINS = [
    ("Your Name", "your_email@company.com")
]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...