2012-01-06 8 views
5

E-posta göndermek için üçüncü taraf kullanıyorum ve gönderdiğim e-postalara üstbilgi ekleyerek e-postalarımı sınıflandırmamı sağladılar.500 oluşturulduğunda yöneticilere gönderilen e-postaya bir başlık eklemek mümkün müdür?

Gönderilmeden önce istisna e-postasına bir başlık eklemek mümkün mü? Ya da en azından, e-postayı orta katmandaki istisnayı yakalayarak göndererek yöneteceğim, ancak django'nun bana 500 üzerinden gönderdiği güzel e-posta yanıtını nasıl oluşturabilirim?

DÜZENLEME: E-postalara üstbilgileri nasıl ekleyeceğimi biliyorum, ara katman aracılığıyla istisnanın nasıl işleneceğini biliyorum. Ben django istisna gönderir aynı e-posta oluşturmak için nasıl ilgileniyorum, böylece bir başlık ekleyebilir. (django.utils.log tanımlanan)

cevap

8
  1. alt sınıf AdminEmailHandler.
  2. logging'u yapılandırın. İşte

nasıl AdminEmailHandler çalışır: Bir önceki yanıt: Sadece referans için

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) 

.

  1. Oluştur özel katman:
  2. send_mail_with_exception_header İşte

https://code.djangoproject.com/browser/django/trunk/django/core/mail/message.py dayalı bir işlev oluşturun (process_response de bakabilirsiniz) https://code.djangoproject.com/browser/django/trunk/django/middleware/common.py yılında CommonMiddleware ilham almak bir örnek:

# 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

Bunu anlıyorum, ancak genellikle yönetici istisnası e-postasında gönderilen güzel verileri nasıl oluşturabilirim? – MattoTodd

+0

Üzgünüm. Cevabımı Django'nun nasıl yaptığını gösteren AdminEmailHandler ile güncelledim. – charlax

+0

Şu anda django.utils.log modülüne sahip olmayan django 1.2'yi çalıştırıyorum, bunun 1.2'de nerede olduğunu biliyor musunuz? – MattoTodd

İlgili konular