# Ein HTML-Formular ohne PHP an E-Mail senden

> Ersetze ein contact.php-Skript, das mail() aufruft, durch ein Formular, das an einen gehosteten Endpunkt sendet, mit deinen Feldnamen, deiner Dankeseite und Antworten.

Veröffentlicht am 2026-10-25 · https://ikiform.com/de/guides/send-form-to-email/without-php

Ändere die `action` des Formulars von deinem PHP-Skript auf die URL eines Formular-Backends, behalte die Feldnamen und lösche das Skript. Das Backend macht, was `mail()` gemacht hat, plus das, was es nie gut gemacht hat: Spamfilter, Speicherung und Mail, die nicht im Spam landet. Es funktioniert auf statischen Hosts, auf denen PHP gar nicht laufen kann.

## Was hier anders ist

Die meisten PHP-Kontaktformulare sind dieselben zwanzig Zeilen, vor Jahren aus einem Tutorial kopiert. Sie lesen `$_POST`, bauen einen String, rufen `mail()` auf und leiten weiter. Hier ein typisches:

`contact.php`:

```php
<?php
$name = $_POST["name"];
$email = $_POST["email"];
$phone = $_POST["phone"];
$message = $_POST["message"];

$to = "hello@example.com";
$subject = "Website enquiry from $name";
$body = "Name: $name\nEmail: $email\nPhone: $phone\n\n$message";
$headers = "From: $email\r\nReply-To: $email";

if (mail($to, $subject, $body, $headers)) {
  header("Location: /thanks.html");
} else {
  echo "Sorry, something went wrong.";
}
```

Es sieht harmlos aus und hat funktioniert, als es geschrieben wurde. Heute geht es auf vier Arten kaputt, und nur die erste ist offensichtlich:

| Problem | Warum es passiert |
| --- | --- |
| Kein PHP beim Host | GitHub Pages, Netlify, Vercel, Cloudflare Pages und S3 liefern Dateien aus; sie führen kein PHP aus. Das Formular sendet an eine Datei, die nie ausgeführt wird, und du bekommst `404` oder `405`. |
| Mail landet im Spam oder verschwindet | `mail()` übergibt die Nachricht an das lokale Mailprogramm des Servers. Der `From:`-Header gibt die Adresse des Besuchers an, aber die Mail verlässt den Server deines Hosts, fällt also bei den SPF- und DMARC-Prüfungen der Domain des Besuchers durch. Gmail und Outlook filtern oder lehnen sie ab, oft stillschweigend. |
| Header-Injection | `$email` landet ungeprüft in den Headern. Ein Bot, der einen Wert mit Zeilenumbruch sendet, kann eine eigene `Bcc:`-Zeile hinzufügen und dein Formular zum Spamversand nutzen, wodurch die IP deines Hosts auf Blocklisten landet. |
| Nichts wird aufbewahrt | Geht die E-Mail verloren, ist auch die Nachricht weg. Es gibt keinen Nachweis, keinen Spamfilter und keine Möglichkeit, auf die Anfragen des letzten Monats zurückzublicken. |

Du könntest jedes Problem einzeln beheben: jeden Wert validieren, über einen SMTP-Anbieter mit einer Bibliothek wie PHPMailer senden, SPF und DKIM für deine Domain einrichten, einen Honeypot und ein Rate-Limit hinzufügen und in eine Datenbank loggen. Das ist ein vernünftiges Projekt, wenn du ohnehin PHP betreibst. Wenn nicht, verlagere die Arbeit an ein Formular-Backend.

Diagramm: Dasselbe Formular mit PHPs mail() und mit einem Formular-Backend

1. Mit contact.php sendet das Formular an deinen Host, und mail() verschickt eine Nachricht, die angeblich vom Besucher kommt. Empfangende Server sehen einen Absender, der nicht zur Domain passt, und sortieren die Mail als Spam aus oder verwerfen sie.
2. Mit einem Formular-Backend sendet das Formular dieselben Felder an Ikiform. Ikiform verschickt die E-Mail von seiner eigenen Domain und setzt die Adresse des Besuchers in Reply-To, genau wofür Reply-To da ist.

Die Lösung für die Zustellbarkeit ist kein besseres Skript. Sie besteht darin, von einer Domain zu senden, die senden darf.

## Das Formular von PHP lösen

