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) <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-23 15:41:16 +00:00
parent 7daebf32eb
commit 323024f65d
10 changed files with 24 additions and 12 deletions

View file

@ -51,6 +51,18 @@ class AboSendExecutionReminder extends Command
continue; 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) { if ($dryRun) {
$sent++; $sent++;

View file

@ -91,7 +91,7 @@ class AuthController extends Controller
{ {
$request->validate([ $request->validate([
'name' => 'required|string', 'name' => 'required|string',
'email' => 'required|string|email|unique:users', 'email' => 'required|string|email:filter|unique:users',
'password' => 'required|string|confirmed' 'password' => 'required|string|confirmed'
]); ]);
$user = new User([ $user = new User([

View file

@ -236,7 +236,7 @@ class ShoppingUserController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
$request->validate([ $request->validate([
'billing_email' => 'required|string|email', 'billing_email' => 'required|string|email:filter',
'billing_firstname' => 'required|string', 'billing_firstname' => 'required|string',
'billing_lastname' => 'required|string', 'billing_lastname' => 'required|string',
'billing_address' => 'required|string', 'billing_address' => 'required|string',

View file

@ -57,7 +57,7 @@ class RegisterController extends Controller
{ {
return Validator::make($data, [ return Validator::make($data, [
'name' => 'required|string|max:255', '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', 'password' => 'required|string|min:6|confirmed',
]); ]);
} }

View file

@ -133,7 +133,7 @@ class CustomerController extends Controller
'billing_salutation' => 'required', 'billing_salutation' => 'required',
'billing_firstname' => 'required', 'billing_firstname' => 'required',
'billing_lastname' => 'required', 'billing_lastname' => 'required',
'billing_email' => 'required|email', 'billing_email' => 'required|email:filter',
'billing_address' => 'required', 'billing_address' => 'required',
'billing_zipcode' => 'required', 'billing_zipcode' => 'required',
'billing_city' => 'required', 'billing_city' => 'required',

View file

@ -198,7 +198,7 @@ class LeadController extends Controller
'salutation' => 'required', 'salutation' => 'required',
'first_name' => 'required', 'first_name' => 'required',
'last_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', 'email-confirm' => 'required|same:email',
]; ];
} else { } else {

View file

@ -113,7 +113,7 @@ class CustomerController extends Controller
{ {
$rules = [ $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 = [ $messages = [
'unique' => __('validation.custom.unique_email_client'), 'unique' => __('validation.custom.unique_email_client'),
@ -125,7 +125,7 @@ class CustomerController extends Controller
return back()->withErrors($validator)->withInput(Request::all()); return back()->withErrors($validator)->withInput(Request::all());
} }
$rules = [ $rules = [
$email => 'required|string|email|max:255|unique:users,email', $email => 'required|string|email:filter|max:255|unique:users,email',
]; ];
$messages = [ $messages = [
'unique' => __('validation.custom.unique_email_member'), 'unique' => __('validation.custom.unique_email_member'),
@ -174,7 +174,7 @@ class CustomerController extends Controller
'billing_salutation' => 'required', 'billing_salutation' => 'required',
'billing_firstname' => 'required', 'billing_firstname' => 'required',
'billing_lastname' => 'required', 'billing_lastname' => 'required',
'billing_email' => 'required|email', 'billing_email' => 'required|email:filter',
'billing_address' => 'required', 'billing_address' => 'required',
'billing_zipcode' => 'required', 'billing_zipcode' => 'required',
'billing_city' => 'required', 'billing_city' => 'required',

View file

@ -36,7 +36,7 @@ class UserUpdateEmailController extends Controller
$user = Auth::user(); $user = Auth::user();
$rules = [ $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', // 'email-confirm' => 'required|same:email',
]; ];
@ -88,7 +88,7 @@ class UserUpdateEmailController extends Controller
]; ];
$rules = [ $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', // 'email-confirm' => 'required|same:email',
]; ];

View file

@ -265,7 +265,7 @@ class CheckoutController extends Controller
'billing_salutation' => 'required', 'billing_salutation' => 'required',
'billing_firstname' => 'required', 'billing_firstname' => 'required',
'billing_lastname' => 'required', 'billing_lastname' => 'required',
'billing_email' => 'required|email', 'billing_email' => 'required|email:filter',
'billing_address' => 'required', 'billing_address' => 'required',
'billing_zipcode' => 'required', 'billing_zipcode' => 'required',
'billing_city' => 'required', 'billing_city' => 'required',

View file

@ -82,7 +82,7 @@ class RegisterController extends Controller
'salutation' => 'required', 'salutation' => 'required',
'first_name' => 'required', 'first_name' => 'required',
'last_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', 'email-confirm' => 'required|same:email',
'password' => 'required|string|min:6|confirmed', 'password' => 'required|string|min:6|confirmed',
'password_confirmation' => 'required|string|min:6', 'password_confirmation' => 'required|string|min:6',