Absenderpruefung erweitern und Postfach auflisten koennen

Die Pruefung suchte woertlich nach "@paypal.de" oder "@paypal.com". Mails
aus einer Versand-Subdomain (e.paypal.de) oder einer Landesvariante
(paypal.at, paypal.co.uk) fielen damit als not_from_paypal durch. Geprueft
wird jetzt die Domain der Absenderadresse an ihrem Ende - "paypal.de.
beispiel.com" ist damit weiterhin kein PayPal, waere bei einer Textsuche
aber durchgerutscht.

check-imap-support.php listet zusaetzlich die letzten 15 Mails mit
Absender, Empfaengerzeilen und Betreff auf und sagt je Mail, ob der
Absender als PayPal gilt. Damit laesst sich ein not_from_paypal in einem
Lauf klaeren statt zu raten. Rein lesend: OP_READONLY, kein \Seen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 22:35:51 +02:00
co-authored by Claude Opus 5
parent d7de0d92cf
commit 43d0fc5578
3 changed files with 86 additions and 1 deletions
+26 -1
View File
@@ -152,6 +152,31 @@ function paypal_match_participant(PDO $pdo, int $tenantId, string $payerName, ?s
return null;
}
/**
* Stammt die Mail wirklich von PayPal? Geprueft wird die Domain der
* Absenderadresse - inklusive Landesvarianten (paypal.at, paypal.co.uk) und
* Versand-Subdomains (e.paypal.de), die PayPal tatsaechlich benutzt.
*
* Der Vergleich haengt bewusst am Ende der Domain: "paypal.de.beispiel.com"
* ist NICHT PayPal, wuerde bei einer simplen Textsuche nach "@paypal.de"
* aber durchrutschen - und damit koennte jemand mit Kenntnis der
* Eingangsadresse Zahlungen erfinden.
*/
function paypal_from_is_paypal(string $fromHeader): bool
{
if (!preg_match_all('/[\w.+-]+@([\w-]+(?:\.[\w-]+)+)/u', strtolower($fromHeader), $treffer)) {
return false;
}
foreach ($treffer[1] as $domain) {
if (preg_match('/(^|\.)paypal\.[a-z]{2,}(\.[a-z]{2,})?$/', $domain)) {
return true;
}
}
return false;
}
/**
* Gehoeren zwei Adressen zum selben Postfach? Plus-Adressierung wird dabei
* ignoriert, "zahlungen+ab12cd@host" ist also dasselbe Postfach wie
@@ -366,7 +391,7 @@ function paypal_preview(PDO $pdo, int $tenantId, array $parsed): array
*/
function paypal_process_raw(PDO $pdo, string $recipient, string $fromHeader, string $rawBody, bool $previewOnly = false): array
{
if (!preg_match('/@paypal\.(de|com)/i', $fromHeader)) {
if (!paypal_from_is_paypal($fromHeader)) {
return ['status' => 'not_from_paypal'];
}
$token = paypal_inbox_extract_token($recipient);