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')