false, 'error' => 'method_not_allowed']); } // Honeypot: echte Besucher sehen dieses Feld nicht. if (field('website', 200) !== '') { respond(200, ['ok' => true]); } // Zeitfalle: Bots senden Formulare meist sofort ab. $started = (int) ($_POST['ts'] ?? 0); if ($started > 0 && (microtime(true) * 1000 - $started) < MIN_SECONDS * 1000) { respond(200, ['ok' => true]); } $name = single_line(field('name', 120)); $email = single_line(field('email', 200)); $phone = single_line(field('phone', 60)); $place = single_line(field('place', 120)); $topic = single_line(field('topic', 120)); $message = field('message', 5000); $privacy = !empty($_POST['privacy']); $errors = []; if ($name === '') { $errors[] = 'name'; } if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { $errors[] = 'email'; } if ((function_exists('mb_strlen') ? mb_strlen($message, 'UTF-8') : strlen($message)) < 5) { $errors[] = 'message'; } if (!$privacy) { $errors[] = 'privacy'; } if ($errors) { respond(422, ['ok' => false, 'errors' => $errors]); } $subject = 'Anfrage über olzinger.de' . ($topic !== '' ? ' – ' . $topic : ''); $body = implode("\n", [ 'Neue Anfrage über das Kontaktformular auf olzinger.de', '', 'Anliegen: ' . ($topic !== '' ? $topic : '–'), 'Name: ' . $name, 'E-Mail: ' . $email, 'Telefon: ' . ($phone !== '' ? $phone : '–'), 'PLZ / Ort: ' . ($place !== '' ? $place : '–'), '', 'Nachricht:', $message, '', '—', 'Gesendet am ' . date('d.m.Y') . ' um ' . date('H:i') . ' Uhr', ]); $headers = implode("\r\n", [ 'From: Website Olzinger <' . SENDER . '>', 'Reply-To: ' . $email, 'MIME-Version: 1.0', 'Content-Type: text/plain; charset=UTF-8', 'Content-Transfer-Encoding: 8bit', 'X-Mailer: olzinger.de', ]); $encodedSubject = '=?UTF-8?B?' . base64_encode($subject) . '?='; $sent = @mail(RECIPIENT, $encodedSubject, $body, $headers, '-f' . SENDER); respond($sent ? 200 : 500, ['ok' => (bool) $sent]);