Re: Gästebuch ohne Datenbank
Verfasst: Do 4. Sep 2025, 12:50
Nein - geht nicht. E-Mail wird nicht gesendet:
Forum für Mobirise und NOF
https://www.mobirise-tutorials.com/Forum/
https://www.mobirise-tutorials.com/Forum/viewtopic.php?t=1798
Code: Alles auswählen
<?php
if (mail("deine@mailadresse.de", "Testmail", "Hallo, das ist ein Test.")) {
echo "Mail wurde gesendet!";
} else {
echo "Mail konnte NICHT gesendet werden!";
}
?>
Code: Alles auswählen
// ⚠️ E-MAIL KONFIGURATION - BITTE ANPASSEN! ⚠️
$ADMIN_EMAIL = 'Tommy@MeineDomain.com'; // ← IHRE E-MAIL HIER EINTRAGEN!
$SITE_NAME = 'Gästebuch von Volker'; // ← NAME IHRER WEBSITE
$EMAIL_NOTIFICATIONS = true; // ← E-Mail-Benachrichtigungen aktiviert?
Code: Alles auswählen
<?php
session_start();
// NEU: Zeitzone festlegen, um sicherzustellen, dass die Zeit korrekt ist
date_default_timezone_set('Europe/Berlin');
// ⚠️ E-MAIL KONFIGURATION - BITTE ANPASSEN! ⚠️
$ADMIN_EMAIL = 'volker@niederastroth.de'; // ← IHRE E-MAIL HIER EINTRAGEN!
$SITE_NAME = 'Mein Gästebuch'; // ← NAME IHRER WEBSITE
$EMAIL_NOTIFICATIONS = true; // ← E-Mail-Benachrichtigungen aktiviert?
// Konfiguration
$entries_file = 'entries.json';
$pending_file = 'pending.json';
// Hilfsfunktionen
function loadEntries($file) {
if (!file_exists($file)) {
return [];
}
$content = file_get_contents($file);
return json_decode($content, true) ?: [];
}
function saveEntries($entries, $file) {
file_put_contents($file, json_encode($entries, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
function sanitizeInput($input) {
return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8');
}
// E-Mail-Funktionen
function sendAdminNotification($entry, $admin_email, $site_name) {
if (empty($admin_email) || !filter_var($admin_email, FILTER_VALIDATE_EMAIL)) {
error_log("Gästebuch: Ungültige Admin E-Mail-Adresse: $admin_email");
return false;
}
// Subject mit UTF-8 Encoding
$subject = "=?UTF-8?B?" . base64_encode("[$site_name] Neuer Gästebucheintrag wartet auf Freischaltung") . "?=";
// Admin-Link erstellen
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$admin_url = $protocol . '://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']) . '/admin.php';
// Nachricht mit UTF-8 Kodierung
$message = "Hallo Administrator,\n\n"
. "ein neuer Eintrag in Ihr Gästebuch wartet auf Freischaltung:\n\n"
. "═══════════════════════════════════════════════════════════════\n\n"
. "Name: " . $entry['name'] . "\n"
. "E-Mail: " . (!empty($entry['email']) ? $entry['email'] : 'Nicht angegeben') . "\n"
. "Datum: " . $entry['date'] . "\n\n"
. "Kommentar:\n" . $entry['comment'] . "\n\n"
. "═══════════════════════════════════════════════════════════════\n\n"
. "Freischalten können Sie den Eintrag hier:\n$admin_url\n\n"
. "Viele Grüße\nIhr Gästebuch-System";
// Feste gültige Absenderadresse verwenden
$from_address = "noreply@meinedomain.de"; // ← hier eine echte Domain eintragen!
$headers = [
'From: ' . $site_name . ' <' . $from_address . '>',
'Reply-To: ' . $from_address,
'X-Mailer: PHP/' . phpversion(),
'Content-Type: text/plain; charset=UTF-8'
];
$success = mail($admin_email, $subject, $message, implode("\r\n", $headers));
if ($success) {
error_log("Gästebuch: E-Mail erfolgreich gesendet an $admin_email");
} else {
error_log("Gästebuch: FEHLER beim E-Mail-Versand an $admin_email");
}
return $success;
}
// Verarbeitung der Formulareingaben
$message = '';
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'add_entry') {
// NEU: CAPTCHA-Prüfung hinzufügen
$captcha_input = isset($_POST['captcha']) ? sanitizeInput($_POST['captcha']) : '';
$captcha_correct = isset($_SESSION['captcha']) && strtolower($captcha_input) === strtolower($_SESSION['captcha']);
// Spam-Schutz-Prüfung (Honeypot + Zeit)
if (!empty($_POST['website']) || (time() - $_POST['form_start_time']) < 3 || !$captcha_correct) {
// Honeypot-Feld wurde ausgefüllt, Formular zu schnell übermittelt ODER CAPTCHA falsch
$error = 'Ihre Anfrage konnte nicht verarbeitet werden. Bitte stellen Sie sicher, dass das CAPTCHA korrekt ausgefüllt ist.';
} else {
$name = sanitizeInput($_POST['name']);
$email = sanitizeInput($_POST['email']);
$comment = sanitizeInput($_POST['comment']);
if (empty($name) || empty($comment)) {
$error = 'Name und Kommentar sind Pflichtfelder.';
} else {
$pending = loadEntries($pending_file);
$newEntry = [
'id' => uniqid(),
'name' => $name,
'email' => $email,
'comment' => $comment,
'date' => date('d.m.Y H:i:s')
];
$pending[] = $newEntry;
saveEntries($pending, $pending_file);
// E-Mail-Benachrichtigung an Admin senden
if ($EMAIL_NOTIFICATIONS && !empty($ADMIN_EMAIL)) {
$email_sent = sendAdminNotification($newEntry, $ADMIN_EMAIL, $SITE_NAME);
if ($email_sent) {
$message = 'Ihr Eintrag wurde übermittelt und der Administrator wurde per E-Mail benachrichtigt. Ihr Eintrag wartet auf Freischaltung.';
} else {
$message = 'Ihr Eintrag wurde übermittelt und wartet auf Freischaltung. (E-Mail-Benachrichtigung fehlgeschlagen - bitte Admin kontaktieren)';
error_log("Gästebuch: E-Mail-Benachrichtigung konnte nicht gesendet werden");
}
} else {
$message = 'Ihr Eintrag wurde übermittelt und wartet auf Freischaltung durch den Administrator.';
}
}
}
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gästebuch - Eintrag verfassen</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css" rel="stylesheet">
<script type="module" src="https://cdn.jsdelivr.net/npm/emoji-picker-element@1/index.js"></script>
<style>
.gradient-bg {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.form-card {
box-shadow: 0 10px 30px rgba(0,0,0,0.1);
border: none;
}
/* NEU: CSS für das Honeypot-Feld */
.honeypot {
position: absolute;
left: -9999px;
visibility: hidden;
}
</style>
</head>
<body class="bg-light">
<div class="gradient-bg text-white py-5 mb-5">
<div class="container">
<div class="row justify-content-center text-center">
<div class="col-lg-8">
<h1 class="display-4 fw-bold mb-3">
<i class="bi bi-journal-plus"></i> Neuer Gästebucheintrag
</h1>
<p class="lead">Teilen Sie Ihre Gedanken und Erfahrungen mit uns!</p>
</div>
</div>
</div>
</div>
<div class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="d-flex justify-content-between mb-4">
<a href="index.php" class="btn btn-outline-primary">
<i class="bi bi-arrow-left"></i> Zurück zum Gästebuch
</a>
<a href="admin.php" class="btn btn-outline-secondary">
<i class="bi bi-shield-lock"></i> Admin-Bereich
</a>
</div>
<?php if ($message): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="bi bi-check-circle"></i> <?= $message ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<?php if ($error): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="bi bi-exclamation-circle"></i> <?= $error ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<div class="card mb-5 form-card">
<div class="card-header bg-primary text-white">
<h5 class="mb-0"><i class="bi bi-plus-circle"></i> Neuen Eintrag verfassen</h5>
</div>
<div class="card-body p-4">
<form method="POST">
<input type="hidden" name="action" value="add_entry">
<input type="hidden" name="form_start_time" value="<?= time() ?>">
<div class="row">
<div class="col-md-6 mb-3">
<label for="name" class="form-label fw-semibold">Name *</label>
<input type="text" class="form-control form-control-lg" id="name" name="name" required>
</div>
<div class="col-md-6 mb-3">
<label for="email" class="form-label fw-semibold">E-Mail (optional)</label>
<input type="email" class="form-control form-control-lg" id="email" name="email">
</div>
</div>
<div class="honeypot">
<label for="website">Website (nicht ausfüllen)</label>
<input type="text" id="website" name="website" tabindex="-1">
</div>
<div class="mb-4">
<label for="comment" class="form-label fw-semibold">Ihr Kommentar *</label>
<textarea class="form-control" id="comment" name="comment" rows="5"
placeholder="Teilen Sie Ihre Gedanken mit uns! 😊" required></textarea>
<div class="mt-2">
<emoji-picker></emoji-picker>
</div>
</div>
<div class="mb-4">
<label for="captcha" class="form-label fw-semibold">
Sicherheitscode eingeben *
</label>
<div class="row">
<div class="col-6">
<img src="captcha.php" alt="CAPTCHA Bild" class="img-fluid border rounded" onclick="this.src='captcha.php?v='+Math.random()">
</div>
<div class="col-6">
<input type="text" class="form-control form-control-lg" id="captcha" name="captcha" required>
</div>
</div>
<small class="form-text text-muted mt-2">
Klicken Sie auf das Bild, um es zu aktualisieren.
</small>
</div>
<div class="d-grid">
<button type="submit" class="btn btn-primary btn-lg">
<i class="bi bi-send"></i> Eintrag senden
</button>
</div>
</form>
</div>
</div>
<div class="text-center mt-5 pt-4 border-top">
<p class="text-muted">
<i class="bi bi-heart-fill text-danger"></i>
Vielen Dank für Ihren Besuch!
</p>
</div>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
<script>
// Manuelle Steuerung für das Einfügen von Emojis
document.querySelector('emoji-picker').addEventListener('emoji-click', event => {
const textarea = document.getElementById('comment');
const emoji = event.detail.unicode;
const startPos = textarea.selectionStart;
const endPos = textarea.selectionEnd;
// Fügt das Emoji an der aktuellen Cursorposition ein
textarea.value = textarea.value.substring(0, startPos) +
emoji +
textarea.value.substring(endPos);
// Aktualisiert die Cursorposition, um sie hinter das eingefügte Emoji zu setzen
textarea.selectionStart = textarea.selectionEnd = startPos + emoji.length;
// Setzt den Fokus zurück auf das Textfeld, damit man weitertippen kann
textarea.focus();
});
</script>
</body>
</html>
$from_address = "noreply@meinedomain.de"; // ← hier eine echte Domain eintragen!
Code: Alles auswählen
<!-- Resize-Skript -->
<script>
window.addEventListener("load", fenster);
window.addEventListener("resize", fenster);
function fenster() {
if (parent.document.getElementsByTagName("iframe")[0]) {
parent.document.getElementsByTagName("iframe")[0].style.height =
document.getElementsByTagName("html")[0].offsetHeight +'px';
}
}
</script>
Steht in der eintragsformular.php - muss geändert werden!// Feste gültige Absenderadresse verwenden
$from_address = "noreply@domain.de"; // ← hier eine echte Domain eintragen!
Läuft auch bei mir gerade auf niederastroth.de// Feste gültige Absenderadresse verwenden
$from_address = "noreply@domain.de"; // ← hier eine echte Domain eintragen!
Da muss deine Domain rein !!! Zwingend weil,IONOS das senden per mail sonst nicht durch lässt// Nachricht mit UTF-8 Kodierung
$message = "Hallo Administrator,\n\n"
. "ein neuer Eintrag in Ihr Gästebuch wartet auf Freischaltung:\n\n"
. "═══════════════════════════════════════════════════════════════\n\n"
. "Name: " . $entry['name'] . "\n"
. "E-Mail: " . (!empty($entry['email']) ? $entry['email'] : 'Nicht angegeben') . "\n"
. "Datum: " . $entry['date'] . "\n\n"
. "Kommentar:\n" . $entry['comment'] . "\n\n"
. "═══════════════════════════════════════════════════════════════\n\n"
. "Freischalten können Sie den Eintrag hier:\n$admin_url\n\n"
. "Viele Grüße\nIhr Gästebuch-System";
// Feste gültige Absenderadresse verwenden
$from_address = "noreply@domain.de"; // ← hier eine echte Domain eintragen!
Code: Alles auswählen
// Nachricht mit UTF-8 Kodierung
$message = "Hallo Administrator,\n\n"
. "ein neuer Eintrag in Ihr Gästebuch wartet auf Freischaltung:\n\n"
. "═══════════════════════════════════════════════════════════════\n\n"
. "Name: " . $entry['name'] . "\n"
. "E-Mail: " . (!empty($entry['email']) ? $entry['email'] : 'Nicht angegeben') . "\n"
. "Datum: " . $entry['date'] . "\n\n"
. "Kommentar:\n" . $entry['comment'] . "\n\n"
. "═══════════════════════════════════════════════════════════════\n\n"
. "Freischalten können Sie den Eintrag hier:\n$admin_url\n\n"
. "Viele Grüße\nIhr Gästebuch-System";
// Feste gültige Absenderadresse verwenden
$from_address = "Tommy@example.com"; // ← hier eine echte Domain eintragen!