aboutsummaryrefslogtreecommitdiff
path: root/email_helper.py
diff options
context:
space:
mode:
Diffstat (limited to 'email_helper.py')
-rw-r--r--email_helper.py71
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
+