2009-09-12 22 views
55

Według documentation, jeśli DEBUG jest ustawiony na False i coś jest uruchomiona ADMINS Django wyśle ​​e-maila, gdy kod podnosi kod 500 stanu. Mam poprawnie skonfigurowane ustawienia wiadomości e-mail (ponieważ mogę używać send_mail dobrze), ale gdy celowo umieszczam błędny kod, otrzymuję szablon 500.html, ale nie wysyłam e-maila z błędem. Co może spowodować, że Django tego nie zrobi?Django nie wysyłanie e-maili do administratorów

Odpowiedz

14

Upewnij się, że twoje EMAIL_HOST i EMAIL_PORT są ustawione poprawnie w settings.py (te odnoszą się do twojego serwera SMTP). Może to zakładać, że masz serwer SMTP działający na localhost.

Aby to sprawdzić lokalnie uruchomić Pythona wbudowany serwer testowy SMTP:

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

następnie ustawić te wartości w settings.py

EMAIL_HOST='localhost' 
EMAIL_PORT=1025 

wyzwalającego 500 błędu, i powinieneś zobaczyć wiadomość e-mail pojawi się w oknie terminala smtpd Pythona.

+2

Widzę komunikat, ale jeśli ustawię go z powrotem na moje ustawienia e-mail, to nie działa –

+0

również dodał to, działa dobrze, ale wciąż nic się nie zmienia po przywróceniu normalnych ustawień – Harry

1

Spróbuj

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

Z [email protected] że rzeczywiście agent u.

+3

Jak już powiedziałem, już próbowałem to i działa dobrze. –

6

Mój dostawca usług hostingowych - Webfaction - zezwala tylko na wysyłanie wiadomości e-mail z adresu e-mail jawnie utworzonego w panelu administratora. Stworzenie jednego rozwiązało problem.

+1

Używam webfaction i wysyłam e-maile z googlemail, więc nie sądzę, że to był naprawdę problem. –

+0

Oznacza to, że wiadomości e-mail z błędami Django są wysyłane z wiadomości e-mail. –

+1

oczywiście pozwala na wysyłanie wiadomości e-mail, jeśli używasz serwera smtp google, ale jeśli używasz smtp.webfaction.com jako hosta, to nie pozwoli ci, chyba że e-mail istnieje. Nie zmieniłem niczego i naprawiłem to, więc jestem prawie pewien, że to było to. –

0

Choć prawdopodobnie nie jest idealny, znalazłem Gmaila jako hosta SMTP działa dobrze. Jest użyteczny przewodnik pod adresem nathanostgard.com.

Zapraszam do publikowania odpowiednich ustawień pliku settings.py (w tym EMAIL_ *, SERVER_EMAIL, ADMINS (po prostu wyślij swój prawdziwy adres e-mail), MENEDŻERÓW i DEBUGA), jeśli chcesz mieć dodatkowy zestaw oczu, by sprawdzić literówki!

2

Sprawdź, czy masz DEBUG = False

84

W moim przypadku przyczyną był brak SERVER_EMAIL ustawienia.

Ustawieniem domyślnym dla SERVER_EMAIL jest [email protected]. Jednak wiele serwerów poczty e-mail, w tym , nie akceptuje wiadomości e-mail od takich podejrzanych adresów. Po cichu upuszczają e-maile.

Zmiana adresu e-mail nadawcy na rozwiązała problem. W settings.py:

SERVER_EMAIL = '[email protected]' 
+2

Kolejna wskazówka, że ​​prawdopodobnie jest to problem, jeśli sprawdzisz swój dziennik i zobaczysz wpis zawierający "powiadomienie o niedostarczeniu nadawcy". – jathanism

1

Chociaż minęło już trochę czasu, oto moja odpowiedź, tak, że inni ludzie mogą korzystać w przyszłości.

W moim przypadku, co uniemożliwiało wysłanie wiadomości e-mail na listę ADMINS, po wystąpieniu błędu było ustawienie specyficzne dla aplikacji. Używałem django-tłok, który zapewnia ustawienia atrybutów PISTON_EMAIL_ERRORS i PISTON_DISPLAY_ERRORS. Ustawienie odpowiednich ustawień umożliwiło serwerowi aplikacji powiadomienie o mojej wiadomości e-mail za każdym razem, gdy nastąpi awaria tłoków.

30

Miałem taką samą sytuację. Stworzyłem nowy projekt i aplikację i działało, więc wiedziałem, że to mój kod. Śledziłem to do słownika LOGGING w pliku settings.py.Kilka tygodni temu wprowadziłem kilka zmian w logowaniu się do Sentry, ale z jakiegoś powodu błąd zaczął się dzisiaj. Zmieniłem z powrotem do oryginału i dostał pracę:

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, 
     }, 
    } 
} 

