diff --git a/django/core/handlers/base.py b/django/core/handlers/base.py index 6735f7d12..07a3df127 100644 --- a/django/core/handlers/base.py +++ b/django/core/handlers/base.py @@ -164,7 +164,8 @@ class BaseHandler(object): except: request_repr = "Request repr() unavailable" message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr) - mail_admins(subject, message, fail_silently=True, html_message=html) + extra_emails = self._get_extra_emails(exc_info) + mail_admins(subject, message, fail_silently=True, html_message=html, extra_emails=extra_emails) # Return an HttpResponse that displays a friendly error message. callback, param_dict = resolver.resolve500() return callback(request, **param_dict) @@ -174,6 +175,17 @@ class BaseHandler(object): import traceback return '\n'.join(traceback.format_exception(*(exc_info or sys.exc_info()))) + def _get_extra_emails(self, exc_info=None): + "Helper function to retrieve app-specific admin email lists." + etype, value, tb = exc_info or sys.exc_info() + admins = [] + while tb is not None: + f = tb.tb_frame + if "DEBUG_EMAILS" in f.f_globals: + admins += f.f_globals["DEBUG_EMAILS"] + tb = tb.tb_next + return admins + def apply_response_fixes(self, request, response): """ Applies each of the functions in self.response_fixes to the request and diff --git a/django/core/mail.py b/django/core/mail.py index 3751d4d99..6e4842aa3 100644 --- a/django/core/mail.py +++ b/django/core/mail.py @@ -409,12 +409,14 @@ def send_mass_mail(datatuple, fail_silently=False, auth_user=None, for subject, message, sender, recipient in datatuple] return connection.send_messages(messages) -def mail_admins(subject, message, fail_silently=False, html_message=None): +def mail_admins(subject, message, fail_silently=False, html_message=None, extra_emails=[]): """Sends a message to the admins, as defined by the ADMINS setting.""" - if not settings.ADMINS: + if not (settings.ADMINS or extra_emails): return + emails = set(list(settings.ADMINS) + extra_emails); + print " * Admin email addresses:", emails from django.core.mail import EmailMultiAlternatives - msg = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS]) + msg = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in emails]) if html_message: msg.attach_alternative(html_message, "text/html") msg.send(fail_silently=fail_silently)