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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user