2012-01-06 14 views
5

Estoy usando un tercero para enviar correos electrónicos, y me permiten categorizar mi correo electrónico agregando encabezados a los correos electrónicos que envío a través de ellos.¿Es posible agregar un encabezado al correo electrónico que django envía a los administradores cuando se genera un 500?

¿Es posible añadir un encabezado al correo electrónico de excepción antes de que se envíe? O al menos, administraré el envío del correo electrónico detectando la excepción en el middleware, pero ¿cómo puedo generar la buena respuesta por correo electrónico que django me envía a un 500?

EDIT: Sé cómo agregar encabezados a los correos electrónicos, sé cómo procesar excepciones a través de middleware. Estoy interesado en cómo generar el mismo correo electrónico que envía django en la excepción, para que pueda agregar un encabezado.

Respuesta

8
  1. Subclase AdminEmailHandler (definido en django.utils.log).
  2. Configure logging en consecuencia.

Aquí es cómo funciona: AdminEmailHandler

class AdminEmailHandler(logging.Handler): 
    """An exception log handler that emails log entries to site admins. 

    If the request is passed as the first argument to the log record, 
    request data will be provided in the email report. 
    """ 

    def __init__(self, include_html=False): 
     logging.Handler.__init__(self) 
     self.include_html = include_html 

    def emit(self, record): 
     try: 
      request = record.request 
      subject = '%s (%s IP): %s' % (
       record.levelname, 
       (request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), 
       record.msg 
      ) 
      filter = get_exception_reporter_filter(request) 
      request_repr = filter.get_request_repr(request) 
     except: 
      subject = '%s: %s' % (
       record.levelname, 
       record.getMessage() 
      ) 
      request = None 
      request_repr = "Request repr() unavailable." 

     if record.exc_info: 
      exc_info = record.exc_info 
      stack_trace = '\n'.join(traceback.format_exception(*record.exc_info)) 
     else: 
      exc_info = (None, record.getMessage(), None) 
      stack_trace = 'No stack trace available' 

     message = "%s\n\n%s" % (stack_trace, request_repr) 
     reporter = ExceptionReporter(request, is_email=True, *exc_info) 
     html_message = self.include_html and reporter.get_traceback_html() or None 
     mail.mail_admins(subject, message, fail_silently=True, html_message=html_message) 

Sólo para referencia: mi respuesta anterior.

  1. Crear una encargo middleware: tomar la inspiración de CommonMiddleware en https://code.djangoproject.com/browser/django/trunk/django/middleware/common.py (echar un vistazo a process_response)
  2. crear una función send_mail_with_exception_header basan en https://code.djangoproject.com/browser/django/trunk/django/core/mail/message.py

He aquí un ejemplo:

# Custom middleware 

class MyErrorMiddleware(object): 
    def process_response(self, request, response): 
     if response.status_code == 404: 
      domain = request.get_host() 
      referer = request.META.get('HTTP_REFERER', None) 
      is_internal = _is_internal_request(domain, referer) 
      path = request.get_full_path() 
       if referer and not _is_ignorable_404(path) and (is_internal or '?' not in referer): 
        ua = request.META.get('HTTP_USER_AGENT', '<none>') 
        ip = request.META.get('REMOTE_ADDR', '<none>') 
        mail_error("Broken %slink on %s" % ((is_internal and 'INTERNAL ' or ''), domain), 
         "Referrer: %s\nRequested URL: %s\nUser agent: %s\nIP address: %s\n" \ 
            % (referer, request.get_full_path(), ua, ip), 
            fail_silently=True) 
       return response 

# Custom mail_error function 

def mail_error(subject, message, fail_silently=False, connection=None, 
        html_message=None): 
    """Sends a message to the managers, as defined by the MANAGERS setting.""" 
    if not settings.MANAGERS: 
     return 

    # put your extra headers here 
    mail = EmailMultiAlternatives(u'%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject), 
       message, settings.SERVER_EMAIL, [a[1] for a in settings.MANAGERS], 
       connection=connection, header={}) 
    mail 
    if html_message: 
     mail.attach_alternative(html_message, 'text/html') 
    mail.send(fail_silently=fail_silently) 
+0

entiendo esto, pero ¿cómo puedo generar los buenos datos que normalmente se envían en un correo electrónico de excepción de administrador? – MattoTodd

+0

Lo siento. Actualicé mi respuesta con AdminEmailHandler, que muestra cómo lo hace Django. – charlax

+0

Actualmente estoy ejecutando django 1.2, que no tiene el módulo django.utils.log, ¿sabe dónde existe esto en 1.2? – MattoTodd

Cuestiones relacionadas