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:
parent
4e83ae8eb3
commit
eca0b2caa4
1 changed files with 74 additions and 31 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue