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