aboutsummaryrefslogtreecommitdiff
path: root/ctec/logic.py
diff options
context:
space:
mode:
Diffstat (limited to 'ctec/logic.py')
-rw-r--r--ctec/logic.py33
1 files changed, 25 insertions, 8 deletions
diff --git a/ctec/logic.py b/ctec/logic.py
index 57b553c..1769e47 100644
--- a/ctec/logic.py
+++ b/ctec/logic.py
@@ -11,8 +11,20 @@ mailbox.Maildir.colon = '!'
FLAGS = re.compile(rb'FLAGS \(([^)]+?)\)')
+def percent_encode(c: str) -> str:
+ return '%' + hex(ord(c))[2:]
+
def clean_folder_name(folder_name: str, separator: str) -> str:
- return folder_name.replace('.', '-').replace(separator, '.').replace('/', '-')
+ folder_name = folder_name.replace('%', percent_encode('%'))
+ folder_name = folder_name.replace('.', percent_encode('.'))
+ folder_name = folder_name.replace(separator, '.')
+ return folder_name
+
+def dirty_folder_name(folder_name: str, separator: str = '/') -> str:
+ folder_name = folder_name.replace('.', separator)
+ folder_name = folder_name.replace(percent_encode('.'), '.')
+ folder_name = folder_name.replace(percent_encode('%'), '%')
+ return folder_name
class Account:
def __init__(self, address: str, info: dict):
@@ -21,15 +33,20 @@ class Account:
self.address = address
self.mailbox = mailbox.Maildir(data_dir / address)
self.info = info
+ self.connection = imaplib.IMAP4_SSL(self.info['imap host'])
+ self.connection.login(self.address, self.info['password'])
+
+ def __del__(self):
+ self.connection.logout()
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))
+ folder_list: List[bytes]
+ typ, folder_list = self.connection.list()
+ for folder in folder_list:
+ folder_info = imap_response.List.parse(folder)
+ if folder_info.delimiter != '/':
+ raise NotImplementedError(f'who the hell uses {repr(folder_info.delimiter)} as a delimiter')
+ 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: