Integrationen · framework

Ein React-Kontaktformular ohne eigenes Backend.

Eine React-SPA hat hinter dem Vite-Build keinen Server für Formulare. Du brauchst keinen zusätzlichen. Sende Felder direkt vom Browser an Mailcontact. Offenes CORS unterstützt jede Herkunft. Nachrichten landen im Projektpostfach mit Discord, Slack, E-Mail oder Webhook.

Das direkte API-Beispiel nutzt form, fetch und ein useState-Erfolgsflag. Ohne Express, Serverless-Funktion oder Mail-SDK. Dein Build bleibt statisch.

Prefer zero JavaScript? A plain <form action="…" method="POST"> posts to the same endpoint. See the FAQ for the trade-off.

empfohlene Einrichtung

Nutze das MailContact-Skript mit deinem eigenen Design.

Füge dieses HTML auf deiner Website ein oder verwende den Formulargenerator. Ersetze den Formularlink durch deinen. Das gehostete Skript fügt die verborgene Prüfung ein, übernimmt Versand und Verifizierung und bewahrt Entwürfe bei Fehlern. Du bestimmst HTML und CSS. Free-Formulare zeigen einen sichtbaren Link „Processed by mailcontact.app“, Pro und Plus nicht. Die Rückmeldung folgt der Browsersprache. Setze data-mailcontact-language="fr" am Formular, um Französisch festzulegen.

contact.html
<form action="https://mailcontact.app/api/forms/your-form-id" method="POST" data-mailcontact-form lang="de" data-mailcontact-language="de">
  <input type="hidden" name="_language" value="de" />
  <fieldset>
    <legend>Kontaktiere uns</legend>
    <label>
      Name (optional)
      <input name="name" type="text" autocomplete="name" maxlength="200" />
    </label>
    <label>
      E-Mail
      <input name="email" type="email" autocomplete="email" maxlength="320" required />
    </label>
    <label>
      Nachricht
      <textarea name="message" rows="5" maxlength="5000" required></textarea>
    </label>
    <noscript>
    <div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden;">
      <label>Website
        <input name="company_website" type="text" tabindex="-1" autocomplete="off" />
      </label>
    </div>
    </noscript>
    <button type="submit">Nachricht senden</button>
  </fieldset>
  <p data-contact-status role="status" aria-live="polite" aria-atomic="true"></p>
</form>
<script defer src="https://mailcontact.app/forms/v1.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

Für Komponenten mit eigenem Submit-Handler lade dasselbe Skript und nutze MailContact.prepare(form) und MailContact.send() statt der automatischen Markierung. Siehe die Referenz für eigene Oberflächen für Laden, Rückmeldungen und Quellenhinweis bei Free.

das Snippet

Alternative: eine direkte Integration für React.

Dieses Beispiel sendet direkt an die API. Behalte das erforderliche company_website Feld vorhanden und leer. Native Einsendungen öffnen bei Erfolg JSON oder bei Bedarf eine Prüfseite. Eigene Skripte ohne Verifizierung senden verdächtige Nachrichten zur Prüfung in Spam; deutlicher Spam wird ebenfalls ohne Benachrichtigung und Kontingentverbrauch zurückgehalten. Eine Erfolgsantwort bestätigt den Empfang einschließlich Prüfung oder das stille Verwerfen eines ausgefüllten Prüffelds. Siehe Spamschutz für das vollständige Verhalten.

src/components/ContactForm.tsx
import { useState } from "react";

export default function ContactForm() {
  const [status, setStatus] = useState<"idle" | "sending" | "sent" | "error">("idle");

  async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
    event.preventDefault();
    const data = new FormData(event.currentTarget);
    setStatus("sending");
    try {
      const res = await fetch("https://mailcontact.app/api/forms/your-form-id", {
        method: "POST",
        body: data,
      });
      setStatus(res.ok ? "sent" : "error");
    } catch {
      setStatus("error");
    }
  }

  if (status === "sent") {
    return <p>Thanks! Your message is on its way.</p>;
  }

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" name="name" placeholder="Your name" />
      <input type="email" name="email" placeholder="[email protected]" required />
      <textarea name="message" placeholder="What's on your mind?" required />
      <button type="submit" disabled={status === "sending"}>
        {status === "sending" ? "Sending…" : "Send"}
      </button>
      {status === "error" && <p>Something went wrong. Please try again.</p>}
      <input name="company_website" type="text" tabIndex={-1} autoComplete="off"
        style={{ position: "absolute", left: "-10000px" }} aria-hidden="true" />
    </form>
  );
}

so funktioniert es

Drei Schritte, vom Start bis zum Ziel.

01

Postfach erstellen

Ein Postfach pro Projekt. Benenne es nach deiner App und erhalte sofort Endpunkt und Projektadresse.

02

Komponente einfügen

Füge ContactForm.tsx ein, ersetze die Formular-ID und nutze sie in Route, Footer oder Modal. Das Markup gestaltest du selbst.

03

Benachrichtigt werden

Füge Discord, Slack, E-Mail oder Webhook hinzu. Zugestellte Nachrichten erreichen dich in deinen gewohnten Tools.

warum Mailcontact

Passt gut zu React.

Kein Server als Anbau an deine SPA

Vite- und CRA-Builds sind statische Dateien. CORS erlaubt direkten Browserkontakt mit Mailcontact. Ohne Proxy, Serverless oder zusätzliche Bereitstellung.

Erfolgszustände, die zu React passen

fetch und useState halten Besucher in deiner App: Button beim Senden sperren, danach Danke anzeigen. Kein Verlassen des Clientrouters.

Dein JSX, dein Designsystem

Eine normale Formularkomponente, kein Widget oder iframe. Nutze Tailwind, CSS Modules, styled-components oder dein übliches Styling.

FAQ

React + Mailcontact, beantwortet

Brauche ich wirklich kein Backend oder keine Serverless-Funktion?

Ja. Der Endpunkt akzeptiert herkunftsübergreifende POST-Anfragen mit offenem CORS. Der Browser sendet direkt an Mailcontact. Deine React-App kann rein statisch und ganz ohne Funktionen bereitgestellt werden.

Wie zeige ich Erfolg, ohne die Seite zu verlassen?

Sende wie im Beispiel mit fetch und ändere ein useState-Flag bei erfolgreicher Antwort. Native Einsendungen zeigen derzeit JSON statt Rückleitung zur Website. Eine konfigurierbare Weiterleitung fehlt derzeit; für SPAs passt fetch daher am besten.

Welche Felder akzeptiert der Endpunkt und welche Grenzen gelten?

Sende email und message als Pflichtfelder, optional name und subject sowie das erforderliche leere company_website-Prüffeld als FormData oder JSON. Es gelten 20 Anfragen pro Minute und IP bei höchstens 64 KB Inhalt, genug für Kontaktformulare.

Kann ich react-hook-form oder meine Komponentenbibliothek nutzen?

Ja. Mailcontact sieht nur den POST. Baue mit react-hook-form, gesteuerten Feldern oder UI-Kit, solange email, message und das leere company_website-Prüffeld mitgesendet werden. name und subject sind optional. MailContact.send() übernimmt die automatische Prüfung für eigene Oberflächen.

verwandt

Funktioniert auch mit

Ein Postfach für jedes deiner React-Projekte.

Formulare und echte E-Mail-Adresse vereint, mit Benachrichtigungen in deinen Tools. Starte mit einem kostenlosen Konto.

Kostenloses Formular erstellen

Keine Kreditkarte nötig. Free umfasst ein Projekt und 50 Formularnachrichten pro Monat.