diff options
Diffstat (limited to 'email_helper.py')
-rw-r--r-- | email_helper.py | 71 |
1 files changed, 71 insertions, 0 deletions
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 + |