import imaplib import pathlib import time import os from secrets import token_urlsafe try: import imap_settings as settings except: raise ValueError("Imap settings file not found, please check the readme") def connect(): "connect to the IMAP server Inbox" server = imaplib.IMAP4_SSL(settings.IMAP_HOST) server.login(settings.IMAP_USER, settings.IMAP_PWD) tmp, data = server.select('Inbox') # When you connect to the inbox one of the parameters returned is the # current number of messages in it if os.environ.get('NUMMESSAGES') is None: os.environ["NUMMESSAGES"] = data[0].decode("UTF-8") return server def bytesmessage_to_string(msg): "converts bytes-like message to string" if type(msg) is bytes: msg = msg.decode("UTF-8").rstrip() return msg else: return str(msg) def send(inbox, msg): "send msg to inbox in MIME format" server = connect() tmp, data = server.append(inbox, flags='', date_time=time.time(), message=str(msg).encode("UTF-8")) server.close() def recv_all(): """receive a list of all MIME messages from inbox newer than the last message when first connected""" server = connect() r = [] tmp, data = server.search(None, 'ALL') oldermsgid = os.environ.get('NUMMESSAGES') for num in data[0].split(): if int(num) >= int(oldermsgid): tmp, data = server.fetch(num, '(RFC822)') msg = bytesmessage_to_string(data[0][1]) r.append((num, msg)) os.environ["NUMMESSAGES"] = num.decode("UTF-8") server.close() return r def clean_inbox(): """clean all messsages from IMAP inbox""" print('cleaning IMAP...') server = connect() tmp, data = server.search(None, 'ALL') for num in data[0].split(): server.store(num, '+FLAGS', '\\Deleted') server.expunge() server.close() print('IMAP inbox empty.') def backup_inbox(): """copy all messsages from IMAP to local backup folder""" server = connect() tmp, data = server.search(None, 'ALL') for num in data[0].split(): tmp, data = server.fetch(num, '(RFC822 BODY[HEADER])') device = str(data[0][1]).split('From: "')[1].split(' of')[0] name = device + "_" + token_urlsafe(16) + ".eml" msg = bytesmessage_to_string(data[0][1]) with open(os.path.join('Backup/TestInbox',name), "wb") as f: f.write(str(msg).encode()) server.close() def restore_inbox(): """copy all the messages from the Backup folder to the IMAP inbox""" server = connect() backups = pathlib.Path("./Backup/TestInbox") emails = backups.glob("*.eml") l = [ path for path in emails ] for p in l: with open(p, "rb") as f: tmp, data = server.append("Inbox", flags='', date_time=p.stat().st_ctime, message=f.read(-1)) server.close()