2009-09-12 21 views
55

De acuerdo con la documentation, si DEBUG se establece en False y algo que se proporciona con la configuración de ADMINS, Django enviará un correo electrónico cada vez que el código plantea un código de estado 500. Tengo la configuración de correo electrónico completada correctamente (ya que puedo usar send_mail bien) pero siempre que intencionalmente coloco un código erróneo recibo mi plantilla 500.html pero no se envía ningún correo electrónico de error. ¿Qué podría hacer que Django no hiciera esto?Django no enviar mensajes de correo electrónico a los administradores

Respuesta

14

Asegúrese de que su EMAIL_HOST y EMAIL_PORT se establecen justo en settings.py (estos se refieren a su servidor SMTP). Puede suponer que tiene un servidor SMTP ejecutándose en el host local.

Para probar este local, ejecute de Python incorporada en el servidor SMTP de prueba:

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

Luego establecer estos valores en su settings.py

EMAIL_HOST='localhost' 
EMAIL_PORT=1025 

Gatillo un error 500, y debería ver el correo electrónico aparece en la ventana de la terminal python smtpd.

+2

Veo el mensaje, pero si lo configuro de nuevo en mi configuración de correo electrónico no funciona –

+0

también lo agregué, funciona bien, pero aún nada cambia cuando lo restablece a la configuración normal – Harry

1

probar este

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

Con un [email protected] que en realidad se obtiene de correo electrónico a.

+3

Como dije, ya lo intenté y funciona bien –

6

Mi proveedor de alojamiento web - Webfaction - sólo permite mensajes de correo electrónico que se enviará un correo electrónico Desde que se ha creado de forma explícita en el panel de administrador. Crear uno solucionó el problema.

+1

Utilizo webfaction y envío correos electrónicos desde googlemail, así que no creo que ese haya sido realmente el problema. –

+0

Es decir, los correos electrónicos de error de Django se envían desde googlemail. –

+1

obviamente le permite enviar correos electrónicos si está utilizando el servidor smtp de google, pero si usa smtp.webfaction.com como anfitrión, no le permitirá a menos que exista el correo electrónico. No cambié nada más y lo arreglé, así que estoy bastante seguro de que fue eso. –

0

Aunque probablemente no es ideal, he encontrado que el uso de Gmail como el host SMTP funciona bien. Hay una guía útil en nathanostgard.com.

Siéntase libre de publicar sus secciones relevantes de settings.py (incluyendo EMAIL_ *, SERVER_EMAIL, ADMINS (simplemente saque su correo electrónico real), GERENTES y DEPURAR) si desea un conjunto adicional de ojos para verificar si hay errores tipográficos.

2

Asegúrate de que tienes DEBUG = False

84

En mi caso la causa faltaba SERVER_EMAIL ajuste.

El valor predeterminado para SERVER_EMAIL es [email protected]. Pero muchos de los servidores de correo electrónico que incluyen mi proveedor de correo electrónico no aceptan correos electrónicos de esas direcciones sospechosas. En silencio dejan caer los correos electrónicos.

Al cambiar la dirección de correo electrónico del remitente al [email protected] se solucionó el problema. En settings.py:

SERVER_EMAIL = '[email protected]' 
+2

Otra sugerencia de que es probable que el problema sea si revisa su registro de correo y ve una entrada que contiene 'notificación de no entrega del remitente'. – jathanism

1

A pesar de que ha pasado un tiempo, aquí está mi respuesta, de modo que otras personas puedan beneficiarse en el futuro.

En mi caso, lo que impedía que los correos electrónicos se enviaran a la lista ADMINS, cuando se producía un error, era una configuración específica de la aplicación. Estaba usando django-piston, que proporciona los atributos de configuración PISTON_EMAIL_ERRORS y PISTON_DISPLAY_ERRORS. Configurando esto en consecuencia, habilitó al servidor de aplicaciones para notificarlo por correo, siempre que el pistón se bloquee.

30

Tuve la misma situación. Creé un nuevo proyecto y aplicación y funcionó, así que sabía que era mi código. Lo rastreé hasta el diccionario LOGGING en settings.py.Había hecho algunos cambios hace unas semanas para iniciar sesión con Sentry, pero por alguna razón el error acaba de comenzar hoy. He cambiado de nuevo a la original y tengo trabajo:

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

