Integrationen · framework

Ein Nuxt-Kontaktformular, das nuxt generate übersteht.

Nuxt hat einen Server: Eine Datei in server/api/ ergibt mit Nitro einen echten Endpunkt. Nach nuxt generate auf einem CDN fehlt jedoch die Laufzeit. server/api/contact.post.ts wird kompiliert, aber nirgendwo ausführbar bereitgestellt.

Das trifft gerade Nutzer, die Nuxt wegen statischer Ausgabe wählen. Ein Mailcontact-Endpunkt funktioniert unverändert mit nuxt build auf Node, nuxt generate im CDN und künftigen Host-Presets.

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 Nuxt.

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.

pages/contact.vue
<script setup>
// No server/api/contact.post.ts. Nothing here needs Nitro at runtime,
// so `nuxt generate` keeps this page fully working.
const sent = ref(false);

async function submit(event) {
  await $fetch("https://mailcontact.app/api/forms/your-form-id", {
    method: "POST",
    body: new FormData(event.target),
  });
  sent.value = true;
}
</script>

<template>
  <p v-if="sent">Thanks. We'll be in touch.</p>

  <form v-else @submit.prevent="submit">
    <input name="name" placeholder="Your name" required />
    <input name="email" type="email" placeholder="[email protected]" required />
    <textarea name="message" placeholder="What's on your mind?" required />
    <input name="company_website" type="text" tabindex="-1" autocomplete="off"
      style="position:absolute;left:-10000px" aria-hidden="true" />

    <button>Send</button>
  </form>
</template>

so funktioniert es

Drei Schritte, vom Start bis zum Ziel.

01

Postfach erstellen

Ein Postfach pro Projekt. Endpunkt und Projektadresse sind vor dem Hinzufügen der Seite aktiv.

02

Seite hinzufügen

Füge es in pages/contact.vue ein und ersetze die Endpunkt-ID. Keine server/-Datei, kein runtimeConfig-Eintrag und kein Geheimschlüssel im Client-Bundle.

03

Benachrichtigt werden

Füge Discord, Slack, E-Mail oder Webhook hinzu. Einsendungen erreichen dich sofort.

warum Mailcontact

Passt gut zu Nuxt.

Statische Ausgabe bleibt möglich

Eine Nitro-Route verhindert rein statische Ausgabe. Mit externem Formular bleibt nuxt generate und Hosting als Dateien jederzeit möglich.

Kein Mail-Schlüssel in runtimeConfig

Eigenbau braucht einen Mailanbieter-Schlüssel: geheim halten, speichern und je Host konfigurieren. Hier gibt es keinen Schlüssel zum Leaken oder Rotieren.

Das Preset spielt keine Rolle mehr

Nitro-Presets unterscheiden sich je Host. Serverrouten können sich unterschiedlich verhalten. Markup mit externer URL läuft überall gleich und berührt kein Preset.

FAQ

Nuxt + Mailcontact, beantwortet

Kann ich stattdessen eine Nuxt-Serverroute nutzen?

Ja, wenn du einen Server bereitstellst. server/api/contact.post.ts läuft mit nuxt build und Node- oder Serverless-Preset. Bei nuxt generate fehlt die Nitro-Laufzeit für POST. Wenn statische Ausgabe wichtig ist, halte das Formular außerhalb des Server-Graphen.

Funktioniert das mit Nuxt 3 und Nuxt 4?

Ja. Das Beispiel nutzt nur ref, $fetch und @submit.prevent, stabil in beiden Versionen. Du kannst $fetch durch fetch ersetzen. FormData bleibt gleich, ohne Abhängigkeit von Nuxt-Fetch.

Sollte ich hier useFetch nutzen?

Nein. useFetch ist für Renderdaten gedacht und dedupliziert sowie cached. Für einen einmaligen POST nach Klick ist das falsch. Rufe $fetch oder fetch direkt im Submit-Handler auf.

Wie halte ich Spam ohne Captcha fern?

company_website muss vorhanden und leer sein. Ausfüllen verwirft still, gute Bots können es aber überspringen. MailContact nutzt zusätzlich serverseitige Limits, Inhalts- und Kampagnenprüfungen. Das gehostete Skript verifiziert bei Bedarf automatisch. Deutlicher Spam bleibt ohne Benachrichtigung oder Kontingentverbrauch zur Prüfung zurückgehalten.

verwandt

Funktioniert auch mit

Ein Postfach für jedes deiner Nuxt-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.