Inbox - YForm-basiertes Kontaktformular

Keywords: Inbox, Kontaktformular, YForm, Rapidmail, Spam-Schutz, Auto-Delete, Mailer-Profile

Übersicht

Inbox ist ein YForm-basiertes Kontaktformular-Addon für Anfragen über die REDAXO-Website mit Backend-Verwaltung, Spam-Schutz und optionalem Rapidmail-Tracking.

Hauptklasse

Klasse Beschreibung
Inbox YOrm Dataset-Klasse (rex_yform_manager_dataset), greift auf rex_inbox zu

Wichtige Methoden

Methode Parameter Rückgabe Beschreibung
::get($id) int $id Inbox\|null Lädt Inbox-Eintrag
::create() - Inbox Erstellt neuen Eintrag
::query() - rex_yform_manager_query Query-Builder
::getYForm() verschiedene rex_yform Erstellt YForm-Formular
getName() - ?string Name des Absenders
getEmail() - ?string E-Mail-Adresse
getPhone() - ?string Telefonnummer
getMessage() bool $asPlaintext ?string Nachricht (HTML/Text)
getPrefferedChannel() - ?string Bevorzugter Kontaktweg
getDatestamp() - ?string Zeitstempel Eingang
getDeletedate() - ?\DateTime Geplantes Löschdatum

Rapidmail-Tracking (optional)

Methode Parameter Rückgabe Beschreibung
getRapidmailMessageId() - ?string Rapidmail Message-ID
getRapidmailStatus() - ?string Status als JSON
getRapidmailStatusArray() - ?array Status als Array
setRapidmailMessageId() mixed $value self Setzt Message-ID
setRapidmailStatus() mixed $value self Setzt Status (Array→JSON)
updateRapidmailStatus() - bool Aktualisiert Status von API
::isRapidmailAvailable() - bool Prüft yform_rapidmail
::isRapidmailTrackingEnabled() - bool Prüft Settings

Praxisbeispiele

1. Inbox-Eintrag laden

use Alexplusde\Inbox\Inbox;

$inbox = Inbox::get(42);
echo $inbox->getName();
echo $inbox->getEmail();
echo $inbox->getMessage();

2. Alle Einträge abfragen

$entries = Inbox::query()->find();
foreach ($entries as $entry) {
    echo $entry->getName() . ': ' . $entry->getEmail();
}

3. Neue Inbox-Nachricht erstellen

$inbox = Inbox::create();
$inbox->setName('Max Mustermann');
$inbox->setEmail('max@example.com');
$inbox->setPhone('+49 123 456789');
$inbox->setMessage('Meine Anfrage...');
$inbox->setDatestamp(date('Y-m-d H:i:s'));
$inbox->save();

4. Kontaktformular im Frontend einbinden

$yform = Inbox::getYForm();
echo $yform->getForm();

5. Kontaktformular mit Fragment

// Fragment: inbox/form.php
$fragment = new rex_fragment();
echo $fragment->parse('inbox/form.php');

6. Formular mit Custom-Feldern

$yform = Inbox::getYForm(
    null, 
    [Inbox::NAME, Inbox::EMAIL, Inbox::MESSAGE, Inbox::PRIVACY_POLICY], // Feldauswahl
    true, // objparams
    true, // honeypot
    true, // database
    0     // mailer_profile
);
echo $yform->getForm();

7. Nachricht als Plaintext

$inbox = Inbox::get(42);
$text = $inbox->getMessage(true); // true = ohne HTML-Tags

8. Bevorzugter Kontaktweg

$inbox = Inbox::get(42);
$channel = $inbox->getPrefferedChannel(); // email, phone, whatsapp, telegram

9. Löschdatum prüfen (Auto-Delete)

$inbox = Inbox::get(42);
$deleteDate = $inbox->getDeletedate();
if ($deleteDate && $deleteDate < new DateTime()) {
    echo 'Wird bald gelöscht am ' . $deleteDate->format('d.m.Y');
}

10. Einträge mit Löschdatum filtern

$entries = Inbox::query()
    ->whereRaw('deletedate IS NOT NULL')
    ->orderBy('deletedate', 'ASC')
    ->find();

11. YForm mit Mailer-Profile

if (rex_addon::get('mailer_profile')->isAvailable()) {
    $yform = Inbox::getYForm(null, null, true, true, true, 2); // Profil-ID 2
    echo $yform->getForm();
}

12. Subject für E-Mail abrufen

$subject = Inbox::getSubject('Max Mustermann'); // Prefix + Name
echo $subject; // "Anfrage Max Mustermann"

13. Subject für Bestätigung an Kunden

$subjectClient = Inbox::getSubjectClient('Max Mustermann');
echo $subjectClient; // "Ihre Anfrage Max Mustermann"

14. IP-Adresse speichern

$inbox = Inbox::create();
$inbox->setIp($_SERVER['REMOTE_ADDR']);
$inbox->save();

15. Rapidmail: Message-ID speichern (nach E-Mail-Versand)

if (Inbox::isRapidmailAvailable() && Inbox::isRapidmailTrackingEnabled()) {
    $inbox = Inbox::get(42);
    $inbox->setRapidmailMessageId('msg_abc123def456');
    $inbox->setRapidmailStatus([
        'status' => 'sent',
        'timestamp' => date('Y-m-d H:i:s')
    ]);
    $inbox->save();
}

16. Rapidmail: Status abrufen

