diff --git a/.travis.yml b/.travis.yml index 5e88b63..5cf4dc1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,10 @@ python: - "2.6" - "2.7" - "3.2" + - "3.3" env: - - DJANGO=1.5.5 - - DJANGO=1.6.1 + - DJANGO=1.5.6 + - DJANGO=1.6.3 install: - pip install -q Django==$DJANGO --use-mirrors - pip install -q -e . --use-mirrors diff --git a/django_mailbox/models.py b/django_mailbox/models.py index e604caa..61e4260 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -4,18 +4,12 @@ from email.header import decode_header from email.message import Message as EmailMessage from email.utils import formatdate, parseaddr from email.encoders import encode_base64 -import urllib import mimetypes import os.path from quopri import encode as encode_quopri import sys import uuid -try: - import urllib.parse as urlparse -except ImportError: - import urlparse - from django.conf import settings from django.core.mail.message import make_msgid from django.core.files.base import ContentFile @@ -25,6 +19,7 @@ from django_mailbox.transports import Pop3Transport, ImapTransport,\ MMDFTransport from django_mailbox.signals import message_received import six +from six.moves.urllib.parse import unquote, urlparse STRIP_UNALLOWED_MIMETYPES = getattr( @@ -117,7 +112,7 @@ class Mailbox(models.Model): @property def _protocol_info(self): - return urlparse.urlparse(self.uri) + return urlparse(self.uri) @property def _domain(self): @@ -129,11 +124,11 @@ class Mailbox(models.Model): @property def username(self): - return urllib.unquote(self._protocol_info.username) + return unquote(self._protocol_info.username) @property def password(self): - return urllib.unquote(self._protocol_info.password) + return unquote(self._protocol_info.password) @property def location(self): @@ -249,6 +244,21 @@ class Mailbox(models.Model): placeholder[ATTACHMENT_INTERPOLATION_HEADER] = str(attachment.pk) new = placeholder else: + content_charset = msg.get_content_charset() + if not content_charset: + content_charset = 'ascii' + try: + # Make sure that the payload can be properly decoded in the + # defined charset, if it can't, let's mash some things + # inside the payload :-\ + msg.get_payload(decode=True).decode(content_charset) + except UnicodeDecodeError: + msg.set_payload( + msg.get_payload(decode=True).decode( + content_charset, + 'ignore' + ) + ) new = msg return new @@ -495,7 +505,7 @@ class Message(models.Model): return self.body.encode('utf-8') def set_body(self, body): - if sys.version_info >= (3, 0): + if six.PY3: body = body.encode('utf-8') self.encoded = True self.body = base64.b64encode(body).decode('ascii') @@ -503,10 +513,10 @@ class Message(models.Model): def get_email_object(self): """ Returns an `email.message.Message` instance for this message.""" body = self.get_body() - if sys.version_info < (3, 0): - flat = email.message_from_string(body) - else: + if six.PY3: flat = email.message_from_bytes(body) + else: + flat = email.message_from_string(body) return self._rehydrate(flat) def delete(self, *args, **kwargs): diff --git a/django_mailbox/tests/messages/message_with_invalid_content_for_declared_encoding.eml b/django_mailbox/tests/messages/message_with_invalid_content_for_declared_encoding.eml index 8860e9d..ea0d874 100644 --- a/django_mailbox/tests/messages/message_with_invalid_content_for_declared_encoding.eml +++ b/django_mailbox/tests/messages/message_with_invalid_content_for_declared_encoding.eml @@ -1,5 +1,5 @@ Date: Fri, 30 Jan 2012 11:30:01 PST -Subject: Tjest +Subject: Tjest Wrong From: "Somebody" To: idontknow@somewhere.com MIME-Version: 1.0 diff --git a/setup.py b/setup.py index a7557e6..11a180f 100755 --- a/setup.py +++ b/setup.py @@ -41,6 +41,6 @@ setup( 'django_mailbox.tests', ], install_requires=[ - 'six' + 'six>=1.6.1' ] )