1
0
Fork 1
mirror of https://github.com/coddingtonbear/django-mailbox.git synced 2026-07-10 06:48:19 +02:00

* Add decoding for some encoded messages parts, i.e.

attachments' name, message header, etc.
* Remove overriding for MessageAttachment's __getitem__
  method, so we can call the members directly in django
  templates.

Signed-off-by: Anders.Du <ander.dy@gmail.com>
This commit is contained in:
Anders.Du 2013-07-19 23:39:41 +08:00
parent 4e83ae8eb3
commit eca0b2caa4

View file

@ -6,6 +6,7 @@ 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
@ -24,6 +25,12 @@ from django_mailbox.transports import Pop3Transport, ImapTransport,\
from django_mailbox.signals import message_received from django_mailbox.signals import message_received
import six import six
from dateutil import parser
from django.db import IntegrityError, DatabaseError
from django.utils.encoding import smart_unicode, smart_str
from tickets.models import Ticket
import re
import traceback
STRIP_UNALLOWED_MIMETYPES = getattr( STRIP_UNALLOWED_MIMETYPES = getattr(
settings, settings,
'DJANGO_MAILBOX_STRIP_UNALLOWED_MIMETYPES', 'DJANGO_MAILBOX_STRIP_UNALLOWED_MIMETYPES',
@ -243,15 +250,20 @@ class Mailbox(models.Model):
return new return new
def _process_message(self, message): def _process_message(self, message):
try:
msg = Message() msg = Message()
msg.mailbox = self msg.mailbox = self
if 'subject' in message:
msg.subject = message['subject'][0:255] msg.subject = message['subject'][0:255]
if 'message-id' in message:
msg.message_id = message['message-id'][0:255] msg.message_id = message['message-id'][0:255]
if 'from' in message:
msg.from_header = message['from'] msg.from_header = message['from']
if 'to' in message:
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 = message.as_string() msg.body = unicode(e_message.as_string(),errors='ignore')
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(
@ -260,6 +272,13 @@ class Mailbox(models.Model):
except IndexError: except IndexError:
pass pass
msg.save() msg.save()
except IntegrityError,e:
traceback.print_exc()
pass
except DatabaseError, e:
traceback.print_exc()
pass
return msg return msg
def get_new_mail(self): def get_new_mail(self):
@ -346,23 +365,26 @@ class Message(models.Model):
separate fields. separate fields.
""" """
if self.outgoing: addresses = []
return self.to_addresses() addresses = self.to_addresses + self.from_address
else: return addresses
return self.from_addresses()
@property @property
def from_address(self): def from_address(self):
return parseaddr(self.from_header)[1] if self.from_header:
return [parseaddr(self.from_header)[1].lower()]
else:
return []
@property @property
def to_addresses(self): def to_addresses(self):
addresses = [] addresses = []
for address in self.to_header.split(','): for address in self.to_header.split(','):
if address:
addresses.append( addresses.append(
parseaddr( parseaddr(
address address
)[1] )[1].lower()
) )
return addresses return addresses
@ -396,12 +418,21 @@ 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() # 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)
return body return body
return get_body_from_message( return get_body_from_message(
@ -531,13 +562,25 @@ class MessageAttachment(models.Model):
self._set_dehydrated_headers(rehydrated) self._set_dehydrated_headers(rehydrated)
def get_filename(self): def get_filename(self):
return self._get_rehydrated_headers().get_filename() 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]
else:
return ''
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] # return self._get_rehydrated_headers()[name]
def __unicode__(self): def __unicode__(self):
return self.document.url return self.document.url