$inbox = Inbox::get(42);
$messageId = $inbox->getRapidmailMessageId();
$statusJson = $inbox->getRapidmailStatus(); // JSON-String
$statusArray = $inbox->getRapidmailStatusArray(); // Array
if ($statusArray) {
    echo 'Status: ' . $statusArray['status'];
    echo 'Zeitstempel: ' . $statusArray['timestamp'];
}

17. Rapidmail: Status von API aktualisieren

$inbox = Inbox::get(42);
if ($inbox->updateRapidmailStatus()) {
    echo 'Status erfolgreich aktualisiert';
    $status = $inbox->getRapidmailStatusArray();
    echo 'Neuer Status: ' . $status['status'];
} else {
    echo 'Fehler beim Status-Abruf';
}

18. Rapidmail: Cronjob für Status-Updates

// Im Cronjob alle Stunde
$entries = Inbox::query()
    ->whereRaw('rapidmail_message_id IS NOT NULL')
    ->whereRaw('rapidmail_last_check < DATE_SUB(NOW(), INTERVAL 1 HOUR)')
    ->find();

foreach ($entries as $entry) {
    try {
        $entry->updateRapidmailStatus();
        usleep(100000); // 0.1s Pause (Rate Limiting)
    } catch (Exception $e) {
        rex_logger::logException($e);
    }
}

19. Rapidmail: Fehlgeschlagene Zustellungen überwachen

$failed = Inbox::query()
    ->whereRaw('JSON_EXTRACT(rapidmail_status, "$.status") = "failed"')
    ->where('datestamp', '>', date('Y-m-d', strtotime('-24 hours')))
    ->find();

if ($failed->count() > 10) {
    // Alert senden
    rex_mailer::factory()
        ->setFrom('system@example.com')
        ->addTo('admin@example.com')
        ->setSubject('WARNUNG: Viele fehlgeschlagene E-Mails')
        ->setBody("Es sind {$failed->count()} E-Mails in den letzten 24h fehlgeschlagen")
        ->send();
}

20. Rapidmail: Status-Details

$inbox = Inbox::get(42);
$status = $inbox->getRapidmailStatusArray();
if ($status) {
    switch ($status['status']) {
        case 'sent':
            echo 'E-Mail wurde versendet';
            break;
        case 'delivered':
            echo 'E-Mail wurde zugestellt';
            break;
        case 'failed':
            echo 'Zustellung fehlgeschlagen: ' . ($status['error'] ?? 'Unbekannter Fehler');
            break;
    }
}

21. YForm Action für Rapidmail-Tracking

// In boot.php oder YForm-Action
class yform_action_inbox_rapidmail_tracking extends rex_yform_action_abstract
{
    public function executeAction(): void
    {
        if (!Inbox::isRapidmailAvailable() || !Inbox::isRapidmailTrackingEnabled()) {
            return;
        }
        
        $inboxId = $this->params['value_pool']['sql']['id'] ?? null;
        if (!$inboxId) return;
        
        $inbox = Inbox::get($inboxId);
        if (!$inbox) return;
        
        // E-Mail via Rapidmail versenden
        // $response = $rapidmailApi->send(...);
        // $inbox->setRapidmailMessageId($response['message_id']);
        // $inbox->setRapidmailStatus(['status' => 'sent', 'timestamp' => date('Y-m-d H:i:s')]);
        $inbox->save();
    }
}

22. Einträge der letzten 7 Tage

$entries = Inbox::query()
    ->where('datestamp', '>=', date('Y-m-d H:i:s', strtotime('-7 days')))
    ->orderBy('datestamp', 'DESC')
    ->find();

23. Einträge mit bestimmtem Kanal

$whatsappRequests = Inbox::query()
    ->where('preffered_channel', 'whatsapp')
    ->find();

24. Privacy-Policy-Akzeptanz prüfen

$inbox = Inbox::get(42);
$acceptedAt = $inbox->getPrivacyPolicy(); // DateTime
if ($acceptedAt) {
    echo 'Datenschutz akzeptiert am: ' . $acceptedAt->format('d.m.Y H:i');
}

25. Datensatz aktualisieren

$inbox = Inbox::get(42);
$inbox->setMessage('Aktualisierte Nachricht');
$inbox->save();

26. Spam-Schutz mit Honeypot aktivieren

$yform = Inbox::getYForm(
    null,
    null,
    true,  // objparams
    true,  // honeypot aktiviert
    true,  // database
    0
);

27. Integration mit YForm Spam Protection

// Voraussetzung: yform_spam_protection installiert
$yform = Inbox::getYForm();
// Honeypot wird automatisch eingefügt
echo $yform->getForm();

28. Custom Template für YForm

$yform = Inbox::getYForm();
$yform->setObjectparams('form_ytemplate', 'bootstrap5,bootstrap');
echo $yform->getForm();

29. Formular ohne Datenbank-Speicherung (nur E-Mail)

$yform = Inbox::getYForm(
    null,
    null,
    true,
    true,
    false,  // keine DB-Speicherung
    0
);
$yform->setActionField('tpl2email', ['inbox' => 'admin@example.com']);
echo $yform->getForm();

30. Multilinguale Formulare mit YRewrite

// Fragment erstellen je Sprache
$yform = Inbox::getYForm();
$yform->setObjectparams('form_ytemplate', 'bootstrap5');

// Labels übersetzen via i18n
// rex_i18n::addDirectory(rex_path::addon('inbox', 'lang'));

echo $yform->getForm();

Integration: Inbox arbeitet mit YForm, Auto Delete (DSGVO-Löschfristen), Mailer Profile (verschiedene SMTP-Profile), YForm Spam Protection (Honeypot/reCAPTCHA), YForm Rapidmail (Versandstatus-Tracking) und YRewrite (Multilingualität).