Anleitungen

Anleitungen14 Min. Lesezeit

HTML-Formulareinsendungen an deine E-Mail senden

Bekomm jede Formulareinsendung ohne Mailserver in dein Postfach: warum mailto: und PHPs mail() scheitern und ein Setup, das Spam filtert und dich antworten lässt.

Preet SutharGründer, Ikiform

Ein HTML-Formular kann von sich aus keine E-Mail senden, weil ein Browser keinen Weg hat, mit einem Mailserver zu sprechen. Richte die action des Formulars auf ein Formular-Backend aus, das den Post annimmt, Spam filtert, ihn speichert und dir und deinem Team eine E-Mail schickt. Nenne das E-Mail-Feld email, dann schreibt Reply in deinem Postfach direkt an die Person zurück, die das Formular ausgefüllt hat.

Die meisten Sites brauchen von einem Kontaktformular genau eins: die Nachricht in einem Postfach, das jemand liest. Das ist schwieriger, als es aussieht. HTML hat ein <form>-Element, aber keine Möglichkeit, Mails zu senden, und die alten Abkürzungen schieben die Arbeit entweder dem Besucher zu oder landen im Spam. Diese Anleitung erklärt, warum, vergleicht die Optionen ehrlich und richtet ein Formular ein, das dir auf jeder Site und mit jedem Stack E-Mails schickt.

Warum ein Formular nicht von allein E-Mails senden kann

Wenn ein Besucher auf Send klickt, macht der Browser einen HTTP-Request an die URL in der action des Formulars. Mehr kann ein Formular nicht. Eine E-Mail zu senden, erfordert eine SMTP-Unterhaltung mit einem Mailserver, von einer Maschine aus, der der empfangende Server vertraut. Ein Browser kann diese Verbindung nicht öffnen, und selbst wenn, würde Mail vom Laptop eines beliebigen Besuchers abgelehnt. Zwischen Formular und Postfach sitzt also immer etwas auf einem Server: dein eigener Code, ein Skript bei deinem Host oder ein Dienst.

Mit einem Formular-Backend ist dieses Etwas eine URL. Das Formular sendet an https://ikiform.com/f/<id>, und Ikiform erledigt den Rest:

Wie aus einem Formular-Post eine E-Mail in deinem Postfach wirddeinFormularjede Site,jeder StackIkiformvalidiert,bewertetSpam,speicherteineE-Mail proEmpfängerReply-To istder AbsenderdeinPostfachAntwort gehtan denBesucherals Spamgespeichertkeine E-Mail,kein WebhookPostkein SpamSekundenSpam-Schwelle erreichtWie aus einem Formular-Post eine E-Mail in deinem Postfach wirddein Formularjede Site, jeder StackIkiformvalidiert, bewertetSpam, speicherteine E-Mail proEmpfängerReply-To ist derAbsenderdein PostfachAntwort geht an denBesucherals SpamgespeichertkeineE-Mail, keinWebhookPostkein SpamSekundenSpam-Schwelle erreicht
  1. Der Besucher sendet dein Formular ab, und der Browser oder dein Server schickt es an deinen Ikiform-Endpunkt.
  2. Ikiform prüft die Felder gegen die Definition des Formulars, bewertet den Post auf Spam und speichert ihn.
  3. Ein Post, der den Spam-Schwellenwert erreicht, wird als Spam gespeichert. Er bekommt dieselbe Erfolgsantwort, löst aber weder E-Mail noch Webhook aus.
  4. Jeder andere Post sendet eine E-Mail an jeden Empfänger, mit der Adresse des Besuchers als Reply-To.
  5. Die E-Mail kommt Sekunden später in deinem Postfach an. Mit Antworten schreibst du dem Besucher.
Der Besucher sieht nie eine E-Mail-Adresse und öffnet nie eine Mail-App. Das Einzige auf deiner Seite ist ein Formular.

Sechs Wege, ein Formular in dein Postfach zu bekommen

Jeder davon funktioniert für irgendwen. Die Tabelle zeigt, was dich jeder kostet, sobald echte Besucher und echte Bots das Formular nutzen.