Behalte die Feldnamen exakt so, wie sie sind. Nur die `action` ändert sich, plus zwei versteckte Eingabefelder:

`Vorher`:

```html
<form action="/contact.php" method="post">
  <input name="name" required />
  <input name="email" type="email" required />
  <input name="phone" type="tel" />
  <textarea name="message" required></textarea>
  <button>Send</button>
</form>
```

`Nachher`:

```html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <input name="name" required />
  <input name="email" type="email" required />
  <input name="phone" type="tel" />
  <textarea name="message" required></textarea>
  <input type="hidden" name="_redirect" value="https://example.com/thanks.html" />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>
```

Ordne dann jede Aufgabe des Skripts der Stelle zu, wo sie jetzt erledigt wird:

| In contact.php | Jetzt |
| --- | --- |
| `$to = "hello@example.com"` | Empfänger in den Einstellungen **Notifications** des Formulars |
| `header("Location: /thanks.html")` | Das versteckte Eingabefeld `_redirect` oder **Redirect after submit** in den Einstellungen des Formulars |
| `Reply-To: $email` | Automatisch, weil das Feld `email` heißt |
| `$subject = "Website enquiry from $name"` | Fest auf `New submission: <form name>`. Nenne das Formular „Website enquiry“, um die Formulierung zu behalten |
| `echo "Sorry, something went wrong."` | Die Fehlerseite von Ikiform bei einem einfachen Post oder deine eigene Meldung mit `fetch` |
| Prüfungen, die du nie geschrieben hast | Der Honeypot `_gotcha`, Spam-Bewertung, Rate-Limits und Feldvalidierung |

- Füge deine Domain unter **Allowed domains** hinzu. `_redirect` funktioniert nur mit einer `https:`-URL auf einer dieser Domains.
- Lösch `contact.php` vom Server, sobald das neue Formular funktioniert. Ein vergessenes Skript ist für Bots, die sich die URL merken, weiterhin ein offenes Mail-Relay.
- Wenn du zu einem statischen Host umgezogen bist, existiert die alte URL `/contact.php` nicht mehr. Bots, die direkt dorthin senden, bekommen einen `404`, und das ist in Ordnung.

> Wenn dein Formular ein WordPress-Plugin statt eines Skripts war, gilt dasselbe Prinzip. Die [WordPress-Anleitung](https://ikiform.com/de/docs/guides/wordpress.md) zeigt, wo das Formular in einem Block-Theme hingehört.

## Prüfen, ob es funktioniert

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. Sende das Formular auf deiner Live-Seite ab. Du landest auf deiner alten `thanks.html`.
3. Öffne **Submissions** im Dashboard. Die neue Einsendung ist da, mit jedem Feld, das du gesendet hast.
4. Öffne die E-Mail. Sie kommt von Ikiform, nicht von der Adresse des Besuchers, und liegt nicht im Spam. Füge den Absender zu deinen Kontakten hinzu, damit auch spätere nicht dort landen.
5. Klick auf **Reply**. Die Adresse des Besuchers steht in der Zeile **To**.
6. 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.

## Stolperfallen

- **Alte Formularnamen mit Klammern.** PHP-Formulare verwenden oft Namen wie `contact[email]`. Ikiform speichert sie unverändert, aber das Reply-To kommt nur aus einem Feld namens `email` oder ein paar nahen Varianten. Benenne das Feld um oder füge `_replyto` hinzu.
- **Der Betreff kann den Namen nicht enthalten.** Die Betreffzeile des Skripts enthielt den Namen des Besuchers. Der Betreff der Benachrichtigung ist fest, und `_subject` wird an Webhooks und die API weitergegeben, ohne die E-Mail zu ändern.
- **Zeichenkodierung.** `mail()`-Skripte haben Umlaute und Akzente oft verunstaltet, weil sie nie einen Zeichensatz gesetzt haben. Die E-Mail von Ikiform ist UTF-8, Namen in jeder Schrift kommen also unversehrt an.
- **Mehrere Adressen in `$to`.** Eine Komma-Liste im Skript wird im Dashboard zu separaten Empfängern. Externe Adressen bestätigen per Link, bevor sie etwas bekommen. Siehe [mehrere Empfänger](https://ikiform.com/de/guides/send-form-to-email/multiple-recipients.md).

## Wenn etwas schiefgeht

| Problem | Was zu tun ist |
| --- | --- |
| Der Browser landet auf der Dankeseite von Ikiform statt auf deiner | `_redirect` wird ignoriert, außer seine Domain steht unter **Allowed domains** und es ist eine `https:`-URL. Füge die Domain hinzu oder setze stattdessen **Redirect after submit** in den Einstellungen des Formulars. |
| `403 origin_not_allowed`, oder jeder Post landet im Spam | Die 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. |
| Das Formular sendet noch an die PHP-Datei | Eine gecachte Seite oder eine zweite Kopie des Formulars, etwa ein Footer-Include, hat noch die alte `action`. Durchsuche die Site nach `contact.php`. |
| Die Einsendung ist im Dashboard, aber keine E-Mail und kein Webhook kam an | Sie 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. |

## Fragen

### Funktioniert mein altes Formular weiter, während ich umstelle?

Ja. Das alte Skript funktioniert weiter, bis du die action des Formulars änderst, du kannst also zuerst den neuen Endpunkt auf einer Kopie der Seite testen, dann umstellen und das Skript löschen.

### Kann ich ein HTML-Formular ohne PHP an E-Mail senden?

Ja. Richte die action des Formulars auf ein Formular-Backend statt auf ein PHP-Skript aus. Das Backend nimmt den Post an und schickt dir eine E-Mail, deine Site kann also einfaches HTML auf jedem statischen Host sein.

### Warum landen E-Mails von PHPs mail() im Spam?

Skripte setzen den From-Header meist auf die Adresse des Besuchers, aber die Mail verlässt den Server deines Hosts. Das fällt bei den SPF- und DMARC-Prüfungen der Domain des Besuchers durch, also behandeln Gmail und Outlook sie als gefälscht. Ein Formular-Backend sendet von seiner eigenen Domain und setzt den Besucher stattdessen in Reply-To.

### Muss ich meine Feldnamen ändern?

Nein. Ikiform speichert jeden Namen, den du sendest. Nenne das E-Mail-Feld weiterhin email, email_address, your_email, reply_to oder contact_email, oder füge ein Feld _replyto hinzu, damit Antworten an den Besucher gehen.

### Ist PHPMailer mit SMTP die bessere Option?

Es behebt die Zustellbarkeit, wenn du über einen Anbieter sendest, bei dem deine Domain für SPF und DKIM eingerichtet ist. Du brauchst trotzdem einen PHP-Host, Validierung, Spamfilter und einen Ort, an dem die Nachrichten aufbewahrt werden. Es ist eine gute Wahl, wenn du ohnehin PHP-Code pflegst.

## Weitere Anleitungen

- [Ein Formular an deine E-Mail senden](https://ikiform.com/de/guides/send-form-to-email.md): 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.
- [An Gmail](https://ikiform.com/de/guides/send-form-to-email/gmail.md): Bekomm Formulareinsendungen in Gmail ohne mailto:-Links, App-Passwörter oder Apps Script, dann beschrifte sie, halte sie aus dem Spam heraus und antworte aus Gmail.
- [Aus deinem Postfach antworten](https://ikiform.com/de/guides/send-form-to-email/reply-to.md): Sorg dafür, dass Antworten auf eine Formular-Benachrichtigung an die Person gehen, die das Formular ausgefüllt hat: welche Feldnamen funktionieren, wann _replyto nötig ist und warum Antworten fehlgehen.
- [Mehrere Empfänger](https://ikiform.com/de/guides/send-form-to-email/multiple-recipients.md): Mail ein Formular an dein ganzes Team oder leite jede Nachricht nach Thema an die richtige Person, ohne dass das Formular selbst bestimmt, wer die Mail bekommt.
- [Alternative zu EmailJS](https://ikiform.com/de/guides/send-form-to-email/emailjs-alternative.md): Lös ein Kontaktformular von EmailJS: warum E-Mail-Schlüssel im Browser ein Risiko sind, was sich im Code ändert und worauf du verzichtest, etwa die automatische Antwort.
- [Next.js](https://ikiform.com/de/guides/send-form-to-email/nextjs.md): Zwei Wege, ein Next.js-Formular per Server Action zu mailen: selbst mit Resend oder Nodemailer senden oder an ein Formular-Backend weiterleiten, ehrlich verglichen.
