import sys import email import email.parser from imapclient import IMAPClient, exceptions from getpass import getpass from time import sleep, strftime HOST = 'imap.gmail.com' USERNAME = 'le.kebab.fase@gmail.com' PASSWORD = getpass() SSL = True REFRESH_INTERVAL = 20*60 header_parser = email.parser.BytesHeaderParser() last_mail = 0 def log(*args): print(strftime("%Y-%m-%d %H:%M:%S"), *args) def log_exception(exception): log(exception.__class__.__name__+":", exception) def log_mails(numbers): fetch = server.fetch(numbers, ['BODY.PEEK[HEADER]', 'FLAGS', 'INTERNALDATE']) for number in numbers: log_mail(fetch[number]) def log_mail(fetch): headers = header_parser.parsebytes(fetch[b'BODY[HEADER]']) flags = fetch[b'FLAGS'] name, address = email.utils.parseaddr(str(headers.get('From'))) name = email.header.make_header(email.header.decode_header(name)) subject = email.header.make_header(email.header.decode_header(str(headers.get('Subject')))) date = headers.get('Date') idate = fetch[b'INTERNALDATE'] unread = '*' if b'\\Seen' not in flags else ' ' log("New:", idate.strftime("%Y/%m/%d %H:%M"), unread, name, "<"+address+"> ", subject) while True: try: server = IMAPClient(HOST, ssl=SSL) server.login(USERNAME, PASSWORD) server.select_folder('INBOX') except exceptions.LoginError: log("Authentication failed") quit() except Exception as exception: log_exception(exception) sleep(60) continue log("Logged in") new_mails = server.search(["UID", str(last_mail+1)+":*", b'NOT', b'DELETED'])[-10::] if last_mail in new_mails: new_mails.remove(last_mail) if new_mails: log_mails(new_mails) last_mail = new_mails[-1] while True: log("Idle...") try: server.idle() responses = server.idle_check(timeout=REFRESH_INTERVAL) server.idle_done() except KeyboardInterrupt: print('\b\b', end='') log("Quitting") server.idle_done() server.logout() exit() except Exception as exception: log_exception(exception) break if responses: log("Server sent:", responses) for response in responses: if response[1] == b'EXISTS': log_mails(range(last_mail+1, response[0]+1)) last_mail = response[0] sleep(1) log("Connection closed") sleep(60)