Das Bundle bleibt ein Bundle
Eine mit Vite gebaute Svelte-App ist ein Ordner für jeden statischen Host. Ein eigener Formulardienst würde meist einen Server erfordern. Hier bleibt dein Deployment unverändert.
Integrationen · framework
Svelte ohne SvelteKit kompiliert nur Browser-JavaScript. Kein Server. Genau darum passt es zu Widgets, Landingpages und Islands. Ein Formular hat so aber kein Empfangsziel.
Ein Backend nur für drei Felder zu pflegen ist unnötig. Ein Mailcontact-Endpunkt hält die Bereitstellung statisch: Projektpostfach und Discord-, Slack-, E-Mail- oder Webhook-Meldungen.
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>
let sent = $state(false);
let error = $state(false);
async function submit(event) {
const res = await fetch("https://mailcontact.app/api/forms/your-form-id", {
method: "POST",
body: new FormData(event.currentTarget),
});
if (res.ok) sent = true;
else error = true;
}
</script>
{#if sent}
<p>Thanks. We'll be in touch.</p>
{:else}
<form onsubmit={(e) => { e.preventDefault(); submit(e); }}>
<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></textarea>
<input name="company_website" type="text" tabindex="-1" autocomplete="off"
style="position:absolute;left:-10000px" aria-hidden="true" />
<button>Send</button>
{#if error}<p role="alert">That didn't send. Try again?</p>{/if}
</form>
{/if}so funktioniert es
Ein Postfach pro Projekt, mit sofort verfügbarem Endpunkt und Projektadresse.
Füge es in deinen Komponentenbaum ein und ersetze die Endpunkt-ID. Beim Absenden liest es das form-Element; name-Attribute werden die Postfachfelder.
Füge Discord, Slack, E-Mail oder Webhook hinzu. Nachrichten erreichen dich bei Eingang.
warum Mailcontact
Eine mit Vite gebaute Svelte-App ist ein Ordner für jeden statischen Host. Ein eigener Formulardienst würde meist einen Server erfordern. Hier bleibt dein Deployment unverändert.
new FormData(event.currentTarget) braucht keine Bindings, Eingabewerte oder Reset-Logik. Native required- und Typprüfungen laufen vor dem Handler.
Svelte-Komponenten werden oft fremd eingebettet. Dank CORS funktioniert das Formular auf jeder einbettenden Domain.
FAQ
SvelteKit bietet echte serverseitige Formularaktionen. Hier entscheidet der Adapter, ob sie laufen können. Einfaches Svelte bietet gar keinen Server. Das Formular muss daher ohnehin extern senden. Für SvelteKit lies stattdessen die SvelteKit-Anleitung.
Ja. Das Beispiel nutzt Runes ($state) und onsubmit aus Svelte 5. Mit Svelte 4 nutze let sent = false und on:submit|preventDefault={submit}. fetch und FormData bleiben gleich, da sie keine Framework-Funktionen sind.
Nein, sie ist bewusst öffentlich wie eine Google-Formular-URL. Sie nimmt nur Einsendungen für ein Postfach an und erlaubt kein Auslesen. Serverseitige Limits, Inhaltsprüfungen und Kampagnenerkennung schützen den Empfang. Das verborgene Prüffeld fängt einfache Bots ab. Verdächtige Nachrichten können eine Prüfung erfordern oder in Spam landen.
Ja, aber nicht mit einem Webhook im Svelte-Code. Eine Webhook-URL in einer Komponente wird jedem Browser ausgeliefert. Wer sie liest, kann in deinen Kanal posten. Füge Discord stattdessen als Benachrichtigungsziel im Postfach hinzu: Die Weiterleitung bleibt serverseitig, die URL ebenfalls.
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.