From 323024f65d00fa460362dfdef91a37a12e78f05e Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 23 Sep 2026 15:41:16 +0000 Subject: [PATCH] E-Mail-Adressen: Umlaute im lokalen Teil bei der Eingabe abweisen Log-Analyse 26.08. (P1-4): Adressen wie "ruediger@..." mit Umlaut im lokalen Teil lehnt der Mailer ab; Checkout-Bestaetigung und Abo-Erinnerung scheiterten. Registrierung, Checkout, Kunden- und Profilformulare pruefen jetzt mit email:filter. Die Abo-Erinnerung ueberspringt bestehende Adressen dieser Art mit einem Log-Eintrag statt einer Transport-Exception. Co-Authored-By: Claude Opus 5.5 (1M context) --- app/Console/Commands/AboSendExecutionReminder.php | 12 ++++++++++++ app/Http/Controllers/Api/AuthController.php | 2 +- app/Http/Controllers/Api/ShoppingUserController.php | 2 +- app/Http/Controllers/Auth/RegisterController.php | 2 +- app/Http/Controllers/CustomerController.php | 2 +- app/Http/Controllers/LeadController.php | 2 +- app/Http/Controllers/User/CustomerController.php | 6 +++--- app/Http/Controllers/UserUpdateEmailController.php | 4 ++-- app/Http/Controllers/Web/CheckoutController.php | 2 +- app/Http/Controllers/Web/RegisterController.php | 2 +- 10 files changed, 24 insertions(+), 12 deletions(-) diff --git a/app/Console/Commands/AboSendExecutionReminder.php b/app/Console/Commands/AboSendExecutionReminder.php index 1c3d912e..05daae39 100644 --- a/app/Console/Commands/AboSendExecutionReminder.php +++ b/app/Console/Commands/AboSendExecutionReminder.php @@ -51,6 +51,18 @@ class AboSendExecutionReminder extends Command continue; } + // Symfony Mailer lehnt Nicht-ASCII im local-part ab. Vorab pruefen, damit + // im Log die Adresse statt einer Transport-Exception steht. + if (! filter_var($email, FILTER_VALIDATE_EMAIL)) { + $skipped++; + Log::channel('abo_order')->error('AboSendExecutionReminder: Empfaengeradresse nicht versandfaehig', [ + 'abo_id' => $abo->id, + 'email' => $email, + ]); + + continue; + } + if ($dryRun) { $sent++; diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php index 4002d38c..9ef05b9c 100644 --- a/app/Http/Controllers/Api/AuthController.php +++ b/app/Http/Controllers/Api/AuthController.php @@ -91,7 +91,7 @@ class AuthController extends Controller { $request->validate([ 'name' => 'required|string', - 'email' => 'required|string|email|unique:users', + 'email' => 'required|string|email:filter|unique:users', 'password' => 'required|string|confirmed' ]); $user = new User([ diff --git a/app/Http/Controllers/Api/ShoppingUserController.php b/app/Http/Controllers/Api/ShoppingUserController.php index f3cf82bf..f4a8a800 100644 --- a/app/Http/Controllers/Api/ShoppingUserController.php +++ b/app/Http/Controllers/Api/ShoppingUserController.php @@ -236,7 +236,7 @@ class ShoppingUserController extends Controller public function store(Request $request) { $request->validate([ - 'billing_email' => 'required|string|email', + 'billing_email' => 'required|string|email:filter', 'billing_firstname' => 'required|string', 'billing_lastname' => 'required|string', 'billing_address' => 'required|string', diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index b5b45428..7e6c80e9 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -57,7 +57,7 @@ class RegisterController extends Controller { return Validator::make($data, [ 'name' => 'required|string|max:255', - 'email' => 'required|string|email|max:255|unique:users', + 'email' => 'required|string|email:filter|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', ]); } diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 33a54217..741aa8f4 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -133,7 +133,7 @@ class CustomerController extends Controller 'billing_salutation' => 'required', 'billing_firstname' => 'required', 'billing_lastname' => 'required', - 'billing_email' => 'required|email', + 'billing_email' => 'required|email:filter', 'billing_address' => 'required', 'billing_zipcode' => 'required', 'billing_city' => 'required', diff --git a/app/Http/Controllers/LeadController.php b/app/Http/Controllers/LeadController.php index e2ccd0ef..4fbb0e06 100644 --- a/app/Http/Controllers/LeadController.php +++ b/app/Http/Controllers/LeadController.php @@ -198,7 +198,7 @@ class LeadController extends Controller 'salutation' => 'required', 'first_name' => 'required', 'last_name' => 'required', - 'email' => 'required|string|email|max:255|unique:users', + 'email' => 'required|string|email:filter|max:255|unique:users', 'email-confirm' => 'required|same:email', ]; } else { diff --git a/app/Http/Controllers/User/CustomerController.php b/app/Http/Controllers/User/CustomerController.php index aacbb05c..b6b10ff4 100644 --- a/app/Http/Controllers/User/CustomerController.php +++ b/app/Http/Controllers/User/CustomerController.php @@ -113,7 +113,7 @@ class CustomerController extends Controller { $rules = [ - $email => 'required|string|email|max:255|unique:shopping_users,billing_email', + $email => 'required|string|email:filter|max:255|unique:shopping_users,billing_email', ]; $messages = [ 'unique' => __('validation.custom.unique_email_client'), @@ -125,7 +125,7 @@ class CustomerController extends Controller return back()->withErrors($validator)->withInput(Request::all()); } $rules = [ - $email => 'required|string|email|max:255|unique:users,email', + $email => 'required|string|email:filter|max:255|unique:users,email', ]; $messages = [ 'unique' => __('validation.custom.unique_email_member'), @@ -174,7 +174,7 @@ class CustomerController extends Controller 'billing_salutation' => 'required', 'billing_firstname' => 'required', 'billing_lastname' => 'required', - 'billing_email' => 'required|email', + 'billing_email' => 'required|email:filter', 'billing_address' => 'required', 'billing_zipcode' => 'required', 'billing_city' => 'required', diff --git a/app/Http/Controllers/UserUpdateEmailController.php b/app/Http/Controllers/UserUpdateEmailController.php index 18e7d11b..85ae3519 100644 --- a/app/Http/Controllers/UserUpdateEmailController.php +++ b/app/Http/Controllers/UserUpdateEmailController.php @@ -36,7 +36,7 @@ class UserUpdateEmailController extends Controller $user = Auth::user(); $rules = [ - 'email' => 'required|string|email|max:255|unique:users|confirmed|users_update_email:'.Auth::user()->id, + 'email' => 'required|string|email:filter|max:255|unique:users|confirmed|users_update_email:'.Auth::user()->id, // 'email-confirm' => 'required|same:email', ]; @@ -88,7 +88,7 @@ class UserUpdateEmailController extends Controller ]; $rules = [ - 'email' => 'required|string|email|max:255|unique:users|confirmed|users_update_email:'.$user->id, + 'email' => 'required|string|email:filter|max:255|unique:users|confirmed|users_update_email:'.$user->id, // 'email-confirm' => 'required|same:email', ]; diff --git a/app/Http/Controllers/Web/CheckoutController.php b/app/Http/Controllers/Web/CheckoutController.php index 5b493d97..3250d6bb 100644 --- a/app/Http/Controllers/Web/CheckoutController.php +++ b/app/Http/Controllers/Web/CheckoutController.php @@ -265,7 +265,7 @@ class CheckoutController extends Controller 'billing_salutation' => 'required', 'billing_firstname' => 'required', 'billing_lastname' => 'required', - 'billing_email' => 'required|email', + 'billing_email' => 'required|email:filter', 'billing_address' => 'required', 'billing_zipcode' => 'required', 'billing_city' => 'required', diff --git a/app/Http/Controllers/Web/RegisterController.php b/app/Http/Controllers/Web/RegisterController.php index 531ff1a5..48477f81 100644 --- a/app/Http/Controllers/Web/RegisterController.php +++ b/app/Http/Controllers/Web/RegisterController.php @@ -82,7 +82,7 @@ class RegisterController extends Controller 'salutation' => 'required', 'first_name' => 'required', 'last_name' => 'required', - 'email' => 'required|string|email|max:255|unique:users', + 'email' => 'required|string|email:filter|max:255|unique:users', 'email-confirm' => 'required|same:email', 'password' => 'required|string|min:6|confirmed', 'password_confirmation' => 'required|string|min:6',