From 3f2e142d2c9b1e46faee988111abaffea946ce6a Mon Sep 17 00:00:00 2001 From: Mark Powers Date: Sun, 20 Sep 2020 02:09:44 +0000 Subject: Add imap to email_helper, add reminders in daily-update --- email_helper.py | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) (limited to 'email_helper.py') diff --git a/email_helper.py b/email_helper.py index d3edfb8..84440ea 100644 --- a/email_helper.py +++ b/email_helper.py @@ -1,6 +1,9 @@ import smtplib +import imaplib +import email from email.mime.text import MIMEText from email.utils import formatdate +from email.header import decode_header from config import config @@ -26,3 +29,71 @@ def send(frm, name, to, subject, body, subtype="plain"): print("error") print(e) +def get_subject(msg): + subject = decode_header(msg["Subject"])[0][0] + if isinstance(subject, bytes): + subject = subject.decode() + return subject + +def get_body(msg): + if msg.is_multipart(): + body = "" + for part in msg.walk(): + try: + # get the email body + body += part.get_payload(decode=True).decode() + except: + pass + else: + body = msg.get_payload(decode=True).decode() + return body + +def get_from(msg): + return msg.get("From") + +def get_content_type(msg): + return msg.get_content_type() + +def set_unseen(imap, idx): + imap.store(idx, '-FLAGS', '\\SEEN') + +def get_what(msg, what): + if what == "subject": + return get_subject(msg) + elif what == "body": + return get_body(msg) + elif what == "from": + return get_from(msg) + elif what == "content_type": + return get_content_type + +def parse(imap, index, check_what, criteria, return_what): + res, msg = imap.fetch(index, "(RFC822)") + for response in msg: + if isinstance(response, tuple): + msg = email.message_from_bytes(response[1]) + if criteria in get_what(msg, check_what): + return get_what(msg, return_what) + +def filter_unread(check_what, criteria, return_what): + """ check if the field 'check_what' contains the given criteria, and if so return a list + of the field 'return_what' + """ + imap = imaplib.IMAP4_SSL(config["email"]["server"]) + imap.login(config["email"]["user"], config["email"]["pass"]) + status, messages = imap.select("INBOX") + + status, response = imap.search(None, '(UNSEEN)') + unread_msg_nums = response[0].split() + + ret = [] + for i in unread_msg_nums: + parse_return = parse(imap, i, check_what, criteria, return_what) + if parse_return is not None: + ret.append(parse_return) + set_unseen(imap, i) + imap.close() + imap.logout() + + return ret + -- cgit v1.2.3