Ich hab da mal was gebastelt
Demo Seite: https://www.niederastroth.de/gbdemo/


Code: Alles auswählen
var currentAdminKey = currentSection ? String(currentSection.getAttribute('data-admin-key')).trim() : 'volker04';Also Passwort, Eure E-Mail und die URL zum Gästebuch. Das ist alles. Die API sollte dann aber auch im selben Verzeichnis sein wie das Gästebuch !//EINSTELLUNGEN
$adminPassword = 'volker04';
$adminEmail = 'volker@niederastroth.de'; // <-- DEINE MAIL-ADRESSE!
$websiteUrl = 'https://www.niederastroth.de/gbdemo/'; // <-- URL ZU DEINEM GB-ORDNER!


Code: Alles auswählen
<?php
// guestbook-api.php - Intelligente Hybrid-Mail (SMTP / PHP-Mail) & Admin-Modus
header('Content-Type: application/json; charset=utf-8');
date_default_timezone_set('Europe/Berlin');
// 🔒 Konfiguration
$apiPassword = 'volker04'; // Dein Admin-Passwort für den Doppelklick
$adminEmail = 'info@niederastroth.de'; // Deine Empfänger-Adresse
$websiteUrl = 'https://www.niederastroth.de/gbdemo/'; // URL zu diesem Ordner (für den Freischaltlink)
// 📧 SMTP KONFIGURATION (Leer lassen, wenn du normales PHP-Mail nutzen willst!)
define('SMTP_HOST', 'smtp.niederastroth.de'); // z.B. smtp.niederastroth.de
define('SMTP_PORT', 465); // 465 (SSL) oder 587 (TLS)
define('SMTP_CRYPT', 'ssl'); // 'ssl', 'tls' oder ''
define('SMTP_USER', 'info@niederastroth.de'); // Deine SMTP-Mailadresse
define('SMTP_PASS', 'DEIN_SMTP_PASSWORT'); // Dein echtes Mail-Passwort (leer lassen für PHP-Mail)
$dbFile = 'gaestebuch.db';
try {
$db = new PDO('sqlite:' . __DIR__ . '/' . $dbFile);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec("CREATE TABLE IF NOT EXISTS entries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
message TEXT NOT NULL,
status INTEGER DEFAULT 0,
created_at TEXT NOT NULL
)");
} catch (PDOException $e) {
echo json_encode(['success' => false, 'error' => 'Datenbankfehler: ' . $e->getMessage()]);
exit;
}
// GET-ANFRAGEN: Einträge laden oder Freischaltung per E-Mail-Link
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// Fall A: Freischaltung über den Link aus der E-Mail
if (isset($_GET['action']) && $_GET['action'] === 'approve') {
$id = intval($_GET['id'] ?? 0);
$hash = $_GET['hash'] ?? '';
if ($hash === md5($id . $apiPassword)) {
$stmt = $db->prepare("UPDATE entries SET status = 1 WHERE id = ?");
$stmt->execute([$id]);
header("Content-Type: text/html; charset=UTF-8");
echo "<html><head><title>Erfolg</title></head><body style='font-family:Arial,sans-serif;text-align:center;padding-top:80px;background:#f8fafc;color:#0f172a;'>";
echo "<div style='display:inline-block;background:#fff;padding:40px;border-radius:14px;box-shadow:0 4px 20px rgba(0,0,0,0.05);'>";
echo "<h2 style='color:#22c55e;'>🎉 Eintrag erfolgreich freigeschaltet!</h2>";
echo "<p>Der Beitrag ist ab jetzt live für alle Besucher sichtbar.</p>";
echo "</div></body></html>";
exit;
} else {
header("Content-Type: text/html; charset=UTF-8");
die("<h3>Ungültiger Freischalt-Code.</h3>");
}
}
// Fall B: Normale Einträge für das Gästebuch laden
$isAdmin = false;
if (isset($_GET['adminCheck']) && $_GET['adminCheck'] === $apiPassword) {
$isAdmin = true;
}
if ($isAdmin) {
$stmt = $db->query("SELECT * FROM entries ORDER BY created_at DESC");
} else {
$stmt = $db->query("SELECT * FROM entries WHERE status = 1 ORDER BY created_at DESC");
}
$entries = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode(['success' => true, 'entries' => $entries]);
exit;
}
// POST-ANFRAGEN: Eintragen, Löschen, Bearbeiten, Login-Prüfung
$input = json_decode(file_get_contents('php://input'), true);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($input['action']) && $input['action'] === 'checkLogin') {
if (isset($input['password']) && $input['password'] === $apiPassword) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'error' => 'Falsches Passwort!']);
}
exit;
}
if (isset($input['action']) && $input['action'] === 'delete') {
if (!isset($input['password']) || $input['password'] !== $apiPassword) {
echo json_encode(['success' => false, 'error' => 'Nicht autorisiert!']);
exit;
}
$stmt = $db->prepare("DELETE FROM entries WHERE id = ?");
$stmt->execute([$input['id']]);
echo json_encode(['success' => true]);
exit;
}
if (isset($input['action']) && $input['action'] === 'update') {
if (!isset($input['password']) || $input['password'] !== $apiPassword) {
echo json_encode(['success' => false, 'error' => 'Nicht autorisiert!']);
exit;
}
$stmt = $db->prepare("UPDATE entries SET message = ? WHERE id = ?");
$stmt->execute([$input['message'], $input['id']]);
echo json_encode(['success' => true]);
exit;
}
// Neuer Eintrag verfassen
if (isset($input['name']) && isset($input['message'])) {
$name = trim(htmlspecialchars($input['name']));
$message = trim(htmlspecialchars($input['message']));
if (empty($name) || empty($message)) {
echo json_encode(['success' => false, 'error' => 'Bitte alle Felder ausfüllen.']);
exit;
}
$stmt = $db->prepare("INSERT INTO entries (name, message, created_at, status) VALUES (?, ?, ?, 0)");
$timestamp = date('Y-m-d H:i:s');
$stmt->execute([$name, $message, $timestamp]);
$lastId = $db->lastInsertId();
// Freischalt-Link generieren
$approveHash = md5($lastId . $apiPassword);
$approveLink = $websiteUrl . "guestbook-api.php?action=approve&id=" . $lastId . "&hash=" . $approveHash;
$subject = "Neuer Gästebucheintrag von " . $name;
$mailBody = "Hallo Admin,\n\nein neuer Eintrag wartet auf Freischaltung:\n\nName: $name\nNachricht:\n$message\n\nKlicke auf den folgenden Link, um den Eintrag sofort zu veröffentlichen:\n" . $approveLink . "\n\nGruß dein Server.";
// 🔀 DIE ENTWEDER-ODER-SCHLEIFE (Wählt vollautomatisch den richtigen Weg)
if (SMTP_PASS !== 'DEIN_SMTP_PASSWORT' && SMTP_PASS !== '') {
sendHybridSMTP($adminEmail, $subject, $mailBody);
} else {
$headers = "From: no-reply@" . $_SERVER['HTTP_HOST'] . "\r\n" . "Content-Type: text/plain; charset=UTF-8";
@mail($adminEmail, $subject, $mailBody, $headers);
}
echo json_encode(['success' => true]);
exit;
}
}
// NATIVE SMTP SOCKET ENGINE
function sendHybridSMTP($to, $subject, $body) {
$host = SMTP_CRYPT === 'ssl' ? 'ssl://' . SMTP_HOST : SMTP_HOST;
$socket = @fsockopen($host, SMTP_PORT, $errno, $errstr, 10);
if (!$socket) return false;
function parseResponse($socket) {
$res = "";
while (($str = fgets($socket, 515)) !== false) {
$res .= $str;
if (substr($str, 3, 1) == " ") break;
}
return $res;
}
parseResponse($socket);
fwrite($socket, "EHLO " . $_SERVER['SERVER_NAME'] . "\r\n");
parseResponse($socket);
if (SMTP_CRYPT === 'tls') {
fwrite($socket, "STARTTLS\r\n");
parseResponse($socket);
stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
fwrite($socket, "EHLO " . $_SERVER['SERVER_NAME'] . "\r\n");
parseResponse($socket);
}
fwrite($socket, "AUTH LOGIN\r\n");
parseResponse($socket);
fwrite($socket, base64_encode(SMTP_USER) . "\r\n");
parseResponse($socket);
fwrite($socket, base64_encode(SMTP_PASS) . "\r\n");
parseResponse($socket);
fwrite($socket, "MAIL FROM: <" . SMTP_USER . ">\r\n");
parseResponse($socket);
fwrite($socket, "RCPT TO: <" . $to . ">\r\n");
parseResponse($socket);
fwrite($socket, "DATA\r\n");
parseResponse($socket);
$headers = "MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\n";
$headers .= "From: <" . SMTP_USER . ">\r\nTo: <" . $to . ">\r\nSubject: =?UTF-8?B?" . base64_encode($subject) . "?=\r\n";
fwrite($socket, $headers . "\r\n" . $body . "\r\n.\r\n");
parseResponse($socket);
fwrite($socket, "QUIT\r\n");
fclose($socket);
return true;
}
?>