AnsatzStark beiNachteile
action="mailto:you@example.com"Kein Server, kein Konto, ein Attribut.Nichts wird gesendet. Der Browser öffnet die Mail-App des Besuchers mit einem Entwurf oder tut gar nichts, wenn keine Mail-App eingerichtet ist. Deine Adresse steht für Scraper in der Seite. Siehe die Gmail-Anleitung.
Ein PHP-Skript mit mail()Läuft auf fast jedem Shared-PHP-Host, ohne Drittanbieter.Hängt vom Mail-Setup des Hosts ab, und Mail, die angeblich von deiner Domain kommt, fällt oft bei SPF oder DMARC durch und landet im Spam. Kein Spamfilter, keine Speicherung und auf statischen Hosts überhaupt kein PHP. Siehe ohne PHP.
Ein E-Mail-SDK für den Browser, etwa EmailJSKein Server. E-Mail-Vorlagen, die du in deren Dashboard gestaltest.Die Schlüssel und Vorlagen-IDs stehen im JavaScript deiner Seite, sodass jeder deine Vorlagen mit eigenem Text verschicken kann. Siehe die EmailJS-Alternative.
Deine eigene Route plus eine E-Mail-API wie Resend, Postmark, Amazon SES oder Nodemailer über SMTPVolle Kontrolle: dein Betreff, dein HTML, eine Bestätigung an den Besucher.Du baust Validierung, Spamfilter, Rate-Limits, Speicherung und Wiederholungsversuche, verifizierst eine Absenderdomain und brauchst selbst für eine statische Site einen Server. Siehe die Next.js-Anleitung.
Google Apps Script als Web-AppLäuft auf einem Google-Konto, das du schon hast.Skript-Kontingente begrenzen, wie viele Empfänger es pro Tag anschreiben kann, die URL hat keinen Spamschutz, und du pflegst das Skript.
Ein Formular-Backend wie Ikiform, Formspree oder Web3FormsEine URL in action. Spamfilter, Speicherung und E-Mail ohne Server.Layout und Betreff der E-Mail bestimmt der Dienst. Bei Ikiform wird dem Besucher nie etwas gemailt.

Wenn du eine vollständig gebrandete E-Mail oder eine Bestätigung an den Besucher brauchst, schreib deine eigene Route mit einer E-Mail-API. Wenn du die Nachricht im Postfach und eine Antwortmöglichkeit willst, ohne Spam, ist ein Formular-Backend der wenigste Code. Der Rest dieser Anleitung nutzt Ikiform.

Das Formular

Drei Felder decken die meisten Kontaktformulare ab: wer die Person ist, wohin die Antwort geht und was sie will. Wähle unten deinen Stack; die Wahl gilt für jedes Codebeispiel in diesen Anleitungen.

Dieses Formular funktioniert ganz ohne JavaScript: Der Browser sendet es, Ikiform schickt dir eine E-Mail, und der Besucher landet auf der Seite in _redirect. Unter jedem Feld steht ein leerer Platz für Fehler, den das Skript unten nutzt.

contact.html
<form id="contact" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required maxlength="120" />
  <p data-error="name"></p>

  <label for="email">Your email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />
  <p data-error="email"></p>

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="6" required minlength="10"></textarea>
  <p data-error="message"></p>

  <input type="hidden" name="page" value="/contact" />
  <input type="hidden" name="_redirect" value="https://example.com/contact/sent" />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send message</button>
  <p id="contact-status" role="status"></p>
</form>

Das Skript hält den Besucher auf der Seite. Es sendet mit fetch, schreibt jeden Serverfehler unter sein Feld und ersetzt das Formular durch eine Zeile, die die Adresse wiederholt, an die du antworten wirst, damit ein Tippfehler leicht auffällt.

contact.js
const form = document.getElementById("contact");
const status = document.getElementById("contact-status");
const button = form.querySelector("button");

form.addEventListener("submit", async (event) => {
  event.preventDefault();
  for (const slot of form.querySelectorAll("[data-error]")) slot.textContent = "";
  button.disabled = true;
  status.textContent = "Sending";

  try {
    const response = await fetch(form.action, {
      method: "POST",
      headers: { Accept: "application/json" },
      body: new FormData(form),
    });
    const result = await response.json();
    if (result.ok) {
      const email = form.elements.namedItem("email").value;
      const done = document.createElement("p");
      done.setAttribute("role", "status");
      done.textContent = `Sent. We'll reply to ${email}.`;
      form.replaceWith(done);
      return;
    }
    for (const [field, messages] of Object.entries(result.error.fields ?? {})) {
      const slot = form.querySelector(`[data-error="${field}"]`);
      if (slot) slot.textContent = messages[0];
    }
    status.textContent = result.error.fields ? "Check the fields above." : result.error.message;
  } catch {
    status.textContent = "Couldn't send. Check your connection and try again.";
  }
  button.disabled = false;
});
  • Ersetze frm_xxxxxxxxxxxxxxxx durch die ID deines Formulars aus dem Dashboard.
  • name="email" macht dieses Feld zur Reply-To-Adresse der Benachrichtigungs-E-Mail. Behalte den Namen, auch wenn das Label „Deine E-Mail“ lautet.
  • page ist ein gewöhnliches verstecktes Feld. Es erscheint in der E-Mail, sodass du weißt, von welcher Seite die Nachricht kam.
  • _gotcha ist der Honeypot. Menschen sehen ihn nie; ein Bot, der ihn ausfüllt, wird als Spam gespeichert und löst keine E-Mail aus.
  • _redirect funktioniert nur mit einer https:-URL auf einer der Allowed domains des Formulars. Lass es weg und setze stattdessen Redirect after submit in den Einstellungen des Formulars, sonst zeigt Ikiform seine eigene Dankeseite.

Die Framework-Anleitungen gehen weiter: Next.js, Astro, SvelteKit, Nuxt, React, Vue und einfaches HTML. Website-Baukästen wie Webflow und Carrd haben eigene Seiten, und die Kontaktformular-Vorlage ergänzt ein Themenfeld.

Definiere die Felder auch im Dashboard, dann lehnt Ikiform einen nicht passenden Post mit 422 validation_failed und einer Meldung pro Feld ab, die der Code oben neben jedem Eingabefeld anzeigt. Probier es hier aus; das führt denselben Validator in deinem Browser aus:

Vorschau

Führt den Validator von Ikiform in deinem Browser aus. Es wird nichts gesendet.

Füge diese Definition im Tab Fields des Formulars ein. Ohne Definition akzeptiert Ikiform beliebige Feldnamen und mailt alles, was ankommt.

Wie die E-Mail aussieht

Jede angenommene Einsendung löst eine schlichte, gut lesbare E-Mail aus. Hier die Textversion einer solchen:

Benachrichtigungs-E-Mail
From: Ikiform <notifications@ikiform.com>
To: you@yourcompany.com
Reply-To: ada@example.com
Subject: New submission: Contact

Contact got a new submission on Oct 25, 2026, 9:14 AM UTC.

name: Ada Lovelace
email: ada@example.com
message: Do you ship to Canada? I'd like to order 40 units before December.
page: /contact

View it in Ikiform:
https://ikiform.com/dashboard/submissions?form=frm_xxxxxxxxxxxxxxxx&submission=sub_...
  • Sie kommt von notifications@ikiform.com. Du richtest keine DNS-Einträge und keine Absenderdomain ein, weil die Mail von der Domain von Ikiform gesendet wird.
  • Der Betreff lautet immer New submission: <form name>. _subject ändert nicht den Betreff der Benachrichtigungs-E-Mails. Es wird als meta.subject an Webhooks und die API weitergegeben. Um Formulare auseinanderzuhalten, gib jedem Formular im Dashboard einen klaren Namen, etwa „Kontakt, Preisseite“.
  • Felder erscheinen in der Reihenfolge, in der sie gesendet wurden, beschriftet mit ihrem name. Felder, die mit _ beginnen, werden weggelassen.
  • Ein sehr langes Formular oder eine sehr lange Antwort wird gekürzt, und die E-Mail sagt, wie viele weitere Felder im Dashboard stehen. Die Seite zu Limits nennt die Zahlen.
  • Felder, die wie Passwörter oder Kartennummern aussehen, werden weggelassen, und die E-Mail zu einem Post, der sie enthält, wird zur Prüfung zurückgehalten. Sammle mit einem Formular-Backend keine Zugangsdaten.
  • Workspace-Mitglieder bekommen einen Button View submission. Personen außerhalb des Workspace bekommen die Felder und einen Abmeldelink.

Wer die E-Mail bekommt

Empfänger werden pro Formular im Dashboard festgelegt, nie durch das Formular selbst. Ein Feld, das einen Empfänger angibt, würde jedem erlauben, über dein Formular beliebige Leute anzuschreiben, deshalb hat Ikiform keines.

WerWie sie hinzugefügt werdenHinweise
Der StandardNichts zu tunDas Mitglied, das als Notification email des Workspace gewählt ist, oder jeder Owner des Workspace, wenn keines gewählt ist
Ausgewählte MitgliederHake sie in den Einstellungen Notifications des Formulars anNur Mitglieder mit verifizierter E-Mail-Adresse
Personen außerhalb des WorkspaceAdd someone outside the workspace, dann Send linkSie bekommen erst E-Mails, nachdem sie bestätigt haben. Bis zu 5 pro Formular, und jede Person kann sich abmelden

Jedes Formular mailt an höchstens 10 Adressen. Jeder Empfänger bekommt seine eigene Kopie statt eines gemeinsamen CC, sodass niemand die Adressen der anderen sieht. Wenn das Postfach eines Empfängers Bounces erzeugt, pausiert Ikiform eine Weile die E-Mails an diese Adresse, und das Dashboard zeigt daneben Emails bounced. Mehrere Empfänger behandelt das Weiterleiten nach Thema, was Empfänger allein nicht können.

Der Person antworten, nicht Ikiform

Ikiform setzt die Reply-To-Adresse zuerst aus einem Feld _replyto, dann aus einem Feld namens email, email_address, your_email, reply_to, contact_email. Der Wert muss eine einzelne gültige E-Mail-Adresse sein, sonst wird er ignoriert. Ist ein Reply-To gesetzt, öffnet Reply in Gmail, Outlook oder Apple Mail eine Antwort an den Besucher, und deine Antwort kommt von deiner eigenen Adresse.

Ohne Reply-To geht eine Antwort an notifications@ikiform.com, das niemand liest. Das ist die häufigste Überraschung, und meist steckt ein Feld namens user_email oder Email Address mit Leerzeichen dahinter. Benenne es um oder füge _replyto hinzu. Die Reply-To-Anleitung behandelt Formulare mit zwei E-Mail-Feldern und Baukästen, die Felder für dich umbenennen.

Wenn viel auf einmal ankommt

Jedes Formular sendet bis zu 50 Benachrichtigungs-E-Mails pro Stunde, oder 10, solange der Workspace jünger als 7 Tage ist. Darüber hinaus werden die restlichen Einsendungen der Stunde wie gewohnt gespeichert und kommen nach Ende der Stunde als eine Sammel-E-Mail an. Die Grenze schützt dein Postfach und den Ruf von Ikiforms Mails bei deinem Mail-Anbieter, wenn ein Formular irgendwo Großes geteilt wird oder ein Bot an den Filtern vorbeikommt.

Was in einer vollen Stunde mit Benachrichtigungs-E-Mails passiertein Formular, eine volle Stunde in UTCEinsendungen 1bis 50je eine E-Mail,Sekunden späterab Einsendung51gespeichert, fürdie Sammel-E-MailvorgemerktStunde endeteineSammel-E-Mail proFormularGrenze erreichtnächste StundeWas in einer vollen Stunde mit Benachrichtigungs-E-Mails passiertein Formular, eine volle Stunde in UTCEinsendungen 1 bis 50je eine E-Mail, Sekunden späterab Einsendung 51gespeichert, für dieSammel-E-Mail vorgemerktStunde endeteine Sammel-E-Mail proFormularGrenze erreichtnächste Stunde
  1. Die ersten 50 Einsendungen an ein Formular in einer vollen Stunde lösen wie gewohnt je eine E-Mail aus.
  2. Spätere Einsendungen in derselben Stunde werden gespeichert und sofort im Dashboard angezeigt, ohne einzelne E-Mail.
  3. Nach Ende der Stunde bekommt jeder Empfänger eine Sammel-E-Mail, die sie zählt und auf das Dashboard verlinkt.
