From bbf01ada6b2f748618db820624bf768989a11924 Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Fri, 30 Apr 2021 18:52:36 -0600 Subject: fetch folders --- ctec/logic.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'ctec/logic.py') diff --git a/ctec/logic.py b/ctec/logic.py index 7afd78a..57b553c 100644 --- a/ctec/logic.py +++ b/ctec/logic.py @@ -3,13 +3,17 @@ import mailbox import pathlib import pprint import re +from typing import List, Union, Tuple -from . import import_or_install +from . import import_or_install, imap_response mailbox.Maildir.colon = '!' FLAGS = re.compile(rb'FLAGS \(([^)]+?)\)') +def clean_folder_name(folder_name: str, separator: str) -> str: + return folder_name.replace('.', '-').replace(separator, '.').replace('/', '-') + class Account: def __init__(self, address: str, info: dict): appdirs = import_or_install('appdirs') @@ -18,21 +22,27 @@ class Account: self.mailbox = mailbox.Maildir(data_dir / address) self.info = info + def fetch_folders(self): + with imaplib.IMAP4_SSL(self.info['imap host']) as M: + M.login(self.address, self.info['password']) + folder_list: List[bytes] + typ, folder_list = M.list() + for folder in folder_list: + folder_info = imap_response.List.parse(folder) + self.mailbox.add_folder(clean_folder_name(folder_info.name, folder_info.delimiter)) + 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') + 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) + print(message['Subject'], flags) if rb'\Seen' in flags: message.add_flag('S') message.set_subdir('cur') @@ -45,5 +55,8 @@ class Account: inbox.add(message) M.close() + def folders(self) -> List[Tuple[str, mailbox.Maildir]]: + return [(folder, self.mailbox.get_folder(folder)) for folder in self.mailbox.list_folders()] + def inbox(self) -> mailbox.Maildir: return self.mailbox.add_folder('Inbox') -- cgit v1.2.3