Code: Alles auswählen
<?php
// =========================================================================
// guestbook-api.php - Vollständige Hybrid-Version (SMTP/Mail) mit Inline-Editor
// =========================================================================
header('Content-Type: application/json; charset=utf-8');
date_default_timezone_set('Europe/Berlin');
// 🔒 1. DEIN ADMIN-PASSWORT FÜR BROWSER-LOGIN (DOPPELKLICK)
$apiPassword = 'volker04';
// 📧 2. SMTP & MAIL EMPFÄNGER CONFIGURATION
$adminEmail = 'info@niederastroth.de';
$websiteUrl = 'https://www.niederastroth.de/gbdemo/'; // Wichtig für den Freischaltlink!
define('SMTP_HOST', 'smtp.niederastroth.de');
define('SMTP_PORT', 465); // 465 (SSL) oder 587 (TLS)
define('SMTP_CRYPT', 'ssl'); // 'ssl', 'tls' oder ''
define('SMTP_USER', 'info@niederastroth.de');
define('SMTP_PASS', 'DEIN_SMTP_PASSWORT'); // Echte Zugangsdaten eintragen (oder leer lassen für PHP mail)
// =========================================================================
// AB HIER NIX MEHR ÄNDERN - DIESER TEIL LÄUFT VOLLAUTOMATISCH
// =========================================================================
$dbFile = 'gaestebuch.db';
try {
$db = new PDO('sqlite:' . __DIR__ . '/' . $dbFile);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec("CREATE TABLE IF NOT EXISTS entries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
message TEXT NOT NULL,
status INTEGER DEFAULT 0,
created_at TEXT NOT NULL
)");
} catch (PDOException $e) {
echo json_encode(['success' => false, 'error' => 'Datenbankfehler: ' . $e->getMessage()]);
exit;
}
// 🌐 GET-ANFRAGEN: Einträge laden oder E-Mail-Freischaltung abfangen
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// Fall A: Freischaltung über den E-Mail-Link
if (isset($_GET['action']) && $_GET['action'] === 'approve') {
$id = intval($_GET['id'] ?? 0);
$hash = $_GET['hash'] ?? '';
if ($hash === md5($id . $apiPassword)) {
$stmt = $db->prepare("UPDATE entries SET status = 1 WHERE id = ?");
$stmt->execute([$id]);
header("Content-Type: text/html; charset=UTF-8");
echo "<html><head><title>Erfolg</title></head><body style='font-family:Arial,sans-serif;text-align:center;padding-top:80px;background:#f8fafc;color:#0f172a;'>";
echo "<div style='display:inline-block;background:#fff;padding:40px;border-radius:14px;box-shadow:0 4px 20px rgba(0,0,0,0.05);'>";
echo "<h2 style='color:#22c55e;'>🎉 Eintrag erfolgreich freigeschaltet!</h2>";
echo "<p>Der Beitrag ist ab jetzt live für alle Besucher sichtbar.</p>";
echo "</div></body></html>";
exit;
} else {
header("Content-Type: text/html; charset=UTF-8");
die("<h3>Ungültiger Freischalt-Code.</h3>");
}
}
// Fall B: Einträge für das Gästebuch laden (Prüfung gegen das Admin-Passwort)
$isAdmin = false;
if (isset($_GET['adminCheck']) && $_GET['adminCheck'] === $apiPassword) {
$isAdmin = true;
}
if ($isAdmin) {
$stmt = $db->query("SELECT * FROM entries ORDER BY created_at DESC");
} else {
$stmt = $db->query("SELECT * FROM entries WHERE status = 1 ORDER BY created_at DESC");
}
$entries = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode(['success' => true, 'entries' => $entries]);
exit;
}
// 🛠️ POST-ANFRAGEN: Formular absenden, Löschen, Editieren, Login prüfen
$input = json_decode(file_get_contents('php://input'), true);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Admin Login-Prüfung (Doppelklick-Event)
if (isset($input['action']) && $input['action'] === 'checkLogin') {
if (isset($input['password']) && $input['password'] === $apiPassword) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'error' => 'Falsches Passwort!']);
}
exit;
}
// Eintrag löschen
if (isset($input['action']) && $input['action'] === 'delete') {
if (!isset($input['password']) || $input['password'] !== $apiPassword) {
echo json_encode(['success' => false, 'error' => 'Nicht autorisiert!']);
exit;
}
$stmt = $db->prepare("DELETE FROM entries WHERE id = ?");
$stmt->execute([$input['id']]);
echo json_encode(['success' => true]);
exit;
}
// Eintrag editieren (Inline-Update)
if (isset($input['action']) && $input['action'] === 'update') {
if (!isset($input['password']) || $input['password'] !== $apiPassword) {
echo json_encode(['success' => false, 'error' => 'Nicht autorisiert!']);
exit;
}
$stmt = $db->prepare("UPDATE entries SET message = ? WHERE id = ?");
$stmt->execute([$input['message'], $input['id']]);
echo json_encode(['success' => true]);
exit;
}
// Neuen Eintrag verarbeiten (Erhält status = 0)
if (isset($input['name']) && isset($input['message'])) {
$name = trim(htmlspecialchars($input['name']));
$message = trim(htmlspecialchars($input['message']));
if (empty($name) || empty($message)) {
echo json_encode(['success' => false, 'error' => 'Bitte alle Felder ausfüllen.']);
exit;
}
$stmt = $db->prepare("INSERT INTO entries (name, message, created_at, status) VALUES (?, ?, ?, 0)");
$timestamp = date('Y-m-d H:i:s');
$stmt->execute([$name, $message, $timestamp]);
$lastId = $db->lastInsertId();
// Absicherung für Freischalt-Link bauen
$approveHash = md5($lastId . $apiPassword);
$approveLink = $websiteUrl . "guestbook-api.php?action=approve&id=" . $lastId . "&hash=" . $approveHash;
$subject = "Neuer Gästebucheintrag von " . $name;
$mailBody = "Hallo Admin,\n\nein neuer Eintrag wartet auf Freischaltung:\n\nName: $name\nNachricht:\n$message\n\nKlicke auf den folgenden Link, um den Eintrag sofort zu veröffentlichen:\n" . $approveLink . "\n\nGruß dein Server.";
// Vollautomatische SMTP-Erkennungsschleife
if (SMTP_PASS !== 'DEIN_SMTP_PASSWORT' && SMTP_PASS !== '') {
sendHybridSMTP($adminEmail, $subject, $mailBody);
} else {
$headers = "From: no-reply@" . $_SERVER['HTTP_HOST'] . "\r\n" . "Content-Type: text/plain; charset=UTF-8";
@mail($adminEmail, $subject, $mailBody, $headers);
}
echo json_encode(['success' => true]);
exit;
}
}
// 🌐 INTUATIVE SOCKET SMTP ENGINE
function sendHybridSMTP($to, $subject, $body) {
$host = SMTP_CRYPT === 'ssl' ? 'ssl://' . SMTP_HOST : SMTP_HOST;
$socket = @fsockopen($host, SMTP_PORT, $errno, $errstr, 10);
if (!$socket) return false;
function parseResponse($socket) {
$res = "";
while (($str = fgets($socket, 515)) !== false) {
$res .= $str;
if (substr($str, 3, 1) == " ") break;
}
return $res;
}
parseResponse($socket);
fwrite($socket, "EHLO " . $_SERVER['SERVER_NAME'] . "\r\n");
parseResponse($socket);
if (SMTP_CRYPT === 'tls') {
fwrite($socket, "STARTTLS\r\n");
parseResponse($socket);
stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
fwrite($socket, "EHLO " . $_SERVER['SERVER_NAME'] . "\r\n");
parseResponse($socket);
}
fwrite($socket, "AUTH LOGIN\r\n");
parseResponse($socket);
fwrite($socket, base64_encode(SMTP_USER) . "\r\n");
parseResponse($socket);
fwrite($socket, base64_encode(SMTP_PASS) . "\r\n");
parseResponse($socket);
fwrite($socket, "MAIL FROM: <" . SMTP_USER . ">\r\n");
parseResponse($socket);
fwrite($socket, "RCPT TO: <" . $to . ">\r\n");
parseResponse($socket);
fwrite($socket, "DATA\r\n");
parseResponse($socket);
$headers = "MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\n";
$headers .= "From: <" . SMTP_USER . ">\r\nTo: <" . $to . ">\r\nSubject: =?UTF-8?B?" . base64_encode($subject) . "?=\r\n";
fwrite($socket, $headers . "\r\n" . $body . "\r\n.\r\n");
parseResponse($socket);
fwrite($socket, "QUIT\r\n");
fclose($socket);
return true;
}
?>

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast