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:
parent
b65c487215
commit
88b35117ae
3 changed files with 42 additions and 9 deletions
|
|
@ -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!")
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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!")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue