feat: Weitergeleitete Bank-Mails erkennen und Uebergangenes zeigen

Wer Bank-Mails in ein Sammelpostfach weiterleitet, hat im From je nach
Methode die eigene Adresse stehen. Geprueft werden deshalb auch Reply-To,
Return-Path, Sender und X-Forwarded-For – bei automatischer Weiterleitung
bleibt der Originalabsender dort erhalten.

Ausserdem meldet der Abruf jetzt, welche Mails er uebergangen hat, mit
Absender und Betreff. Beim Einrichten war das sonst Raten: Man sah nur
"3 uebersprungen" und wusste nicht, was in den Filter gehoert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-22 20:23:35 +02:00
co-authored by Claude Opus 5
parent 31f550901a
commit f3a08f2937
5 changed files with 84 additions and 5 deletions
+3 -1
View File
@@ -529,6 +529,8 @@
"secNone": "keine",
"secNoneWarn": "Ohne Verschlüsselung gehen Benutzername und Passwort im Klartext über das Netz. Nur sinnvoll, wenn der Mailserver auf demselben Rechner läuft.",
"addSender": "Absender zuordnen",
"edit": "Postfach bearbeiten"
"edit": "Postfach bearbeiten",
"skippedTitle": "Diese Mails wurden übergangen",
"skippedHint": "Für sie passt keine Absender-Zuordnung. Trag einen Teil der Adresse oder des Betreffs unten ein, dann werden sie beim nächsten Abruf übernommen."
}
}
+3 -1
View File
@@ -529,6 +529,8 @@
"secNone": "none",
"secNoneWarn": "Without encryption the username and password travel in clear text. Only sensible when the mail server runs on the same machine.",
"addSender": "Map sender",
"edit": "Edit mailbox"
"edit": "Edit mailbox",
"skippedTitle": "These emails were skipped",
"skippedHint": "No sender mapping matched them. Enter part of the address or the subject below and they will be picked up on the next fetch."
}
}
+15
View File
@@ -32,6 +32,9 @@ export default function Postfaecher() {
const [ordner, setOrdner] = useState(null); // Ergebnis des Verbindungstests
const [absender, setAbsender] = useState({});
const [busy, setBusy] = useState(false);
// Was beim letzten Abruf durchgefallen ist – beim Einrichten die einzige
// Möglichkeit zu sehen, was in den Absender-Filter gehört.
const [uebergangen, setUebergangen] = useState([]);
async function laden() {
try {
@@ -85,6 +88,7 @@ export default function Postfaecher() {
try {
const r = await api.fetchMailSource(quelle.id);
toast(t("mailbox.fetched", { neu: r.neu, unklar: r.unklar }));
setUebergangen(r.ohne_zuordnung || []);
laden();
} catch (e) {
toast(e.message, "error");
@@ -134,6 +138,17 @@ export default function Postfaecher() {
}).join(" · ")}
</div>
<SenderForm konten={konten} onAdd={(d) => absenderAnlegen(q, d)} t={t} />
{uebergangen.length > 0 && (
<div className="alert" style={{ display: "block", marginTop: "var(--sp-2)" }}>
<strong className="small">{t("mailbox.skippedTitle")}</strong>
<p className="muted small">{t("mailbox.skippedHint")}</p>
<ul className="muted small" style={{ paddingLeft: "1.2em", margin: 0 }}>
{uebergangen.map((m, i) => (
<li key={i} className="selectable">{m.from} — {m.subject}</li>
))}
</ul>
</div>
)}
<div className="mail-actions">
<button className="btn sm" disabled={busy} onClick={() => testen(q)}>{t("mailbox.test")}</button>
<button className="btn sm primary" disabled={busy} onClick={() => abrufen(q)}>{t("mailbox.fetchNow")}</button>