1
0
Fork 1
mirror of https://github.com/coddingtonbear/django-mailbox.git synced 2026-07-10 06:48:19 +02:00

Implement read-only mail fetching

This commit is contained in:
Mike Varga 2022-10-14 13:49:59 -04:00
parent b65c487215
commit 88b35117ae
3 changed files with 42 additions and 9 deletions

View file

@ -24,3 +24,6 @@ class GenericFileMailbox(EmailTransport):
yield message yield message
repository.flush() repository.flush()
repository.unlock() repository.unlock()
def get_new_message_ro(self, since=None):
raise NotImplementedError("GenericFileMailbox.get_new_message_ro not implemented!")

View file

@ -99,19 +99,47 @@ class ImapTransport(EmailTransport):
if not message_ids: if not message_ids:
return 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: if self.archive:
typ, folders = self.server.list(pattern=self.archive) typ, folders = self.server.list(pattern=self.archive)
if folders[0] is None: if folders[0] is None:
# If the archive folder does not exist, create it # If the archive folder does not exist, create it
self.server.create(self.archive) 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: for uid in message_ids:
try: try:
typ, msg_contents = self.server.uid('fetch', uid, '(RFC822)') typ, msg_contents = self.server.fetch(uid, '(RFC822)')
if not msg_contents: if not msg_contents:
continue continue
try: try:
@ -129,9 +157,8 @@ class ImapTransport(EmailTransport):
except MessageParseError: except MessageParseError:
continue continue
if self.archive: if archive and self.archive:
self.server.uid('copy', uid, self.archive) self.server.uid('copy', uid, self.archive)
self.server.uid('store', uid, "+FLAGS", "(\\Deleted)") if delete:
self.server.expunge() self.server.uid('store', uid, "+FLAGS", "(\\Deleted)")
return

View file

@ -42,3 +42,6 @@ class Pop3Transport(EmailTransport):
self.server.dele(i + 1) self.server.dele(i + 1)
self.server.quit() self.server.quit()
return return
def get_new_message_ro(self, since=None):
raise NotImplementedError("Pop3Transport.get_new_message_ro not implemented!")