2009-09-12 7 views
55

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

ответ

14

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

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

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

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

EMAIL_HOST='localhost' 
EMAIL_PORT=1025 

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

+2

Я вижу сообщение, но если я верну его обратно к своим настройкам электронной почты, он не работает. – 2009-09-12 05:43:59

+0

также добавил это, хорошо работает, но все же ничего не меняется, когда возвращается к нормальным настройкам. – Harry

1

Попробуйте

# ./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], что вы на самом деле получить электронную почту в.

+3

Как я уже сказал, я уже пробовал это и он отлично работает. – 2009-09-12 05:41:25

6

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

+1

Я использую webfaction и отправляю электронные письма из googlemail, поэтому я не думаю, что это действительно проблема. –

+0

То есть Django отправляет сообщения электронной почты из googlemail. –

+1

, очевидно, позволяет отправлять сообщения электронной почты, если вы используете smtp-сервер google, но если вы используете smtp.webfaction.com в качестве хоста, он не позволит вам, если письмо не существует. Я ничего не изменил, и он исправил это, поэтому я уверен, что это так. – 2009-09-12 07:49:32

0

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

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

2

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

84

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

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

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

SERVER_EMAIL = '[email protected]' 
+2

Еще одна подсказка, что, скорее всего, проблема заключается в том, что вы проверяете свой почтовый журнал и видите запись, содержащую уведомление о недоставке отправителя. – jathanism

1

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

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

30

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

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

+3

Под Django 1.4 это исправлено для нас. – boatcoder

+0

Это исправлено для меня (Django 1.7). Спасибо – Paco

+1

Добавление параметров ведения журнала убило мои электронные письма администратора, которые работали отлично до того, как выполнили регистрацию по умолчанию. Я предположил 'disable_existing_loggers ': False' сохранил бы существующую регистрацию как есть, но это не так. Это фиксировало это. – guidos

1

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

36

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

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

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

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

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

+0

(Это было связано с ответом @cathal над запуском отладочного SMTP-сервера локально, что позволило мне найти это как мою проблему). – wxgeorge

2

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

+0

Фактически .. да. У меня были ошибки от искателей, пытающихся сделать запрос AJAX без данных формы. Я переоценил интеллект спам-фильтров и в итоге получил все электронные письма, отправленные Django, попавшими в фильтр спама. –

0

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

2

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

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 
0

В моем случае, это в mail_adminsinclude_html.

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

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

1

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

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

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

0

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

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

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

Смежные вопросы