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.
Integrationen · framework
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
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.
<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
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.
<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
Ein Postfach pro Projekt. Endpunkt und Projektadresse sind vor dem Hinzufügen der Seite aktiv.
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.
Füge Discord, Slack, E-Mail oder Webhook hinzu. Einsendungen erreichen dich sofort.
warum Mailcontact
Eine Nitro-Route verhindert rein statische Ausgabe. Mit externem Formular bleibt nuxt generate und Hosting als Dateien jederzeit möglich.
Eigenbau braucht einen Mailanbieter-Schlüssel: geheim halten, speichern und je Host konfigurieren. Hier gibt es keinen Schlüssel zum Leaken oder Rotieren.
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
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.
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.
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.
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
Formulare und echte E-Mail-Adresse vereint, mit Benachrichtigungen in deinen Tools. Starte mit einem kostenlosen Konto.
Kostenloses Formular erstellenKeine Kreditkarte nötig. Free umfasst ein Projekt und 50 Formularnachrichten pro Monat.