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
+45
View File
@@ -276,3 +276,48 @@ def test_bereits_gelesene_mail_wird_trotzdem_geholt(admin, monkeypatch):
ergebnis = admin.post(f"/api/mail/sources/{quelle['id']}/fetch").json()
assert ergebnis["gefunden"] == 1
assert ergebnis["neu"] == 1
def _weitergeleitet(quelldatei: str, message_id: bytes) -> bytes:
"""Baut aus einer Bank-Mail eine von Hand weitergeleitete nach.
Dabei steht die EIGENE Adresse im From, der Betreff bekommt ein „WG:“ und
der Originalkopf wandert in den Text – genau wie bei Gmail und Proton.
"""
roh = (MUSTER / quelldatei).read_bytes().decode("utf-8")
kopf, koerper = roh.split("\n\n", 1)
zitat = ("---------- Weitergeleitete Nachricht ----------\n"
"Von: noreply@ebanking.raiffeisen.ch\n"
"Betreff: Raiffeisen E-Banking - Änderung Zahlungsstatus\n\n")
neu = (
"From: Alex Muster <alex@example.com>\n"
"To: sammel@example.com\n"
"Date: Fri, 31 Jul 2026 08:00:00 +0200\n"
f"Message-Id: <{message_id.decode()}@example.invalid>\n"
"Subject: =?utf-8?Q?WG=3A_Raiffeisen_E-Banking?=\n"
"Mime-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"\n" + zitat + koerper.replace("=\n", "").replace("=C3=84", "Ä")
.replace("=C3=BC", "ü").replace("=C3=A4", "ä").replace("=C3=BC", "ü")
.replace("=C3=BCber", "über").replace("Beg=C3=BCnstigter", "Begünstigter")
.replace("Ausf=C3=BChrungsdatum", "Ausführungsdatum")
)
return neu.encode("utf-8")
def test_von_hand_weitergeleitete_mail_wird_am_betreff_erkannt(admin, monkeypatch):
"""Der Nutzer trägt „raiffeisen“ ein – das steht bei einer manuellen
Weiterleitung im Betreff, nicht im Absender. Genau dort muss es greifen."""
konto = _konto(admin)
quelle = _postfach(admin)
admin.post(f"/api/mail/sources/{quelle['id']}/senders", json={
"from_contains": "raiffeisen", "account_id": konto["id"]})
monkeypatch.setattr(mail_import, "_verbinden",
lambda q: FakeImap([_weitergeleitet("raiffeisen_zahlungsstatus.eml", b"wg-1")]))
ergebnis = admin.post(f"/api/mail/sources/{quelle['id']}/fetch").json()
assert ergebnis["neu"] == 1, ergebnis
treffer = [e for e in admin.get("/api/inbox").json() if e["payee"] == "Sunrise GmbH / Yallo"]
assert treffer, "Die Werte müssen auch aus der weitergeleiteten Mail lesbar sein"
assert treffer[0]["amount_cents"] == -1490