Files
hermes-recovery/scripts/watch-shonuff-inbox.py
T

79 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""Check shonuff@germainebrown.com inbox for new messages from unknown senders.
Silent if nothing new. Alerts if someone other than Germaine has emailed.
"""
import imaplib, email, os, json, hashlib
from datetime import datetime, timezone
HOST = "mail.germainebrown.com"
PORT = 993
USER = "shonuff@germainebrown.com"
PW = "Catches.bullets1985"
SEEN_FILE = "/root/.hermes/scripts/.shonuff-seen.json"
TRUSTED = ["g@germainebrown.com", "mailer-daemon@heracles.mxrouting.net"]
def load_seen():
if os.path.exists(SEEN_FILE):
return set(json.load(open(SEEN_FILE)))
return set()
def save_seen(seen):
json.dump(list(seen), open(SEEN_FILE, "w"))
def main():
seen = load_seen()
new_alerts = []
try:
conn = imaplib.IMAP4_SSL(HOST, PORT)
conn.login(USER, PW)
conn.select("INBOX")
status, data = conn.search(None, "UNSEEN")
if status != "OK" or not data[0]:
conn.logout()
save_seen(seen)
return # silent — nothing new
for num in data[0].split():
status, msg_data = conn.fetch(num, "(RFC822)")
if status != "OK":
continue
raw = email.message_from_bytes(msg_data[0][1])
sender = raw.get("From", "").strip()
subj = raw.get("Subject", "(no subject)")
msg_id = raw.get("Message-ID", str(num))
# Skip trusted senders
trusted = any(t.lower() in sender.lower() for t in TRUSTED)
if trusted:
continue
# Skip if already reported
h = hashlib.md5(msg_id.encode()).hexdigest()
if h in seen:
continue
seen.add(h)
new_alerts.append((sender, subj))
conn.logout()
save_seen(seen)
except Exception as e:
print(f"⚠️ Sho'Nuff inbox check failed: {e}")
return
if not new_alerts:
return # silent
print(f"📬 Sho'Nuff received {len(new_alerts)} message(s) from unknown senders:\n")
for sender, subj in new_alerts:
print(f" • From: {sender}")
print(f" Subject: {subj}")
print()
if __name__ == "__main__":
main()