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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XhHNJKk3RsHgUsJ27WQSom
This commit is contained in:
Stefan Lohmaier
2026-07-19 11:07:38 +02:00
co-authored by Claude Opus 4.8
parent 3ccfb80115
commit 330e0113f8
+19 -4
View File
@@ -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: