2009-09-12 7 views
55

Selon le documentation, si DEBUG est réglé sur False et quelque chose est fourni sous le paramètre ADMINS, Django envoie un e-mail chaque fois que le code soulève un code 500 d'état. J'ai les paramètres d'email remplis correctement (car je peux bien utiliser send_mail) mais chaque fois que je mets intentionnellement du code erroné, j'obtiens mon template 500.html mais aucune erreur d'email n'est envoyée. Qu'est-ce qui pourrait faire que Django ne fasse pas ça?Django ne pas envoyer des e-mails aux administrateurs

Répondre

14

Assurez-vous que vos EMAIL_HOST et EMAIL_PORT sont configurés directement dans settings.py (ils se réfèrent à votre serveur SMTP). Cela peut supposer que vous avez un serveur SMTP s'exécutant sur localhost.

Pour tester ce local, exécutez le serveur SMTP de test de Python intégré:

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

Réglez ensuite ces valeurs dans votre settings.py

EMAIL_HOST='localhost' 
EMAIL_PORT=1025 

déclenchement d'une erreur 500, et vous devriez voir l'e-mail apparaît dans la fenêtre du terminal python smtpd.

+2

Je vois le message, mais si je le remets à mes paramètres d'email cela ne fonctionne pas –

+0

a également ajouté cela, fonctionne bien, mais toujours rien ne change lorsque les paramètres normaux – Harry

1

Essayez cette

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

Avec un [email protected] que vous obtenez effectivement courriel.

+3

Comme je l'ai dit, j'ai déjà essayé et ça marche bien. –

6

Mon fournisseur d'hébergement Web - Webfaction - permet uniquement l'envoi de courriels à partir d'un courriel explicitement créé dans le panneau de l'administrateur. Créer un a résolu le problème.

+1

J'utilise la webfaction et j'envoie des e-mails de googlemail, donc je ne pense pas que c'était vraiment le problème. –

+0

En d'autres termes, les e-mails d'erreur Django sont envoyés par googlemail. –

+1

cela vous permet évidemment d'envoyer des emails si vous utilisez le serveur smtp de google, mais si vous utilisez smtp.webfaction.com en tant qu'hôte, il ne vous laissera pas à moins que l'email n'existe. Je n'ai rien changé d'autre et ça l'a arrangé, donc je suis à peu près sûr que c'était ça. –

0

Bien que probablement pas idéal, j'ai trouvé l'utilisation de Gmail comme l'hôte SMTP fonctionne très bien. Il y a un guide utile au nathanostgard.com. N'hésitez pas à poster vos sections settings.py pertinentes (y compris EMAIL_ *, SERVER_EMAIL, ADMINS (sortez votre vrai email), MANAGERS, et DEBUG) si vous voulez un œil supplémentaire pour vérifier les fautes de frappe!

2

Assurez-vous que vous avez DEBUG = False

84

Dans mon cas, la mise en cause de SERVER_EMAIL était manquante. La valeur par défaut pour SERVER_EMAIL est [email protected]. Mais de nombreux serveurs de messagerie, y compris mon fournisseur de messagerie n'acceptent pas les e-mails provenant de ces adresses suspectes. Ils abandonnent silencieusement les emails.

La modification de l'adresse e-mail de l'expéditeur à [email protected] a résolu le problème. En settings.py:

SERVER_EMAIL = '[email protected]' 
+2

Une autre indication que c'est probablement le problème est si vous vérifiez votre journal de courrier et voyez une entrée contenant 'la notification de non-remise d'expéditeur'. – jathanism

1

Bien qu'il a été un certain temps, voici ma réponse, de sorte que d'autres puissent bénéficier à l'avenir. Dans mon cas, ce qui empêchait l'envoi de courriels à la liste ADMINS, lorsqu'une erreur se produisait, était un paramètre spécifique à l'application. J'utilisais django-piston, qui fournit les attributs de configuration PISTON_EMAIL_ERRORS et PISTON_DISPLAY_ERRORS. En les réglant en conséquence, le serveur d'application a pu m'en informer par courrier, à chaque fois que le piston se bloquait.

30

J'avais la même situation. J'ai créé un nouveau projet et une application et cela a fonctionné, donc je savais que c'était mon code. Je l'ai retrouvé jusqu'au dictionnaire LOGGING dans settings.py.J'avais fait quelques changements il y a quelques semaines pour se connecter avec Sentry, mais pour une raison quelconque, l'erreur vient de commencer aujourd'hui. J'ai changé à l'original et obtenu ce travail:

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

