fix: Erkennungstext greift auch in Betreff und Text

Bei einer von Hand weitergeleiteten Bank-Mail steht die eigene Adresse im
From; "Raiffeisen" findet sich nur noch im Betreff ("WG: Raiffeisen …")
und im zitierten Kopf. Das Feld hiess "Absender enthaelt" und prueft nur die
Absender-Koepfe – die Mail wurde also uebergangen, obwohl das Suchwort
sichtbar darin stand. Eine Falle, kein Bedienfehler.

Gesucht wird jetzt in Absender-Koepfen, Betreff und den ersten 2000 Zeichen
des Textes; die Beschriftung heisst entsprechend "Erkennungstext". Ein Test
mit einer nachgebauten Weiterleitung haelt fest, dass sowohl die Zuordnung
greift als auch Betrag und Empfaenger daraus lesbar bleiben.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-22 20:27:54 +02:00
co-authored by Claude Opus 5
parent bfb6fa6b6d
commit 615be0f0f5
5 changed files with 73 additions and 9 deletions
+21 -5
View File
@@ -133,11 +133,27 @@ def _absenderfeld(msg) -> str:
return " ".join(t for t in teile if t)
def _passender_absender(absender: list[MailSender], von: str, betreff: str) -> MailSender | None:
"""Erste Zuordnung, deren Filter greifen. Ohne Filter passt sie auf alles."""
von_klein, betreff_klein = von.lower(), betreff.lower()
# Wie weit in den Text hinein gesucht wird. Bei einer weitergeleiteten Mail
# steht der Originalabsender im zitierten Kopf ganz oben.
ERKENNUNG_TEXTLAENGE = 2000
def _passender_absender(
absender: list[MailSender], von: str, betreff: str, text: str = ""
) -> MailSender | None:
"""Erste Zuordnung, deren Erkennungstext greift.
Gesucht wird in Absender-Köpfen, Betreff UND dem Anfang des Textes. Wer
eine Bank-Mail von Hand weiterleitet, hat im ``From`` die eigene Adresse;
„Raiffeisen“ steht dann nur noch im Betreff („WG: Raiffeisen …“) und im
zitierten Kopf. Ein Feld, das nach dem Absender fragt und Betreff wie Text
ignoriert, würde genau dort versagen – und der Nutzer säße vor einer Mail,
in der sein Suchwort sichtbar drinsteht.
"""
heu = f"{von}\n{betreff}\n{text[:ERKENNUNG_TEXTLAENGE]}".lower()
betreff_klein = betreff.lower()
for a in absender:
if a.from_contains and a.from_contains.lower() not in von_klein:
if a.from_contains and a.from_contains.lower() not in heu:
continue
if a.subject_contains and a.subject_contains.lower() not in betreff_klein:
continue
@@ -207,7 +223,7 @@ def hole_neue(db: Session, quelle: MailSource) -> dict:
betreff, text = _text_der_mail(msg)
von = _absenderfeld(msg)
zuordnung = _passender_absender(absender, von, betreff)
zuordnung = _passender_absender(absender, von, betreff, text)
if zuordnung is None:
uebersprungen += 1
if len(ohne_zuordnung) < 5: