mirror of
https://github.com/coddingtonbear/django-mailbox.git
synced 2026-07-09 22:38:19 +02:00
Implement read-only mail fetching
This commit is contained in:
parent
b65c487215
commit
88b35117ae
3 changed files with 42 additions and 9 deletions
|
|
@ -24,3 +24,6 @@ class GenericFileMailbox(EmailTransport):
|
|||
yield message
|
||||
repository.flush()
|
||||
repository.unlock()
|
||||
|
||||
def get_new_message_ro(self, since=None):
|
||||
raise NotImplementedError("GenericFileMailbox.get_new_message_ro not implemented!")
|
||||
|
|
|
|||
|
|
@ -99,19 +99,47 @@ class ImapTransport(EmailTransport):
|
|||
if not message_ids:
|
||||
return
|
||||
|
||||
# Limit the uids to the small ones if we care about that
|
||||
if self.max_message_size:
|
||||
message_ids = self._get_small_message_ids(message_ids)
|
||||
|
||||
if self.archive:
|
||||
typ, folders = self.server.list(pattern=self.archive)
|
||||
if folders[0] is None:
|
||||
# If the archive folder does not exist, create it
|
||||
self.server.create(self.archive)
|
||||
|
||||
for message in self._iter_messages(message_ids):
|
||||
yield message
|
||||
|
||||
self.server.expunge()
|
||||
return
|
||||
|
||||
def get_new_message_ro(self, since):
|
||||
"""Read-only version of `get_message`. Uses a timestamp to fetch only messages
|
||||
originating later than `since` parameter.
|
||||
"""
|
||||
|
||||
date_format = "%d-%b-%Y"
|
||||
typ, [raw_msg_ids] = self.server.search(None, '(since "%s")' % (since.strftime(date_format)))
|
||||
|
||||
message_ids = raw_msg_ids.decode().split()
|
||||
|
||||
if not message_ids:
|
||||
return
|
||||
|
||||
for message in self._iter_messages(message_ids, archive=False, delete=False):
|
||||
yield message
|
||||
|
||||
self.server.expunge()
|
||||
return
|
||||
|
||||
|
||||
def _iter_messages(self, message_ids, condition=None, archive=True, delete=True):
|
||||
|
||||
# Limit the uids to the small ones if we care about that
|
||||
if self.max_message_size:
|
||||
message_ids = self._get_small_message_ids(message_ids)
|
||||
|
||||
for uid in message_ids:
|
||||
try:
|
||||
typ, msg_contents = self.server.uid('fetch', uid, '(RFC822)')
|
||||
typ, msg_contents = self.server.fetch(uid, '(RFC822)')
|
||||
if not msg_contents:
|
||||
continue
|
||||
try:
|
||||
|
|
@ -129,9 +157,8 @@ class ImapTransport(EmailTransport):
|
|||
except MessageParseError:
|
||||
continue
|
||||
|
||||
if self.archive:
|
||||
if archive and self.archive:
|
||||
self.server.uid('copy', uid, self.archive)
|
||||
|
||||
self.server.uid('store', uid, "+FLAGS", "(\\Deleted)")
|
||||
self.server.expunge()
|
||||
return
|
||||
if delete:
|
||||
self.server.uid('store', uid, "+FLAGS", "(\\Deleted)")
|
||||
|
|
@ -42,3 +42,6 @@ class Pop3Transport(EmailTransport):
|
|||
self.server.dele(i + 1)
|
||||
self.server.quit()
|
||||
return
|
||||
|
||||
def get_new_message_ro(self, since=None):
|
||||
raise NotImplementedError("Pop3Transport.get_new_message_ro not implemented!")
|
||||
Loading…
Add table
Add a link
Reference in a new issue