From 330e0113f8996f697cd5fac0150934f81099c8f8 Mon Sep 17 00:00:00 2001 From: Stefan Lohmaier Date: Sun, 19 Jul 2026 11:07:38 +0200 Subject: [PATCH] perf(mail): Roh-Byte-Vorfilter in search_mail -- grep-Tempo ueber grosse Maildirs Nur Mails voll parsen, deren Rohtext den Suchbegriff enthaelt. Suche ueber ~13k Mails jetzt ~17s statt >120s (Deadline) und findet auch grosse Ordner (Trash). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01XhHNJKk3RsHgUsJ27WQSom --- mail/server.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/mail/server.py b/mail/server.py index af42387..ca053b1 100644 --- a/mail/server.py +++ b/mail/server.py @@ -248,12 +248,30 @@ def search_mail( md = _open_folder(acct_path, fld) if not md: continue - for key, msg in _iter_messages(md): + qbytes = query_lower.encode("utf-8", "ignore") + try: + keys = list(md.keys()) + except Exception: + keys = [] + for key in keys: + if time.monotonic() - t0 > DEADLINE_S: + truncated = True + break + # Schneller Roh-Byte-Vorfilter: nur Mails voll parsen, die den + # Suchbegriff im Rohtext enthalten (grep-Tempo statt 13k Voll-Parses). try: + raw = md.get_bytes(key) + except Exception: + continue + if qbytes not in raw.lower(): + continue + try: + msg = md.get_message(key) subj = _decode_hdr(msg.get("Subject", "")) frm = _decode_hdr(msg.get("From", "")) to = _decode_hdr(msg.get("To", "")) date_str = msg.get("Date", "") + # Bestaetigen ueber dekodierte Header ODER Body (Roh-Treffer verifizieren) if query_lower not in f"{subj} {frm} {to}".lower(): if query_lower not in _get_body(msg).lower(): continue @@ -263,9 +281,6 @@ def search_mail( if len(matches) >= MAX_SCAN: truncated = True break - if time.monotonic() - t0 > DEADLINE_S: - truncated = True - break if truncated: break if truncated: