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

Added email archiving option to IMAP transport

This commit is contained in:
Daniel 2014-05-23 09:17:14 +01:00
parent 872f4786c7
commit 0e0c6cf170
4 changed files with 49 additions and 14 deletions

View file

@ -146,6 +146,10 @@ class Mailbox(models.Model):
def use_ssl(self):
return '+ssl' in self._protocol_info.scheme.lower()
@property
def archive(self):
return self._protocol_info.query
def get_connection(self):
if not self.uri:
return None
@ -153,7 +157,8 @@ class Mailbox(models.Model):
conn = ImapTransport(
self.location,
port=self.port if self.port else None,
ssl=self.use_ssl
ssl=self.use_ssl,
archive=self.archive
)
conn.connect(self.username, self.password)
elif self.type == 'pop3':

View file

@ -10,10 +10,12 @@ class TestImapTransport(EmailMessageTestCase):
self.arbitrary_hostname = 'one.two.three'
self.arbitrary_port = 100
self.ssl = False
self.archive = 'Archive'
self.transport = ImapTransport(
self.arbitrary_hostname,
self.arbitrary_port,
self.ssl
self.ssl,
self.archive
)
self.transport.server = None
super(TestImapTransport, self).setUp()
@ -36,7 +38,18 @@ class TestImapTransport(EmailMessageTestCase):
')',
]
)
server.list.return_value = (
'OK',
[
'(\\HasNoChildren) "/" "Archive"'
]
)
server.copy.return_value = (
'OK',
[
'[COPYUID 1 2 2] (Success)'
]
)
actual_messages = list(self.transport.get_message())
self.assertEqual(len(actual_messages), 1)

View file

@ -4,9 +4,10 @@ from .base import EmailTransport, MessageParseError
class ImapTransport(EmailTransport):
def __init__(self, hostname, port=None, ssl=False):
def __init__(self, hostname, port=None, ssl=False, archive=''):
self.hostname = hostname
self.port = port
self.archive = archive
if ssl:
self.transport = IMAP4_SSL
if not self.port:
@ -27,6 +28,11 @@ class ImapTransport(EmailTransport):
if not inbox[0]:
return
if self.archive:
typ, folders = self.server.list(pattern=self.archive)
if folders[0] == None:
self.archive = False
for key in inbox[0].split():
try:
typ, msg_contents = self.server.fetch(key, '(RFC822)')
@ -34,6 +40,10 @@ class ImapTransport(EmailTransport):
yield message
except MessageParseError:
continue
if self.archive:
self.server.copy(key, self.archive)
self.server.store(key, "+FLAGS", "\\Deleted")
self.server.expunge()
return