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

Actually fixing Python 3 support; verified both IMAP and POP3. Fixes #13 (seriously this time).

This commit is contained in:
Adam Coddington 2014-04-25 16:37:51 -07:00
parent 4002d5c222
commit 3b2d60a903
9 changed files with 145 additions and 16 deletions

View file

@ -0,0 +1,19 @@
import email
import six
# Do *not* remove this, we need to use this in subclasses of EmailTransport
if six.PY3:
from email.errors import MessageParseError
else:
from email.Errors import MessageParseError
class EmailTransport(object):
def get_email_from_bytes(self, contents):
if six.PY3:
message = email.message_from_bytes(contents)
else:
message = email.message_from_string(contents)
return message

View file

@ -1,4 +1,7 @@
class GenericFileMailbox(object):
from .base import EmailTransport
class GenericFileMailbox(EmailTransport):
_variant = None
_path = None

View file

@ -1,8 +1,9 @@
import email
from imaplib import IMAP4, IMAP4_SSL
from .base import EmailTransport, MessageParseError
class ImapTransport(object):
class ImapTransport(EmailTransport):
def __init__(self, hostname, port=None, ssl=False):
self.hostname = hostname
self.port = port
@ -29,9 +30,9 @@ class ImapTransport(object):
for key in inbox[0].split():
try:
typ, msg_contents = self.server.fetch(key, '(RFC822)')
message = email.message_from_string(msg_contents[0][1])
message = self.get_email_from_bytes(msg_contents[0][1])
yield message
except email.Errors.MessageParseError:
except MessageParseError:
continue
self.server.store(key, "+FLAGS", "\\Deleted")
self.server.expunge()

View file

@ -1,8 +1,11 @@
import email
import six
from poplib import POP3, POP3_SSL
from .base import EmailTransport, MessageParseError
class Pop3Transport(object):
class Pop3Transport(EmailTransport):
def __init__(self, hostname, port=None, ssl=False):
self.hostname = hostname
self.port = port
@ -20,14 +23,21 @@ class Pop3Transport(object):
self.server.user(username)
self.server.pass_(password)
def get_message_body(self, message_lines):
if six.PY3:
return six.binary_type('\r\n', 'ascii').join(message_lines)
return '\r\n'.join(message_lines)
def get_message(self):
message_count = len(self.server.list()[1])
for i in range(message_count):
try:
msg_contents = "\r\n".join(self.server.retr(i + 1)[1])
message = email.message_from_string(msg_contents)
msg_contents = self.get_message_body(
self.server.retr(i + 1)[1]
)
message = self.get_email_from_bytes(msg_contents)
yield message
except email.Errors.MessageParseError:
except MessageParseError:
continue
self.server.dele(i + 1)
self.server.quit()