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: