From 1cf5e68c25c0505194f23d4018e29767d3b519dd Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Sat, 27 Feb 2021 17:14:38 -0700 Subject: fetch inboxes --- ctec/logic.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 ctec/logic.py (limited to 'ctec/logic.py') diff --git a/ctec/logic.py b/ctec/logic.py new file mode 100644 index 0000000..7afd78a --- /dev/null +++ b/ctec/logic.py @@ -0,0 +1,49 @@ +import imaplib +import mailbox +import pathlib +import pprint +import re + +from . import import_or_install + +mailbox.Maildir.colon = '!' + +FLAGS = re.compile(rb'FLAGS \(([^)]+?)\)') + +class Account: + def __init__(self, address: str, info: dict): + appdirs = import_or_install('appdirs') + data_dir = pathlib.Path(appdirs.user_data_dir(appname='ctec', appauthor=False)) + self.address = address + self.mailbox = mailbox.Maildir(data_dir / address) + self.info = info + + def fetch_inbox(self): + with imaplib.IMAP4_SSL(self.info['imap host']) as M: + M.login(self.address, self.info['password']) + try: + inbox = self.mailbox.get_folder('Inbox') + except mailbox.NoSuchMailboxError: + inbox = self.mailbox.add_folder('Inbox') + M.select() + typ, data = M.search(None, 'ALL') + for num in data[0].split(): + typ, data = M.fetch(num, '(FLAGS RFC822)') + for prefix, message in data[:-1]: + flags = FLAGS.search(prefix).group(1).split() + print(flags) + message = mailbox.MaildirMessage(message) + if rb'\Seen' in flags: + message.add_flag('S') + message.set_subdir('cur') + if 'Message-ID' in message: + message_id = message['Message-ID'].strip() + else: + print(message) + raise KeyError('No message ID header') + if not any(x['Message-ID'].strip() == message_id for x in inbox): + inbox.add(message) + M.close() + + def inbox(self) -> mailbox.Maildir: + return self.mailbox.add_folder('Inbox') -- cgit v1.2.3