Die Grenze zählt pro Formular, ein Ansturm auf ein Formular bremst also kein anderes. Webhooks sind nicht begrenzt und feuern weiterhin für jede Einsendung.

Der Betreff der Sammel-E-Mail besteht aus der Anzahl und dem Formularnamen, und sie listet weder die Felder auf noch setzt sie ein Reply-To, also beantworte diese Nachrichten aus dem Dashboard. Wenn du regelmäßig über der Grenze liegst, ist E-Mail nicht der richtige Kanal für dieses Formular: Schick es stattdessen über einen Webhook an Slack oder ein gemeinsames Postfach.

Spam aus deinem Postfach heraushalten

E-Mail macht Spam teuer: Jeder Bot-Post ist eine Benachrichtigung, die jemand öffnet. Ikiform speichert Spam mit einer normalen Erfolgsantwort, der Bot lernt also nichts, und sendet keine E-Mail dafür. Vier Dinge entscheiden, was als Spam zählt:

AbwehrWas sie abfängtEinrichtung
HoneypotBots, die jedes Eingabefeld ausfüllenDas versteckte Eingabefeld _gotcha
Spam-BewertungLinks im Namensfeld, drei oder mehr Links, bekannte Spam-Phrasen, Wegwerfadressen und identische Wiederholungen. Ab 5 ist der Post SpamKeine
Erlaubte DomainsPosts von anderen SitesFüge deine Domain in den Einstellungen des Formulars hinzu
MenschlichkeitsprüfungBots, die einen echten Browser ausführenSetze Spam check auf Ikiform

Schau ab und zu in den Filter Spam im Dashboard. Wenn dort eine echte Nachricht landet, markiere sie als kein Spam, dann geht ihre E-Mail raus. Die Spam-Dokumentation erklärt jedes Signal, auch wann sich die Menschlichkeitsprüfung lohnt.

Was E-Mail nicht kann

Ikiform schickt der Person, die das Formular ausfüllt, keine E-Mail. Benachrichtigungs-E-Mails gehen nur an dich und dein Team, es gibt also keinen Autoresponder, keine Bestätigungs-E-Mail und kein Double-Opt-in. Verschicke sie aus deinem E-Mail-Tool, ausgelöst durch einen Webhook. Wenn deine Site „Wir haben deine Nachricht erhalten“ verspricht, zeig das nach dem Absenden auf der Seite an, wie es der Code oben schon tut.

  • Ein gemeinsames Team-Postfach. Füge die Team-Adresse als Empfänger hinzu oder leite sie über deinen Mail-Anbieter weiter.
  • Ein Chat-Kanal. Schick jede Einsendung per Webhook an Slack, Discord oder Microsoft Teams. Chat passt zu Formularen, die mehr als ein paar Nachrichten am Tag bekommen.
  • Eine Tabelle oder ein CRM. Google Sheets oder jedes Tool über Zapier oder n8n.
  • Anhänge. Datei-Uploads werden noch nicht unterstützt. Ein Post mit einer Datei bekommt 422 files_not_supported. Bitte stattdessen um einen Link zu einer geteilten Datei.

E-Mail abschalten

Manche Formulare sind ohne E-Mail besser, etwa eine stark genutzte Newsletter-Anmeldung. Schalte Email new submissions in den Einstellungen Notifications des Formulars aus. Einsendungen werden weiterhin gespeichert, und Webhooks feuern weiterhin.

Bei neuen Workspaces beginnt die Grenze niedriger: 10 E-Mails pro Formular und Stunde in den ersten 7 Tagen. Wenn du mit einem Skript testest, rechne früher mit einer Sammel-E-Mail als später.

Wähle deinen Fall

Das Setup oben ist überall gleich. Diese Seiten behandeln ein bestimmtes Postfach, einen bestimmten Stack oder das Tool, von dem du wegwechselst.

Prüfen, ob es funktioniert

