Selon la documentation , si DEBUG
est défini sur False
et que quelque chose est fourni sous le paramètre ADMINS
, Django envoie un courrier électronique chaque fois que le code déclenche un code de statut 500. J’ai les parameters de courrier électronique remplis correctement (car je peux utiliser send_mail bien) mais chaque fois que je mets intentionnellement un code erroné, je reçois mon modèle 500.html mais aucun message d’erreur n’est envoyé. Qu’est-ce qui pourrait empêcher Django de le faire?
Dans mon cas, la cause était l’absence du paramètre SERVER_EMAIL .
La valeur par défaut pour SERVER_EMAIL
est root@localhost
. Mais de nombreux serveurs de messagerie, y compris mon fournisseur de messagerie, n’acceptent pas les courriers électroniques provenant de telles adresses suspectes. Ils déposent silencieusement les emails.
Changer l’adresse e-mail de l’expéditeur à [email protected]
résolu le problème. Dans settings.py
:
SERVER_EMAIL = '[email protected]'
Une autre possibilité d’erreur est le problème avec votre paramètre ADMINS. Le paramètre suivant provoquera l’échec silencieux de l’envoi de courrier aux administrateurs:
ADMINS = ( ('your name', '[email protected]') )
Qu’est-ce qui ne va pas avec ça? Eh bien, ADMINS doit être un tuple de tuples, donc ce qui précède doit être formaté comme suit:
ADMINS = ( ('your name', '[email protected]'), )
Notez la virgule finale. Sans la virgule défaillante, l’adresse de l’expéditeur sera incorrectement formatée (puis probablement supprimée silencieusement par votre serveur SMTP).
J’ai eu la même situation. J’ai créé un nouveau projet et une nouvelle application et cela a fonctionné, alors je savais que c’était mon code. Je l’ai suivi dans le dictionnaire de journalisation dans settings.py. J’avais fait quelques changements il y a quelques semaines pour me connecter à Sentry, mais pour une raison quelconque, l’erreur venait juste de commencer aujourd’hui. Je suis revenu à l’original et je l’ai fait fonctionner:
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, j’ai apporté quelques modifications lentement et je l’ai fait fonctionner avec Sentry et j’ai également envoyé des courriels aux ADMINS.
De plus, la configuration de LOGGING
est fusionnée avec DEFAULT_LOGGING
par défaut, il est donc utile de regarder le code source de django.utils.log.DEFAULT_LOGGING
pour comprendre ce qui pourrait avoir un effet sur votre situation particulière.
Assurez-vous que vos EMAIL_HOST et EMAIL_PORT sont bien configurés dans settings.py (ceux-ci font référence à votre serveur SMTP). Il est possible que vous ayez un serveur SMTP exécuté sur localhost.
Pour le tester localement, exécutez le serveur SMTP de test intégré de Python:
python -m smtpd -n -c DebuggingServer localhost:1025
Ensuite, définissez ces valeurs dans vos parameters.py
EMAIL_HOST='localhost' EMAIL_PORT=1025
Déclenchez une erreur 500 et vous devriez voir le message électronique apparaître dans la fenêtre de terminal python smtpd.
Mon fournisseur d’hébergement Web – Webfaction – autorise uniquement l’envoi de courriers électroniques à partir d’un courrier électronique créé explicitement dans le panneau de l’administrateur. La création d’un a résolu le problème.
Essaye ça
# ./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] auquel vous avez réellement access par courrier électronique.
Assurez-vous d’avoir DEBUG = Faux
Désolé si c’est trop naïf, mais dans mon cas, les e-mails 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.
Une autre chose à noter ici est que les parameters handler500
peuvent contourner le mécanisme qui envoie des erreurs sur un 500 si la réponse de la vue n’a pas un code d’état de 500. Si vous avez un handler500
, alors répondez avec quelque chose comme: ce.
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
Bien que cela fasse un moment, voici ma réponse, afin que d’autres personnes puissent en bénéficier à l’avenir.
Dans mon cas, ce qui empêchait l’envoi d’e-mails à la liste ADMINS, en cas d’erreur, était un paramètre spécifique à l’application. J’utilisais django-piston, qui fournit les atsortingbuts de configuration PISTON_EMAIL_ERRORS et PISTON_DISPLAY_ERRORS. La définition de ces parameters a permis au serveur d’application d’informer mon courrier par courrier électronique, à chaque fois que le piston se bloquait.
Si, pour une raison quelconque, vous définissez DEBUG_PROPAGATE_EXCEPTIONS sur True (c’est faux par défaut), le courrier électronique à admin ne fonctionnera pas.
… et puis il y a l’erreur facepalm, lorsque vous l’avez utilisée en développement pour empêcher la sortie des e-mails, puis copier accidentellement le paramètre en production:
# Print emails to console EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
(bien sûr, vous ne les voyez pas en cours d’impression sur une console lors de l’utilisation d’un serveur wsgi). La suppression du paramètre de production a corrigé cela pour moi.
Bien que ce ne soit probablement pas idéal, j’ai trouvé que l’utilisation de Gmail comme hôte SMTP fonctionnait très bien. Il existe un guide utile sur nathanostgard.com .
N’hésitez pas à poster vos sections settings.py pertinentes (y compris EMAIL_ *, SERVER_EMAIL, ADMINS (sortez simplement votre vrai email), MANAGERS et DEBUG) si vous souhaitez avoir un œil supplémentaire pour vérifier les fautes de frappe!
Pour ce que cela vaut, j’ai eu ce problème et aucune de ces suggestions n’a fonctionné pour moi. Il se trouve que mon problème était que SERVER_EMAIL
était défini sur une adresse que le serveur (Webfaction) ne reconnaissait pas. Si ce site était hébergé sur Webfaction (comme le sont mes autres sites), cela ne poserait pas de problème, mais comme il s’agissait d’un serveur différent, les serveurs Webfaction ne vérifient pas seulement l’authentification du courrier électronique envoyé, From:
valeur aussi.
Dans mon cas, c’est le include_html
dans mail_admins
.
Lorsque je mets include_html
à True
, le serveur de messagerie refuse d’envoyer mon courrier électronique car il pense que mes courriers électroniques sont des spams.
Tout fonctionne très bien lorsque je mets include_html
à False
.
Et encore une autre chose qui peut mal tourner (je vais simplement l’append à la liste, pour les personnes qui se retrouvent ici malgré toutes les bonnes réponses ci-dessus):
Notre configuration django utilisait SendGrid comme hôte smtp et avait une adresse e-mail admin unique définie dans les parameters django. Cela a fonctionné pendant un certain temps, mais à un moment donné, les mails ont cessé d’arriver.
En fin de compte, l’adresse de messagerie s’est retrouvée dans la liste SendGrid ‘Bounce’ pour une raison inconnue, entraînant la suppression silencieuse des e-mails à cette adresse. La suppression de l’adresse de cette liste et sa mise en liste blanche ont corrigé le problème.
Si vous utilisez ou souhaitez utiliser SendGrid, utilisez les parameters ci-dessous en production.
Installez le paquet
pip install sendgrid-django
Ajoutez ces parameters dans settings.py (production)
DEBUG = False EMAIL_BACKEND = "sendgrid_backend.SendgridBackend" SENDGRID_API_KEY = "That you generate in sendgrid account" ADMINS = ( ("Your Name", "[email protected]") )
Les informations ci-dessous sont données dans 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]") )
Pour envoyer des emails, Django nécessite quelques parameters lui indiquant comment se connecter à votre serveur de messagerie. Au minimum, vous devrez spécifier EMAIL_HOST et éventuellement EMAIL_HOST_USER et EMAIL_HOST_PASSWORD, bien que d’autres parameters puissent également être requirejs en fonction de la configuration de votre serveur de messagerie. Consultez la documentation sur les parameters de Django pour obtenir une liste complète des parameters liés au courrier électronique.