Ensuite, je fait quelques changements lentement et ai eu à travailler avec Sentry et emailing admins ainsi.

En outre, la configuration LOGGING est fusionnée avec DEFAULT_LOGGING par défaut, il est donc utile de jeter un coup d'œil à the source code of django.utils.log.DEFAULT_LOGGING pour comprendre ce qui peut avoir un effet sur votre situation particulière.

+3

Sous Django 1.4 cela nous l'a fixé. – boatcoder

+0

Cela l'a corrigé pour moi (Django 1.7). Merci – Paco

+1

Ajout de paramètres de journalisation a tué mes e-mails d'administration, qui a bien fonctionné avant la journalisation par défaut. J'ai supposé que 'disable_existing_loggers ': False' garderait la notation existante telle quelle, mais ce n'est pas le cas. Cela l'a réparé. – guidos

1

Si, pour une raison quelconque, vous définissez DEBUG_PROPAGATE_EXCEPTIONS sur True (c'est faux par défaut), le courrier électronique envoyé à l'administrateur ne fonctionnera pas.

36

Une autre possibilité d'erreur est un problème avec votre réglage ADMINS. Le paramètre suivant entraînera l'échec de l'envoi du courrier aux administrateurs:

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

Qu'est-ce qui ne va pas? Eh bien ADMINS doit être un tuple de tuples, de sorte que les besoins ci-dessus pour être formaté comme

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

Notez la virgule finale. Sans la virgule défaillante, l'adresse «à» de l'e-mail sera mal formatée (et probablement rejetée silencieusement par votre serveur SMTP).

+0

(C'était grâce à la réponse de @cathal ci-dessus en cours d'exécution d'un serveur SMTP de débogage qui m'a permis de localiser cela comme mon problème). – wxgeorge

2

Désolé si c'est trop naïf, mais dans mon cas les emails ont été envoyés mais allaient directement dans le dossier SPAM. Avant d'essayer des choses plus compliquées, vérifiez d'abord votre dossier SPAM.

+0

En fait .. oui. J'ai eu des erreurs de robots essayant de faire une requête AJAX sans données de formulaire. J'ai surestimé l'intelligence des filtres anti-spam et je me suis retrouvée avec tous les emails envoyés par Django en train d'être interceptés par le filtre anti-spam. –

0

Pour ce que ça vaut, j'ai eu ce problème et aucune de ces suggestions n'a fonctionné pour moi. Il s'est avéré que mon problème était que SERVER_EMAIL a été défini à une adresse que le serveur (Webfaction) n'a pas reconnu. Si ce site était hébergé sur Webfaction (comme mes autres sites), ce ne serait pas un problème, mais comme c'était sur un serveur différent, les serveurs de Webfaction vérifient non seulement l'authentification de l'email envoyé, mais aussi la valeur From: également.

2

Une autre chose à noter ici est que les paramètres handler500 pourraient contourner le mécanisme qui envoie des erreurs sur 500 si la réponse de la vue ne dispose pas d'un code d'état de 500. Si vous avez un ensemble handler500, alors dans ce voir répondre avec quelque chose comme ça.

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

Dans mon cas, il est le include_html dans mail_admins.

Lorsque je mets include_html à True, le serveur de courrier électronique refuse d'envoyer mon email car il pense que mes emails sont des spams. Tout fonctionne très bien quand j'ai réglé include_html à False.

1

... et puis il y a l'erreur de facepalm, lorsque vous avez utilisé ce dans le développement des e-mails pour éviter de sortir, puis copiez accidentellement la mise en production:

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

(vous don cours ne les voyez pas être imprimé à la console en utilisant un serveur wsgi). Retrait du réglage de la production fixé pour moi.

0

Et encore une autre chose qui peut aller mal (je vais l'ajouter à la liste, pour les personnes qui se retrouvent ici en dépit de toutes les grandes réponses ci-dessus):

Notre configuration de django utilisé SendGrid comme smtp hôte et avait une seule adresse e-mail administrateur définie dans les paramètres django. Cela a bien fonctionné pendant un certain temps, mais à un moment donné, les mails ont cessé d'arriver. Il s'avère que l'adresse de courrier électronique s'est retrouvée dans la liste SendGrid 'Bounce' pour une raison inconnue, ce qui a entraîné la suppression silencieuse des courriels de cette adresse pour toujours. Supprimer l'adresse de cette liste et la mettre en liste blanche a permis de résoudre le problème.

Questions connexes