From a2969be439179f23e222d4c39fdf7885c715d209 Mon Sep 17 00:00:00 2001 From: Maximilian Friedersdorff Date: Thu, 12 Dec 2019 18:33:23 +0000 Subject: [PATCH] Acknowledge receipt of help messages --- remindme.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100755 remindme.py diff --git a/remindme.py b/remindme.py new file mode 100755 index 0000000..d3aee89 --- /dev/null +++ b/remindme.py @@ -0,0 +1,83 @@ +#!/bin/env/python3 +import os +import email +from datetime import datetime + +from imapclient import IMAPClient +from smtplib import SMTP_SSL + +from dateutil.parser import parse as d_parse +from cron_descriptor import get_description +from croniter import croniter + + +help_text = """ +A very comprehensive help text +""" + + +def ack_message(uid, message, client): + msg = email.message_from_bytes(message[b"RFC822"]) + if msg.is_multipart(): + print("Deleting multipart message") + return None, True + client.delete_messages([uid]) + + payload = msg.get_payload().strip() + if payload.startswith("help"): + print("We should help") + reply = email.message.EmailMessage() + reply.set_content(help_text) + reply["Subject"] = f"Help for remindme service (was {msg['Subject']})" + reply["Message-ID"] = email.utils.make_msgid() + reply["In-Reply-To"] = msg["Message-ID"] + reply["References"] = msg["Message-ID"] + reply["To"] = msg["Reply-To"] or msg["From"] + reply["From"] = "remindme@friedersdorff.com" + return reply, True + if payload.startswith("repeat"): + try: + print(get_description(payload)) + it = croniter(payload, datetime.now()) + print(it.get_next(datetime)) + except Exception as e: + print("Invalid Cron: ", e) + return None, False + + date = d_parse(payload) + print(date) + + return None, False + + +def main(): + mhost = "mail.friedersdorff.com" + user = os.environ["REMINDME_USERNAME"] + passwd = os.environ["REMINDME_PASS"] + with IMAPClient(host=mhost) as iclient, SMTP_SSL(mhost) as sclient: + print("Inside context manager") + iclient.login(user, passwd) + sclient.login(user, passwd) + iclient.select_folder("INBOX") + + unseen_msgs = iclient.fetch(iclient.search(["UNSEEN"]), 'RFC822') + for uid, message in unseen_msgs.items(): + print(uid) + reply, delete = ack_message(uid, message, iclient) + + try: + if reply: + print("Replying to message") + print("reply") + sclient.send_message(reply) + if delete: + print("Deleting message") + #iclient.delete_messages([uid]) + else: + print("Setting msg as seen") + #iclient.set_flags([uid], [r"\SEEN"]) + except Exception as e: + print("An error occured", e) + +if __name__ == "__main__": + main()