Entonces, hice algunos cambios poco a poco y tengo trabajo con Sentry y correo electrónico a los administradores también.

Además, la configuración LOGGING se fusionó con DEFAULT_LOGGING por defecto, por lo que es útil para echar un vistazo a the source code of django.utils.log.DEFAULT_LOGGING de entender qué más puede tener un efecto sobre su situación particular.

+3

En Django 1.4 esto lo arregló para nosotros. – boatcoder

+0

Esto lo arregló para mí (Django 1.7). Gracias – Paco

+1

La adición de la configuración de registro mató a mis correos electrónicos de administrador, que funcionó bien antes con el registro predeterminado. Supuse que 'disable_existing_loggers ': False' mantendría el registro existente tal cual, pero no fue así. Esto lo solucionó. – guidos

1

Si, por alguna razón, establece DEBUG_PROPAGATE_EXCEPTIONS en True (es False por defecto), el correo electrónico a admin no funcionará.

36

Otra posibilidad de error es el problema con la configuración de ADMINS. La siguiente configuración hará que el envío de correo a los administradores falle silenciosamente:

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

¿Qué pasa con eso? Así ADMINS tiene que ser una tupla de tuplas, por lo que las necesidades anteriores para tener el formato de

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

Nota del coma final. Sin la coma defectuosa, la dirección "a" en el correo electrónico se formateará incorrectamente (y luego probablemente se descarte silenciosamente en su servidor SMTP).

+0

(Fue gracias a la respuesta de @cathal anterior ejecutando localmente un servidor SMTP de depuración que me permitió localizar esto como mi problema). – wxgeorge

2

Disculpe si es demasiado ingenuo, pero en mi caso los correos electrónicos se enviaron pero iban directamente a la carpeta SPAM. Antes de intentar cosas más complicadas, consulte primero su carpeta SPAM.

+0

En realidad ... sí. Tuve errores de los rastreadores que intentaban realizar una solicitud de AJAX sin datos de formulario. Sobreestimé la inteligencia de los filtros de spam y terminé con todos los correos electrónicos enviados por Django atrapados por el filtro de spam. –

0

Por lo que vale, tuve este problema y ninguna de estas sugerencias funcionó para mí. Resultó que mi problema era que SERVER_EMAIL se configuró en una dirección que el servidor (Webfaction) no reconoció. Si este sitio estuviera alojado en Webfaction (como mis otros sitios son), esto no sería un problema, pero como se trataba de un servidor diferente, los servidores Webfaction no solo verifican la autenticación del correo electrónico que se envía, sino también el valor From: también.

2

Otra cosa a destacar aquí es que la configuración de handler500 podrían eludir el mecanismo que envía errores en un 500 si la respuesta desde el punto de vista no tiene un código de estado de 500. Si usted tiene un conjunto handler500, entonces en ese ver responder con algo como esto.

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

En mi caso, es el include_html en mail_admins.

Cuando configuro include_html en True, el servidor de correo electrónico rechaza enviar mi correo electrónico porque cree que mis correos electrónicos son correo no deseado.

Todo funciona bien cuando configuro include_html en False.

1

... y luego está el error facepalm, cuando se ha utilizado en el desarrollo de este para evitar que los correos electrónicos de salir, y luego copiar accidentalmente el ajuste a la producción:

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

(por supuesto que don No los veo impresos en la consola cuando se usa un servidor wsgi). Eliminar la configuración de producción solucionó esto por mí.

0

Y otra cosa que pueda ir mal (voy a añadir a la lista, para aquellas personas que van a parar aquí a pesar de todas las grandes respuestas anteriores):

Nuestra configuración Django utilizado SendGrid como el SMTP host y tenía una sola dirección de correo electrónico de administrador definida en la configuración de django. Esto funcionó bien durante algún tiempo, pero en algún momento, los correos dejaron de llegar.

Como resultado, la dirección de correo terminó en la lista SendGrid 'Bounced' por algún motivo desconocido, lo que provocó que los correos electrónicos a esa dirección se descartaran para siempre. La eliminación de la dirección de esa lista y su inclusión en la lista blanca solucionó el problema.

Cuestiones relacionadas