From 1ec14dd7f52b4c3565b03994df6361597e063a35 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 16 Mar 2026 21:21:59 +0700 Subject: [PATCH] Mail: Spam-Filter + verschaerfter Klassifizierungs-Prompt + erweiterte Sender-Listen --- homelab-ai-bot/core/mail_client.py | 49 +++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/homelab-ai-bot/core/mail_client.py b/homelab-ai-bot/core/mail_client.py index f8cb9530..32d031b8 100644 --- a/homelab-ai-bot/core/mail_client.py +++ b/homelab-ai-bot/core/mail_client.py @@ -19,10 +19,20 @@ MAIL_USER = "" MAIL_PASS = "" IMPORTANT_SENDERS = [ - "paypal", "bank", "sparkasse", "postbank", "dkb", + "paypal", "bank", "sparkasse", "postbank", "dkb", "ing-diba", "comdirect", "hetzner", "all-inkl", "kasserver", "cloudflare", "proxmox", "synology", "tailscale", - "finanzamt", "elster", "bundesnetzagentur", + "finanzamt", "elster", "bundesnetzagentur", "polizei", "gericht", + "enbw", "vattenfall", "enso", "stadtwerke", + "sat-reisen", "lufthansa", "vietnam airlines", "booking.com", + "versicherung", "allianz", "huk", "debeka", +] + +SPAM_SENDERS = [ + "lebensfreunde", "amazon.de/promotion", "promotion@amazon", + "alibaba", "aliexpress", "temu", + "save.tv", "newsletter@bit", "magix", "video deluxe", + "platforms.ae", ] @@ -184,8 +194,13 @@ def search_mail(query: str, days: int = 30, limit: int = 15) -> list[dict]: m.logout() +def _is_spam_sender(frm_lower: str) -> bool: + """Prueft ob Absender in der Spam-Liste steht.""" + return any(s in frm_lower for s in SPAM_SENDERS) + + def get_important_mails(hours: int = 24) -> list[dict]: - """Mails von wichtigen Absendern (Bank, Hoster, etc.).""" + """Mails von wichtigen Absendern (Bank, Hoster, etc.), Spam-Sender ausgefiltert.""" m = _connect() if not m: return [{"error": "IMAP-Verbindung fehlgeschlagen"}] @@ -200,6 +215,8 @@ def get_important_mails(hours: int = 24) -> list[dict]: parsed = _parse_mail(msg_data) if parsed: frm_lower = parsed["from"].lower() + if _is_spam_sender(frm_lower): + continue if any(s in frm_lower for s in IMPORTANT_SENDERS): results.append(parsed) results.reverse() @@ -211,15 +228,25 @@ def get_important_mails(hours: int = 24) -> list[dict]: CLASSIFY_PROMPT = """Du bekommst eine Liste von E-Mails (Absender + Betreff). -Klassifiziere JEDE Mail in genau eine Kategorie: -- "wichtig": Rechnungen, Sicherheitswarnungen, Server-Alerts, Bank, Behörden, persönliche Nachrichten -- "aktion": Erfordert eine Handlung (Passwort ändern, Zahlung fällig, Termin bestätigen) -- "info": Nützliche Info aber keine Handlung nötig (Versandbestätigung, Status-Update) -- "newsletter": Newsletter, Marketing, Angebote, Werbung -- "spam": Offensichtlicher Spam, Phishing, unseriös +Klassifiziere JEDE Mail in genau eine Kategorie. Sei STRENG — im Zweifel ist es Newsletter oder Spam. -Antworte NUR mit einem JSON-Array. Pro Mail ein Objekt mit "idx" (0-basiert) und "cat" (Kategorie). -Beispiel: [{"idx":0,"cat":"newsletter"},{"idx":1,"cat":"wichtig"}]""" +Kategorien: +- "wichtig": NUR echte persoenliche Nachrichten, Rechnungen, Sicherheitswarnungen (Synology, Server), Bank-Transaktionen, Behoerden, Flugaenderungen, Vertragsrelevantes +- "aktion": Erfordert DRINGENDE Handlung (Passwort aendern, Zahlung faellig, Sicherheitsluecke, Termin bestaetigen) +- "info": Nuetzliche Info OHNE Handlungsbedarf (Versandbestaetigung, Status-Update, Ladebeleg) +- "newsletter": Regelmaessige Newsletter, Markt-Updates, Nachrichten-Digest, Fachzeitschriften, Angebote +- "spam": Werbung, Marketing, Dating-Benachrichtigungen, Phishing, unbekannte Absender mit verdaechtigem Betreff, "Du hast neue Besucher", Rabattaktionen + +WICHTIG: +- "Neue Profilbesucher", "Du hast neue Nachrichten" von Dating/Social = SPAM +- Absender mit .ae/.ru/.cn Domain ohne Bezug = SPAM +- "Sale", "Angebot", "nur noch heute", Emojis im Betreff = NEWSLETTER oder SPAM +- Taegliche Markt-/Aktien-Updates = NEWSLETTER +- Synology Sicherheitswarnungen = AKTION +- Rechnungen (EnBW, Telekom etc.) = WICHTIG + +Antworte NUR mit einem JSON-Array. Pro Mail ein Objekt mit "idx" (0-basiert) und "cat". +Beispiel: [{"idx":0,"cat":"spam"},{"idx":1,"cat":"wichtig"}]""" def classify_mails(mails: list[dict], api_key: str) -> list[dict]: