1
0
Fork 1
mirror of https://github.com/coddingtonbear/django-mailbox.git synced 2026-07-09 22:38:19 +02:00

Minor PR cleanup and reorganization.

This commit is contained in:
Adam Coddington 2013-07-26 20:15:39 -07:00
parent 9954b74eae
commit 0f3cb09f94
3 changed files with 51 additions and 31 deletions

View file

@ -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',

View file

@ -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

31
django_mailbox/utils.py Normal file
View file

@ -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')