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:
parent
9954b74eae
commit
0f3cb09f94
3 changed files with 51 additions and 31 deletions
|
|
@ -5,6 +5,7 @@ from django.contrib import admin
|
||||||
|
|
||||||
from django_mailbox.models import MessageAttachment, Message, Mailbox
|
from django_mailbox.models import MessageAttachment, Message, Mailbox
|
||||||
from django_mailbox.signals import message_received
|
from django_mailbox.signals import message_received
|
||||||
|
from django_mailbox.utils import decode_header
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
@ -44,23 +45,19 @@ class MessageAttachmentInline(admin.TabularInline):
|
||||||
model = MessageAttachment
|
model = MessageAttachment
|
||||||
extra = 0
|
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):
|
class MessageAdmin(admin.ModelAdmin):
|
||||||
def attachment_count(self, msg):
|
def attachment_count(self, msg):
|
||||||
return msg.attachments.count()
|
return msg.attachments.count()
|
||||||
|
|
||||||
def Subject(self, msg):
|
def subject(self, msg):
|
||||||
return decode(msg.subject)
|
return decode_header(msg.subject)
|
||||||
|
|
||||||
inlines = [
|
inlines = [
|
||||||
MessageAttachmentInline,
|
MessageAttachmentInline,
|
||||||
]
|
]
|
||||||
list_display = (
|
list_display = (
|
||||||
'Subject',
|
'subject',
|
||||||
'processed',
|
'processed',
|
||||||
'read',
|
'read',
|
||||||
'mailbox',
|
'mailbox',
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import urllib
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import os.path
|
import os.path
|
||||||
from quopri import encode as encode_quopri
|
from quopri import encode as encode_quopri
|
||||||
from quopri import decodestring as decodestring_quopri
|
|
||||||
import sys
|
import sys
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
|
@ -258,7 +257,7 @@ class Mailbox(models.Model):
|
||||||
msg.to_header = message['to']
|
msg.to_header = message['to']
|
||||||
msg.save()
|
msg.save()
|
||||||
message = self._get_dehydrated_message(message, msg)
|
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']:
|
if message['in-reply-to']:
|
||||||
try:
|
try:
|
||||||
msg.in_reply_to = Message.objects.filter(
|
msg.in_reply_to = Message.objects.filter(
|
||||||
|
|
@ -406,21 +405,16 @@ class Message(models.Model):
|
||||||
def get_text_body(self):
|
def get_text_body(self):
|
||||||
def get_body_from_message(message):
|
def get_body_from_message(message):
|
||||||
body = ''
|
body = ''
|
||||||
charset = 'ascii'
|
|
||||||
for part in message.walk():
|
for part in message.walk():
|
||||||
if (
|
if (
|
||||||
part.get_content_maintype() == 'text'
|
part.get_content_maintype() == 'text'
|
||||||
and part.get_content_subtype() == 'plain'
|
and part.get_content_subtype() == 'plain'
|
||||||
):
|
):
|
||||||
# body = body + part.get_payload()
|
charset = part.get_content_charset()
|
||||||
if part.get_content_charset():
|
this_part = part.get_payload(decode=True)
|
||||||
charset = part.get_content_charset()
|
if charset:
|
||||||
encoding = part['Content-Transfer-Encoding']
|
this_part = this_part.decode(charset)
|
||||||
# print encoding
|
body += this_part
|
||||||
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)
|
|
||||||
return body
|
return body
|
||||||
|
|
||||||
return get_body_from_message(
|
return get_body_from_message(
|
||||||
|
|
@ -552,23 +546,21 @@ class MessageAttachment(models.Model):
|
||||||
def get_filename(self):
|
def get_filename(self):
|
||||||
file_name = self._get_rehydrated_headers().get_filename()
|
file_name = self._get_rehydrated_headers().get_filename()
|
||||||
if file_name:
|
if file_name:
|
||||||
try:
|
encoded_subject, encoding = email.Header.decode_header(file_name)[0]
|
||||||
d_subject = email.Header.decode_header(file_name)
|
if encoding:
|
||||||
except UnicodeEncodeError, e:
|
encoded_subject = encoded_subject.decode(encoding)
|
||||||
print e
|
return encoded_subject
|
||||||
return file_name
|
|
||||||
if d_subject[0][1]:
|
|
||||||
return unicode(d_subject[0][0], d_subject[0][1])
|
|
||||||
else:
|
|
||||||
return d_subject[0][0]
|
|
||||||
else:
|
else:
|
||||||
return ''
|
return None
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
return self._get_rehydrated_headers().items()
|
return self._get_rehydrated_headers().items()
|
||||||
|
|
||||||
# def __getitem__(self, name):
|
def __getitem__(self, name):
|
||||||
# return self._get_rehydrated_headers()[name]
|
value = self._get_rehydrated_headers()[name]
|
||||||
|
if value is None:
|
||||||
|
raise KeyError('Header %s does not exist' % name)
|
||||||
|
return value
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.document.url
|
return self.document.url
|
||||||
|
|
|
||||||
31
django_mailbox/utils.py
Normal file
31
django_mailbox/utils.py
Normal 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')
|
||||||
Loading…
Add table
Add a link
Reference in a new issue