aboutsummaryrefslogtreecommitdiff
path: root/ctec/logic.py
diff options
context:
space:
mode:
Diffstat (limited to 'ctec/logic.py')
-rw-r--r--ctec/logic.py49
1 files changed, 49 insertions, 0 deletions
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')