Geh das durch, bevor du das Formular live schaltest. Ikiform hat keinen kostenlosen Tarif. Testen ist kostenlos: Ein Workspace ohne Tarif nimmt 50 Testeinsendungen pro Monat von localhost an. Für den Livebetrieb wähle Pro ab $6/Monat für 500 Einsendungen oder zahle einmalig: 10.000 Einsendungen für $49 oder 50.000 Einsendungen für $149, mit Guthaben, das nie verfällt. Siehe Preise.

  1. Füge unter Allowed domains des Formulars die Domain deiner Site hinzu, plus localhost, während du entwickelst. Lass das Feld leer, um Posts von überall anzunehmen.
  2. Prüfe in den Einstellungen Notifications des Formulars, ob Email new submissions an ist und die richtigen Leute angehakt sind.
  3. Füll das Formular auf deiner Seite aus und sende es ab. Du landest auf deiner Dankeseite oder der gehosteten von Ikiform.
  4. Öffne Submissions im Dashboard. Die neue Einsendung ist da, mit jedem Feld, das du gesendet hast.
  5. Öffne die Benachrichtigungs-E-Mail. Der Betreff ist New submission: plus der Name des Formulars, und jedes gesendete Feld ist aufgeführt.
  6. Klick auf Reply. Die Zeile To zeigt die Adresse, die du ins Formular getippt hast, nicht die von Ikiform.
  7. Sende einen Post mit ausgefülltem Honeypot, _gotcha=bot. Er bekommt trotzdem eine Erfolgsantwort, aber die Einsendung wird als Spam gespeichert und löst weder E-Mail noch Webhook aus.
  8. Nichts angekommen? Stell den Statusfilter im Dashboard auf Spam. Spam bekommt dieselbe Erfolgsantwort wie eine echte Einsendung.

Fehlerbehebung

ProblemWas zu tun ist
Die Einsendung ist im Dashboard, aber keine E-Mail kam anSchau zuerst in deinen Spam- oder Werbung-Ordner und füge notifications@ikiform.com zu deinen Kontakten hinzu. Prüfe dann die Einstellungen Notifications des Formulars: E-Mail ist vielleicht aus, bei einer externen Adresse steht vielleicht noch Waiting for confirmation, oder sie zeigt Emails bounced.
Die Einsendung ist im Dashboard, aber keine E-Mail und kein Webhook kam anSie wurde als Spam gespeichert. Spam löst nichts aus. Öffne sie unter dem Filter Spam, um die Gründe zu sehen, und markiere sie als kein Spam, um ihre E-Mail und Webhooks zu senden.
Reply geht an notifications@ikiform.comEs wurde kein Reply-To gefunden. Nenne das E-Mail-Feld email, email_address, your_email, reply_to oder contact_email, oder füge ein Feld _replyto mit der Adresse des Besuchers hinzu.
E-Mails hörten auf, und stattdessen kam eine Sammel-E-MailDas Formular hat 50 E-Mails in einer Stunde überschritten (10 bei einem neuen Workspace). Alles steht im Dashboard. Such unter Spam nach einem Bot-Ansturm oder nutze für stark genutzte Formulare einen Webhook.
_subject ändert den Betreff nicht_subject ändert nicht den Betreff der Benachrichtigungs-E-Mails. Es wird als meta.subject an Webhooks und die API weitergegeben.
403 origin_not_allowed, oder jeder Post landet im SpamDie Domain der Seite steht nicht unter Allowed domains des Formulars. Füge sie hinzu, plus localhost für lokale Tests. Subdomains einer eingetragenen Domain sind erlaubt.
422 validation_failedDer Post passt nicht zur Felddefinition des Formulars. error.fields nennt jedes Feld und den Grund. Gleiche den name des Eingabefelds an die Feld-ID an.
402 test_limit_reachedDer Workspace hat keinen Tarif und hat seine 50 kostenlosen localhost-Tests diesen Monat aufgebraucht. Wähle einen Tarif oder nutze Send test im Dashboard.

Fragen

Hängst du bei einem Schritt fest oder willst eine Anleitung für deinen Fall? Schreib an hello@ikiform.com.