Potem zrobiłem kilka zmian powoli i dostał pracę z Sentry i wysyłając administratorów, jak również.

Ponadto konfiguracja LOGGING zostaje domyślnie połączona z DEFAULT_LOGGING, dlatego warto zapoznać się z the source code of django.utils.log.DEFAULT_LOGGING, aby dowiedzieć się, co jeszcze może mieć wpływ na daną sytuację.

+3

Pod Django 1.4 to naprawiło to za nas. – boatcoder

+0

Naprawiono to dla mnie (Django 1.7). Dzięki – Paco

+1

Dodanie ustawień rejestrowania zabiło moje e-maile administratora, które działały dobrze wcześniej z domyślnym rejestrowaniem. Przyjąłem 'disable_existing_loggers ': False' zachowałoby istniejące logowanie tak jak jest, ale tak się nie stało. To naprawiło to. – guidos

1

Jeśli z jakiegoś powodu ustawisz DEBUG_PROPAGATE_EXCEPTIONS na True (domyślnie jest to False), wiadomość e-mail do administratora nie będzie działać.

36

Inną możliwością wystąpienia błędu jest problem z ustawieniem ADMINS. Poniższe ustawienie spowoduje, że wysyłanie wiadomości do administratorów nie powiedzie się po cichu:

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

Co jest nie tak z tym? Dobrze ADMINS musi być krotką krotek, więc powyższe musi być sformatowany jako

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

Uwaga przecinek spływu. Bez niepomyślnego przecinka adres "do" w wiadomości e-mail zostanie nieprawidłowo sformatowany (a następnie prawdopodobnie odrzucony po cichu przez serwer SMTP).

+0

(Było to dzięki temu, że @cathal odpowiedział powyżej, uruchamiając lokalnie debugging serwera SMTP, który pozwolił mi zlokalizować to jako mój problem). – wxgeorge

2

Przepraszam, jeśli jest zbyt naiwny, ale w moim przypadku e-maile zostały wysłane, ale trafiły bezpośrednio do folderu SPAM. Przed wykonaniem bardziej skomplikowanych czynności sprawdź najpierw folder SPAM.

+0

Właściwie .. tak. Miałem błędy od robotów indeksujących próbujących utworzyć żądanie AJAX bez danych formularza. Przeceniłem inteligencję filtrów antyspamowych i skończyłem z całą wiadomością e-mail wysłaną przez Django przechwyconą przez filtr antyspamowy. –

0

Za to, co jest warte, miałem ten problem i żadna z tych sugestii nie zadziałała. Okazuje się, że mój problem polegał na tym, że SERVER_EMAIL został ustawiony na adres, którego nie rozpoznał serwer (Webfaction). Jeśli ta witryna była hostowana pod numerem na Webfaction (tak jak w przypadku moich innych witryn), nie stanowiłoby to problemu, ale ponieważ było to na innym serwerze, serwery Webfaction sprawdzały nie tylko uwierzytelnianie wysyłanego e-maila, ale także także wartość From:.

2

Inną rzeczą, warto zwrócić uwagę jest to, że ustawienia handler500 może ominąć mechanizm, który wysyła błędy na 500 jeśli odpowiedź z punktu widzenia nie ma kodu statusu 500. Jeśli masz handler500 zestaw, który następnie w zobacz odpowiedz na coś takiego.

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

W moim przypadku jest to include_html w mail_admins.

Po ustawieniu include_html na True serwer pocztowy odrzuca wiadomość e-mail, ponieważ sądzi, że moje wiadomości e-mail są spamem.

Wszystko działa dobrze, gdy ustawię include_html na False.

1

... a potem jest błąd facepalm, kiedy używałem to w celu zapobieżenia rozwoju e-maile z wyjściem, a następnie przypadkowo skopiować ustawienie do produkcji:

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

(oczywiście, że don nie widać ich drukowania na konsoli podczas korzystania z serwera wsgi). Usunięcie ustawienia z produkcji naprawiło to dla mnie.

0

I jeszcze inna sprawa, że ​​może się nie udać (ja po prostu dodać go do listy, dla tych osób, które kończą się tutaj mimo wszystkich wielkich odpowiedzi powyżej):

Nasza konfiguracja django używane SendGrid jak SMTP hosta i miał pojedynczy adres e-mail administratora zdefiniowany w ustawieniach django. To działało dobrze przez jakiś czas, ale w pewnym momencie wiadomości przestały przychodzić.

Okazuje się, że adres e-mail wylądował na liście "Wyrzucony" z nieznanego powodu, powodując, że wiadomości e-mail z tym adresem będą po cichu zrzucane na zawsze. Usunięcie adresu z tej listy i dodanie go do białej listy rozwiązało problem.

Powiązane problemy