Integrationen · framework

Ein Vue-Kontaktformular ohne Backend dahinter.

Ein Kontaktformular braucht kaum reaktiven State: drei Felder, einmal senden, fertig. Trotzdem wird oft Express oder Serverless nur zum Lesen dreier Strings und Weiterleiten an eine Mail-API empfohlen.

Nutze stattdessen einen Mailcontact-Endpunkt. Ganz ohne JavaScript oder mit @submit.prevent und FormData für eigene Erfolgsanzeige ohne Seitenwechsel. Beides ohne Server im Projekt.

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

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.vue
<script setup>
import { ref } from "vue";

const sent = ref(false);
const sending = ref(false);

async function submit(event) {
  sending.value = true;
  await fetch("https://mailcontact.app/api/forms/your-form-id", {
    method: "POST",
    body: new FormData(event.target),
  });
  sending.value = false;
  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 :disabled="sending">{{ sending ? "Sending..." : "Send" }}</button>
  </form>
</template>

so funktioniert es

Drei Schritte, vom Start bis zum Ziel.

01

Postfach erstellen

Ein Postfach pro Projekt mit sofortigem Endpunkt und Projektadresse, bevor du Komponenten schreibst.

02

Komponente einfügen

Füge den Block ein und ersetze die Endpunkt-ID. new FormData(event.target) liest die name-Felder der Vorlage. Keine v-model-Bindings oder reaktiven Objekte nötig.

03

Benachrichtigt werden

Füge Discord, Slack, E-Mail oder Webhook hinzu. Nachrichten erreichen dich, statt in einer ungeprüften Datenbank zu warten.

warum Mailcontact

Passt gut zu Vue.

FormData ist hier besser als v-model

Ein Kontaktformular braucht keine Reaktion auf jeden Tastendruck. Einmaliges Lesen beim Absenden spart refs und Reset-Logik und behält native required-Validierung.

Funktioniert in einer einfachen Vite-SPA

Ohne SSR, Nitro oder Adapter. Derselbe Code für Vite, Vue CLI und eingebettete Vue-Islands. Nur fetch wird zur Laufzeit benötigt.

Dein Postfach ist keine Datenbank

Eigenbau braucht Empfangsziel und Leseoberfläche. Ein Projektpostfach ist diese Oberfläche und empfängt auch [email protected].

FAQ

Vue + Mailcontact, beantwortet

Kann eine Vue-App E-Mails ohne Backend senden?

Nicht allein. Browser können kein SMTP. Jeder API-Schlüssel in einer Vue-Komponente wird an den Browser ausgeliefert und kann missbraucht werden. Das Formular muss an einen Server senden. Mit einem Endpunkt musst du diesen nicht selbst pflegen.

Brauche ich @submit.prevent überhaupt?

Nein. Entferne den Skriptblock und gib dem Formular action mit deinem Endpunkt. Das funktioniert ohne JavaScript und passt gut zu statischen Marketingseiten. Nutze @submit.prevent, wenn du auf der Seite bleiben und eine eigene Erfolgsanzeige darstellen möchtest.

Wie zeige ich Validierungsfehler?

Nutze die Browservalidierung. required, type="email" und pattern gelten weiter, weil es ein echtes Formularelement ist. Für eigene Meldungen prüfe event.target.checkValidity() vor fetch und zeige passende Texte an.

Funktioniert das mit Options API oder Vue 2?

Ja. Es hängt weder von script setup noch Composition API ab. Ein Submit-Handler sendet fetch mit FormData. Verschiebe submit nach methods und sent nach data; dann läuft es auch mit Options API einschließlich Vue 2 und demselben DOM-Ereignis.

verwandt

Funktioniert auch mit

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