aboutsummaryrefslogtreecommitdiff
path: root/ctec/logic.py
blob: 7afd78a2c69fd6405a5445e95153b4bd71192459 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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')