Hallo ' . htmlspecialchars($data['band_name']) . ',
+Sie haben eine neue Buchungsanfrage erhalten:
+ +' . nl2br(htmlspecialchars($data['message'])) . ' +
Kontaktdaten:
++ Bitte kontaktieren Sie den Kunden direkt, um die Details zu besprechen. +
+diff --git a/CHANGELOG_EMAIL_FEATURES.md b/CHANGELOG_EMAIL_FEATURES.md new file mode 100644 index 0000000..325590f --- /dev/null +++ b/CHANGELOG_EMAIL_FEATURES.md @@ -0,0 +1,163 @@ +# Email & Buchungssystem Updates + +## Änderungen vom 2. Dezember 2025 + +### ✅ Implementierte Features: + +#### 1. **Echte Email-Funktionalität** (`includes/email.php`) + - ✨ PHP `mail()` Funktion implementiert statt nur Logging + - ✅ HTML-Email-Support mit professionellen Templates + - 📧 Automatische Headers (From, Reply-To, Content-Type) + - 📝 Logging bleibt erhalten für Debugging + +#### 2. **Email-Template-System** + - 🎨 Professionelle HTML-Email-Templates mit Styling + - 🎸 "booking_request" - Email an die Band + - ✅ "booking_confirmation" - Bestätigung an den Kunden + - 🎨 Gelbes Branding (#f4b807) passend zur Plattform + +#### 3. **Verbesserte Buchungsanfragen** (`anfrage.php`) + - 📧 Automatische Email an Band bei neuer Anfrage + - ✅ Bestätigungs-Email an Kunden + - 👥 **Gäste-Buchungen** ohne Login möglich + - ✔️ Bessere Formular-Validierung + - 📅 Datum-Mindestauswahl (nur zukünftige Daten) + +#### 4. **Band-Email-Verwaltung** (`profil.php`) + - 📧 Bands können eigene Email-Adresse hinterlegen + - 📝 Klare Beschriftung: "Email für Buchungsanfragen" + - 💾 Email wird in der Datenbank gespeichert + +#### 5. **Datenbank-Updates** (`database.sql`) + - 🗄️ Neue Spalte `email` in `bands` Tabelle + - 📜 Migration-Script: `migrate_add_band_email.php` + +--- + +## 📋 Installations-Anleitung + +### Schritt 1: Migration ausführen +```bash +php migrate_add_band_email.php +``` + +### Schritt 2: Mail-Server konfigurieren +Stelle sicher, dass PHP's `mail()` Funktion auf dem Server konfiguriert ist: +- Ubuntu/Debian: `sudo apt-get install sendmail` +- Oder verwende einen SMTP-Relay wie Postfix + +### Schritt 3: Testen +1. Als Band einloggen +2. Profil bearbeiten und Email-Adresse hinzufügen +3. Als Gast oder Kunde eine Buchungsanfrage senden +4. Prüfe die Emails (und `storage/logs/mail.log`) + +--- + +## 🎯 Neue Funktionen im Detail + +### Email an Band (booking_request) +``` +Enthält: +- Event-Datum, Ort, Typ +- Budget +- Nachricht des Kunden +- Kontaktdaten (Name, Email) +- Professionelles Layout +``` + +### Email an Kunde (booking_confirmation) +``` +Enthält: +- Bestätigung der Anfrage +- Event-Details +- Hinweis auf Rückmeldung der Band +- Support-Kontakt +``` + +### Gäste-Buchungen +``` +- Keine Registrierung nötig +- Name + Email Pflichtfelder +- Email-Validierung +- Gleiche Funktionalität wie eingeloggte User +``` + +--- + +## 🔧 Konfiguration + +### Email-Absender +In `includes/config.php`: +```php +const SITE_NAME = 'GetYourBand'; +const SUPPORT_EMAIL = 'support@getyourband.ch'; +``` + +### Band-Email Fallback +Falls Band keine Email hinterlegt hat: +```php +info@[bandname].ch +``` +(Leerzeichen werden entfernt, lowercase) + +--- + +## 📝 Nächste Schritte (Optional) + +### Empfohlene Erweiterungen: +1. **PHPMailer Integration** für SMTP-Support +2. **Email-Queue** für große Mengen +3. **Email-Templates per Datenbank** konfigurierbar +4. **Email-Benachrichtigungen** für: + - Status-Änderungen von Anfragen + - Neue Bewertungen + - Profil-Freigaben + +### SMTP mit PHPMailer (Beispiel): +```bash +composer require phpmailer/phpmailer +``` + +Dann in `includes/email.php` ersetzen: +```php +use PHPMailer\PHPMailer\PHPMailer; +// ... SMTP Konfiguration +``` + +--- + +## 🐛 Debugging + +### Email kommt nicht an? +1. Prüfe `storage/logs/mail.log` - werden Emails geloggt? +2. Prüfe Server Mail-Logs: `tail -f /var/log/mail.log` +3. Teste PHP mail(): `php -r "mail('test@example.com', 'Test', 'Test');"` +4. Prüfe Spam-Ordner + +### Häufige Probleme: +- **sendmail nicht installiert**: `sudo apt-get install sendmail` +- **Port 25 blockiert**: Verwende SMTP-Relay +- **SPF/DKIM fehlt**: Emails landen im Spam + +--- + +## ✨ Zusammenfassung + +**Vorher:** +- ❌ Emails wurden nur geloggt +- ❌ Keine echten Email-Benachrichtigungen +- ❌ Gäste konnten nicht buchen +- ❌ Bands hatten keine Email-Verwaltung + +**Nachher:** +- ✅ Echte Email-Versand mit HTML-Templates +- ✅ Automatische Benachrichtigungen an Band & Kunde +- ✅ Gäste-Buchungen möglich +- ✅ Bands verwalten ihre Email-Adresse +- ✅ Professionelles Design +- ✅ Bessere Validierung + +--- + +**Viel Erfolg! 🎸🎵** diff --git a/anfrage.php b/anfrage.php index 10b5e08..b6377d1 100644 --- a/anfrage.php +++ b/anfrage.php @@ -28,8 +28,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { 'message' => trim((string) $_POST['message'] ?? ''), ]; + $guestName = trim($_POST['guest_name'] ?? ''); + $guestEmail = trim($_POST['guest_email'] ?? ''); + if (!$data['event_date'] || !$data['location']) { $error = 'Bitte Datum und Ort ausfüllen.'; + } elseif (!$user && (!$guestName || !$guestEmail)) { + $error = 'Bitte geben Sie Ihren Namen und Email-Adresse an.'; + } elseif (!$user && !filter_var($guestEmail, FILTER_VALIDATE_EMAIL)) { + $error = 'Bitte geben Sie eine gültige Email-Adresse an.'; } else { createRequest($data); $requestId = (int) db()->lastInsertId(); @@ -71,20 +78,34 @@ $settings = settings();
diff --git a/database.sql b/database.sql index b22bb73..ada20ce 100644 --- a/database.sql +++ b/database.sql @@ -16,6 +16,7 @@ CREATE TABLE IF NOT EXISTS bands ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, name TEXT NOT NULL, + email TEXT, city TEXT, genre TEXT, price INTEGER DEFAULT 0, diff --git a/includes/email.php b/includes/email.php index f4d88f2..4ac9a78 100644 --- a/includes/email.php +++ b/includes/email.php @@ -1,10 +1,181 @@ ', + 'Reply-To: ' . SUPPORT_EMAIL, + 'X-Mailer: PHP/' . phpversion(), + 'MIME-Version: 1.0' + ]; + + if ($isHtml) { + $headers[] = 'Content-Type: text/html; charset=UTF-8'; + } else { + $headers[] = 'Content-Type: text/plain; charset=UTF-8'; + } + + return mail($to, $subject, $message, implode("\r\n", $headers)); +} + +function sendBookingRequestEmail(array $band, array $requestData, ?array $customer = null): bool +{ + $bandEmail = $band['email'] ?? 'info@' . preg_replace('/\s+/', '', strtolower($band['name'])) . '.ch'; + + $subject = 'Neue Buchungsanfrage für ' . $band['name']; + + $message = emailTemplate('booking_request', [ + 'band_name' => $band['name'], + 'event_date' => date('d.m.Y', strtotime($requestData['event_date'])), + 'location' => $requestData['location'], + 'event_type' => $requestData['event_type'] ?: 'Nicht angegeben', + 'budget' => $requestData['budget'] ? formatPrice($requestData['budget']) : 'Nicht angegeben', + 'message' => $requestData['message'] ?: 'Keine Nachricht', + 'customer_name' => $customer['name'] ?? 'Gast', + 'customer_email' => $customer['email'] ?? 'Keine Email angegeben', + ]); + + return sendEmail($bandEmail, $subject, $message); +} + +function sendBookingConfirmationEmail(string $customerEmail, array $band, array $requestData): bool +{ + $subject = 'Ihre Anfrage an ' . $band['name'] . ' wurde gesendet'; + + $message = emailTemplate('booking_confirmation', [ + 'band_name' => $band['name'], + 'event_date' => date('d.m.Y', strtotime($requestData['event_date'])), + 'location' => $requestData['location'], + 'site_name' => SITE_NAME, + ]); + + return sendEmail($customerEmail, $subject, $message); +} + +function emailTemplate(string $templateName, array $data): string +{ + $templates = [ + 'booking_request' => ' + + + + + + + +Hallo ' . htmlspecialchars($data['band_name']) . ',
+Sie haben eine neue Buchungsanfrage erhalten:
+ ++ Bitte kontaktieren Sie den Kunden direkt, um die Details zu besprechen. +
+Vielen Dank für Ihre Anfrage an ' . htmlspecialchars($data['band_name']) . '.
+ ++ Die Band wird sich in Kürze bei Ihnen melden. Bitte überprüfen Sie auch Ihren Spam-Ordner. +
+ ++ Bei Fragen können Sie uns jederzeit unter ' . SUPPORT_EMAIL . ' erreichen. +
+