286 lines
8.0 KiB
PHP
286 lines
8.0 KiB
PHP
<?php
|
|
/**
|
|
* Kontaktformular Mailer für Frida & Fred
|
|
* SMTP E-Mail-Versand mit Spam-Schutz und Validierung
|
|
*/
|
|
|
|
// Output Buffering aktivieren, um saubere JSON-Antwort zu gewährleisten
|
|
ob_start();
|
|
|
|
// Fehleranzeige für Debugging (in Produktion ausschalten)
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', 0); // Wichtig: Fehler nicht direkt ausgeben
|
|
ini_set('log_errors', 1);
|
|
|
|
// PHPMailer laden
|
|
use PHPMailer\PHPMailer\PHPMailer;
|
|
use PHPMailer\PHPMailer\SMTP;
|
|
use PHPMailer\PHPMailer\Exception;
|
|
|
|
require __DIR__ . '/../vendor/autoload.php';
|
|
|
|
// Output Buffer leeren vor Session-Start
|
|
ob_clean();
|
|
|
|
// Session starten für Rate-Limiting
|
|
session_start();
|
|
|
|
// Konfiguration laden
|
|
if (!file_exists(__DIR__ . '/config.php')) {
|
|
ob_clean();
|
|
http_response_code(500);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Konfigurationsfehler. Bitte kontaktieren Sie den Administrator.'
|
|
]);
|
|
exit;
|
|
}
|
|
require_once __DIR__ . '/config.php';
|
|
|
|
// Header für JSON-Response setzen
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
|
|
// Nur POST-Requests erlauben
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
ob_clean();
|
|
http_response_code(405);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Nur POST-Requests erlaubt.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Rate-Limiting prüfen
|
|
*/
|
|
function checkRateLimit() {
|
|
if (isset($_SESSION['last_submission'])) {
|
|
$timeSinceLastSubmit = time() - $_SESSION['last_submission'];
|
|
if ($timeSinceLastSubmit < RATE_LIMIT_SECONDS) {
|
|
return [
|
|
'allowed' => false,
|
|
'wait_time' => RATE_LIMIT_SECONDS - $timeSinceLastSubmit
|
|
];
|
|
}
|
|
}
|
|
return ['allowed' => true];
|
|
}
|
|
|
|
/**
|
|
* Eingabe bereinigen und validieren
|
|
*/
|
|
function sanitizeInput($data) {
|
|
$data = trim($data);
|
|
$data = stripslashes($data);
|
|
$data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* E-Mail-Adresse validieren
|
|
*/
|
|
function validateEmail($email) {
|
|
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
|
|
}
|
|
|
|
/**
|
|
* CSRF-Token validieren (einfache Implementierung)
|
|
*/
|
|
function validateCSRF($token) {
|
|
// Erwarteter Token-Wert (sollte mit dem im Formular übereinstimmen)
|
|
return $token === 'frida-fred-csrf-2026';
|
|
}
|
|
|
|
// Rate-Limiting prüfen
|
|
$rateLimitCheck = checkRateLimit();
|
|
if (!$rateLimitCheck['allowed']) {
|
|
ob_clean();
|
|
http_response_code(429);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Bitte warten Sie ' . $rateLimitCheck['wait_time'] . ' Sekunden, bevor Sie erneut eine Nachricht senden.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
// Honeypot-Feld prüfen (sollte leer sein)
|
|
if (!empty($_POST['website'])) {
|
|
ob_clean();
|
|
http_response_code(400);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Spam erkannt.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
// CSRF-Token prüfen
|
|
if (!isset($_POST['csrf_token']) || !validateCSRF($_POST['csrf_token'])) {
|
|
ob_clean();
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Ungültiger Sicherheitstoken.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
// Formularfelder auslesen und validieren
|
|
$name = isset($_POST['name']) ? sanitizeInput($_POST['name']) : '';
|
|
$email = isset($_POST['email']) ? sanitizeInput($_POST['email']) : '';
|
|
$subject = isset($_POST['subject']) ? sanitizeInput($_POST['subject']) : '';
|
|
$message = isset($_POST['message']) ? sanitizeInput($_POST['message']) : '';
|
|
|
|
// Pflichtfelder prüfen
|
|
if (empty($name) || empty($email) || empty($subject) || empty($message)) {
|
|
ob_clean();
|
|
http_response_code(400);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Bitte füllen Sie alle erforderlichen Felder aus.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
// E-Mail-Adresse validieren
|
|
if (!validateEmail($email)) {
|
|
ob_clean();
|
|
http_response_code(400);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Bitte geben Sie eine gültige E-Mail-Adresse ein.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
// Nachrichtenlänge prüfen
|
|
if (strlen($message) > MAX_MESSAGE_LENGTH) {
|
|
ob_clean();
|
|
http_response_code(400);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Ihre Nachricht ist zu lang. Maximal ' . MAX_MESSAGE_LENGTH . ' Zeichen erlaubt.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
// E-Mail-Inhalt erstellen
|
|
$emailSubject = 'Kontaktanfrage: ' . $subject;
|
|
$emailBodyText = "Neue Kontaktanfrage über " . FORM_NAME . "\n\n";
|
|
$emailBodyText .= "Name: " . $name . "\n";
|
|
$emailBodyText .= "E-Mail: " . $email . "\n";
|
|
$emailBodyText .= "Betreff: " . $subject . "\n\n";
|
|
$emailBodyText .= "Nachricht:\n" . $message . "\n\n";
|
|
$emailBodyText .= "---\n";
|
|
$emailBodyText .= "Gesendet am: " . date('d.m.Y H:i:s') . "\n";
|
|
$emailBodyText .= "IP-Adresse: " . $_SERVER['REMOTE_ADDR'] . "\n";
|
|
|
|
// HTML-Version der E-Mail
|
|
$emailBodyHTML = '
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<style>
|
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
|
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
|
|
.header { background-color: #C4B5A0; color: white; padding: 20px; text-align: center; }
|
|
.content { background-color: #f8f7f4; padding: 20px; margin-top: 20px; }
|
|
.field { margin-bottom: 15px; }
|
|
.label { font-weight: bold; color: #2c2c2c; }
|
|
.footer { margin-top: 20px; padding-top: 20px; border-top: 1px solid #ddd; font-size: 12px; color: #666; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="header">
|
|
<h2>Neue Kontaktanfrage</h2>
|
|
</div>
|
|
<div class="content">
|
|
<div class="field">
|
|
<span class="label">Von:</span> ' . htmlspecialchars($name) . '
|
|
</div>
|
|
<div class="field">
|
|
<span class="label">E-Mail:</span> <a href="mailto:' . htmlspecialchars($email) . '">' . htmlspecialchars($email) . '</a>
|
|
</div>
|
|
<div class="field">
|
|
<span class="label">Betreff:</span> ' . htmlspecialchars($subject) . '
|
|
</div>
|
|
<div class="field">
|
|
<span class="label">Nachricht:</span><br>
|
|
' . nl2br(htmlspecialchars($message)) . '
|
|
</div>
|
|
</div>
|
|
<div class="footer">
|
|
Gesendet am: ' . date('d.m.Y H:i:s') . '<br>
|
|
IP-Adresse: ' . $_SERVER['REMOTE_ADDR'] . '
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
';
|
|
|
|
// PHPMailer-Instanz erstellen
|
|
$mail = new PHPMailer(true);
|
|
|
|
try {
|
|
// SMTP-Konfiguration
|
|
$mail->isSMTP();
|
|
$mail->Host = SMTP_HOST;
|
|
$mail->SMTPAuth = true;
|
|
$mail->Username = SMTP_USERNAME;
|
|
$mail->Password = SMTP_PASSWORD;
|
|
$mail->SMTPSecure = SMTP_SECURE;
|
|
$mail->Port = SMTP_PORT;
|
|
$mail->CharSet = 'UTF-8';
|
|
|
|
// Debug-Ausgabe deaktivieren (für Produktion)
|
|
$mail->SMTPDebug = 0;
|
|
$mail->Debugoutput = function($str, $level) {
|
|
// Debug-Ausgaben unterdrücken
|
|
};
|
|
|
|
// Absender
|
|
$mail->setFrom(SMTP_FROM_EMAIL, SMTP_FROM_NAME);
|
|
$mail->addReplyTo($email, $name);
|
|
|
|
// Empfänger
|
|
$mail->addAddress(RECIPIENT_EMAIL, RECIPIENT_NAME);
|
|
|
|
// E-Mail-Inhalt
|
|
$mail->isHTML(true);
|
|
$mail->Subject = $emailSubject;
|
|
$mail->Body = $emailBodyHTML;
|
|
$mail->AltBody = $emailBodyText;
|
|
|
|
// E-Mail senden
|
|
$mail->send();
|
|
|
|
// Zeitstempel für Rate-Limiting speichern
|
|
$_SESSION['last_submission'] = time();
|
|
|
|
// Output Buffer leeren
|
|
ob_clean();
|
|
|
|
http_response_code(200);
|
|
echo json_encode([
|
|
'success' => true,
|
|
'message' => 'Vielen Dank! Ihre Nachricht wurde erfolgreich versendet. Wir werden uns bald bei Ihnen melden.'
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
// Fehler beim E-Mail-Versand
|
|
// Output Buffer leeren
|
|
ob_clean();
|
|
|
|
http_response_code(500);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Es gab ein Problem beim Senden Ihrer Nachricht. Bitte versuchen Sie es später erneut oder kontaktieren Sie uns direkt per E-Mail.'
|
|
// 'error' => $mail->ErrorInfo // Nur für Debugging aktivieren!
|
|
]);
|
|
}
|
|
|
|
exit;
|