Uniform + Kirby 5: Warum verschickt mein Profilformular keine Mails?

Ich bastle gerade an einer neuen Kirby 5-Seite in Deutsch und Englisch und wollte das Uniform-Plugin für meine Kontaktformulare einsetzen, da die Profiluser im Panel noch individuelle Felder setzen können sollen.

Im klassischen Uniform-Demotest klappt alles: Die Testmails landen brav in Mailhog, alles fein. Dazu habe ich einen Blueprint uniform-test angelegt, eine Seite mit uniform-test, ein Template uniform-test.php und einen Controller uniform-test.php
Der Inhalt stammt aus der Plugin Doc.

Sobald ich aber Uniform im „echten Leben“ in meinem Profil-Controller benutze, also mit Feldern aus dem Panel, auf einer normalen Profilseite, passiert beim Mailversand… nichts.
Kein Fehler, aber auch keine Mail.
Der direkte Versand mit kirby()->email() funktioniert übrigens problemlos.

Ich habe unter /team/profil-a usw liegen. Auf der profil.php wird das Snippet kontaktformular.php eingebaut.
Ich habe eine Controller in profil.php.
Die Empfängeradresse stammt aus dem Panel.

Was habe ich schon alles ausprobiert?

  • Felder reduziert auf das absolute Minimum
  • Empfänger- und Absender-Adressen doppelt geprüft
  • Logging an jeder Ecke eingebaut

Das Uniform-Demoformular läuft super, aber mein echtes Profilformular schweigt beim Mailversand. Es sieht so aus, als ob Uniforms emailAction im Controller-Kontext einfach „hängen bleibt“, ich versteh nur nicht wieso?

Ich bin für jeden Hinweis dankbar!

Without code, we cannot help, I’m afraid.

Please note that the forum language is English only!

Apolgies!

This is my controller:

<?php

use Uniform\Form;
use Kirby\Toolkit\Str;

// --- Debug-Logging ---
function formDebugLog(string $message): void
{
  $logfile = kirby()->root('logs') . '/custom.log';
  file_put_contents($logfile, date('c') . ' ' . $message . PHP_EOL, FILE_APPEND);
}

formDebugLog("Profilcontroller (NEU) gestartet");

// ---- Controller-Funktion ----
return function ($page) {

  // 1. Standardfelder definieren
  $fields = [
    'name'    => ['rules' => ['required'], 'message' => 'Name erforderlich'],
    'email'   => ['rules' => ['required', 'email'], 'message' => 'Gültige E-Mail benötigt'],
    'message' => ['rules' => ['required'], 'message' => 'Nachricht fehlt'],
  ];

  // 2. Dynamische Panel-Felder (kontakt_formfields)
  $structure = $page->kontakt_formfields()->toStructure();
  foreach ($structure as $feld) {
    $key = Str::slug($feld->name()->value());
    $required = $feld->required()->bool();
    $fields[$key] = [
      'rules' => $required ? ['required'] : [],
      'message' => $feld->label()->or($feld->name())->value() . ' angeben',
    ];
  }
  formDebugLog('Felder: ' . implode(', ', array_keys($fields)));

  // 3. Uniform-Formular-Instanz
  $form = new Form($fields);

  // 4. Empfängeradresse (kontakt_email)
  $receiver = $page->kontakt_email()->value();
  if (empty($receiver)) {
    formDebugLog('Kein Empfänger gesetzt!');
    $form->error('email', 'Empfänger nicht gesetzt.');
    return compact('page', 'form');
  }
  formDebugLog('Empfänger: ' . $receiver);

  // 5. POST-Handling
  if (kirby()->request()->is('POST')) {
    formDebugLog('POST erkannt. Daten: ' . json_encode(kirby()->request()->data()));

    try {
      $form->handle();
      formDebugLog('handle() ok: ' . json_encode($form->data()));
    } catch (Throwable $e) {
      formDebugLog('handle() Exception: ' . $e->getMessage());
      return compact('page', 'form');
    }

    if (!$form->hasErrors()) {
      $params = [
        'to'      => $receiver,
        'from'    => option('email.from'), // In Config gültig setzen!
        'replyTo' => $form->data('email'),
        'subject' => 'Kontaktformular: ' . $page->title()->value(),
        'fields'  => $form->data(),
      ];
      formDebugLog('E-Mail-Parameter: ' . json_encode($params));

      try {
        $form->emailAction($params);
        formDebugLog('emailAction() erfolgreich');
        $form->success(true);
        $form->done();
      } catch (Throwable $e) {
        formDebugLog('emailAction() Exception: ' . $e->getMessage());
        $form->error('email', $e->getMessage());
        return compact('page', 'form');
      }
    } else {
      formDebugLog('Validierungsfehler: ' . json_encode($form->errors()));
    }
  }

  // 6. Übergabe an Template
  return compact('page', 'form');
};

Are you using AI? Or where did you get that method from?

I try to do as much as I can without but my php knowledge isn’t solid so I let AI interpret. I know its not the best way to get about it, but I try to keep it the usage as low as I can.

Well, AI tends to invent methods that don’t exist, like this $form->handle() method. So please stick to the documentation.