From 0f3cb09f94c8e1381918cea00d1b3e13ee2ff284 Mon Sep 17 00:00:00 2001 From: Adam Coddington Date: Fri, 26 Jul 2013 20:15:39 -0700 Subject: [PATCH] Minor PR cleanup and reorganization. --- django_mailbox/admin.py | 11 ++++------- django_mailbox/models.py | 40 ++++++++++++++++------------------------ django_mailbox/utils.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 django_mailbox/utils.py diff --git a/django_mailbox/admin.py b/django_mailbox/admin.py index 84bbba1..b1da90d 100644 --- a/django_mailbox/admin.py +++ b/django_mailbox/admin.py @@ -5,6 +5,7 @@ from django.contrib import admin from django_mailbox.models import MessageAttachment, Message, Mailbox from django_mailbox.signals import message_received +from django_mailbox.utils import decode_header logger = logging.getLogger(__name__) @@ -44,23 +45,19 @@ class MessageAttachmentInline(admin.TabularInline): model = MessageAttachment extra = 0 -default_charset = 'ASCII' -import email.header -def decode(m): - return ''.join([ unicode(t[0], t[1] or default_charset) for t in email.header.decode_header(m) ]) class MessageAdmin(admin.ModelAdmin): def attachment_count(self, msg): return msg.attachments.count() - def Subject(self, msg): - return decode(msg.subject) + def subject(self, msg): + return decode_header(msg.subject) inlines = [ MessageAttachmentInline, ] list_display = ( - 'Subject', + 'subject', 'processed', 'read', 'mailbox', diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 6f8694a..8f34c6e 100755 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -6,7 +6,6 @@ import urllib import mimetypes import os.path from quopri import encode as encode_quopri -from quopri import decodestring as decodestring_quopri import sys import uuid @@ -258,7 +257,7 @@ class Mailbox(models.Model): msg.to_header = message['to'] msg.save() message = self._get_dehydrated_message(message, msg) - msg.body = unicode(message.as_string(),errors='ignore') + msg.body = message.as_string() if message['in-reply-to']: try: msg.in_reply_to = Message.objects.filter( @@ -406,21 +405,16 @@ class Message(models.Model): def get_text_body(self): def get_body_from_message(message): body = '' - charset = 'ascii' for part in message.walk(): if ( part.get_content_maintype() == 'text' and part.get_content_subtype() == 'plain' ): - # body = body + part.get_payload() - if part.get_content_charset(): - charset = part.get_content_charset() - encoding = part['Content-Transfer-Encoding'] - # print encoding - if encoding and encoding.lower() == 'base64': - body = body + unicode(part.get_payload().decode('base64'), charset) - else: - body = body + unicode(decodestring_quopri(part.get_payload()), charset) + charset = part.get_content_charset() + this_part = part.get_payload(decode=True) + if charset: + this_part = this_part.decode(charset) + body += this_part return body return get_body_from_message( @@ -552,23 +546,21 @@ class MessageAttachment(models.Model): def get_filename(self): file_name = self._get_rehydrated_headers().get_filename() if file_name: - try: - d_subject = email.Header.decode_header(file_name) - except UnicodeEncodeError, e: - print e - return file_name - if d_subject[0][1]: - return unicode(d_subject[0][0], d_subject[0][1]) - else: - return d_subject[0][0] + encoded_subject, encoding = email.Header.decode_header(file_name)[0] + if encoding: + encoded_subject = encoded_subject.decode(encoding) + return encoded_subject else: - return '' + return None def items(self): return self._get_rehydrated_headers().items() - # def __getitem__(self, name): - # return self._get_rehydrated_headers()[name] + def __getitem__(self, name): + value = self._get_rehydrated_headers()[name] + if value is None: + raise KeyError('Header %s does not exist' % name) + return value def __unicode__(self): return self.document.url diff --git a/django_mailbox/utils.py b/django_mailbox/utils.py new file mode 100644 index 0000000..b977ce6 --- /dev/null +++ b/django_mailbox/utils.py @@ -0,0 +1,31 @@ +import email.header +import logging + +from django.conf import settings + + +logger = logging.getLogger(__name__) + + +DEFAULT_CHARSET = getattr( + settings, + 'DJANGO_MAILBOX_DEFAULT_CHARSET', + 'ascii', +) + + +def decode_header(header): + try: + return ''.join( + [ + unicode(t[0], t[1] or DEFAULT_CHARSET) + for t in email.header.decode_header(header) + ] + ) + except UnicodeDecodeError: + logger.exception( + 'Errors encountered decoding header %s into encoding %s.', + header, + DEFAULT_CHARSET, + ) + return unicode(header, DEFAULT_CHARSET, 'replace')