Il bundle resta un bundle
Un’app Svelte compilata con Vite è una cartella di file pubblicabile su ogni hosting statico. Aggiungere moduli richiederebbe normalmente un server; così l’artefatto pubblicato mantiene la stessa forma.
integrazioni · framework
Svelte senza SvelteKit compila solo JavaScript per il browser. Nessun server: per questo si sceglie per widget, landing page o island in siti altrui. Significa però che il modulo non ha una destinazione.
Il rimedio comune introduce un backend, poi mantieni un servizio per tre campi. Un endpoint mailcontact mantiene il deploy statico: gli invii arrivano nella casella con avvisi Discord, Slack, email o webhook.
configurazione consigliata
Aggiungi questo HTML al sito oppure usa generatore di moduli. Sostituisci il link del modulo con il tuo. Lo script ospitato inserisce il controllo nascosto, gestisce invio e verifica automatica e conserva la bozza in caso di errore. Tu controlli HTML e CSS. I moduli Free mostrano un link visibile “Processed by mailcontact.app”; Pro e Plus no. I messaggi seguono la lingua del browser; imposta data-mailcontact-language="fr" sul modulo per impostare il francese.
<form action="https://mailcontact.app/api/forms/your-form-id" method="POST" data-mailcontact-form lang="it" data-mailcontact-language="it">
<input type="hidden" name="_language" value="it" />
<fieldset>
<legend>Contattaci</legend>
<label>
Nome (facoltativo)
<input name="name" type="text" autocomplete="name" maxlength="200" />
</label>
<label>
Email
<input name="email" type="email" autocomplete="email" maxlength="320" required />
</label>
<label>
Messaggio
<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>Sito web
<input name="company_website" type="text" tabindex="-1" autocomplete="off" />
</label>
</div>
</noscript>
<button type="submit">Invia messaggio</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>Per un componente con un proprio gestore di invio, carica lo stesso script e usa MailContact.prepare(form) e MailContact.send() al posto del marcatore automatico. Consulta riferimento per interfacce personalizzate per caricamento, messaggi e attribuzione Free.
lo snippet
Questo esempio invia direttamente all’API. Mantieni il campo obbligatorio company_website presente e vuoto. Gli invii nativi aprono JSON in caso di successo o una pagina di verifica se serve. Gli script personalizzati senza supporto alla verifica inviano i messaggi sospetti in Spam per revisione; anche lo spam evidente resta lì senza notifiche né consumo di quota. Una risposta di successo conferma la ricezione, anche per revisione, oppure lo scarto silenzioso di un controllo compilato. Vedi protezione antispam per il comportamento completo.
<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}come funziona
Una casella per progetto, con endpoint del modulo e indirizzo email subito disponibili.
Incollalo nell’albero dei componenti e cambia l’ID endpoint. Legge l’elemento form all’invio: i name nel markup sono i campi che arrivano nella casella.
Aggiungi Discord, Slack, email o webhook e il messaggio ti raggiunge appena arriva.
perché mailcontact
Un’app Svelte compilata con Vite è una cartella di file pubblicabile su ogni hosting statico. Aggiungere moduli richiederebbe normalmente un server; così l’artefatto pubblicato mantiene la stessa forma.
Leggere new FormData(event.currentTarget) evita binding: nessun valore per input o reset dopo invio; required e controlli di tipo del browser avvengono prima del gestore.
I componenti Svelte sono spesso compilati in pagine altrui. L’endpoint accetta POST da altre origini: il modulo funziona da ogni dominio in cui viene incorporato.
FAQ
SvelteKit ha form action, veri gestori server: devi decidere se mantenere un adattatore che le esegua. Svelte semplice non ha server, quindi il modulo deve comunque inviare all’esterno. Se usi SvelteKit, leggi la relativa guida.
Sì. L’esempio usa rune ($state) e onsubmit di Svelte 5. Su Svelte 4 usa let sent = false con on:submit|preventDefault={submit}. fetch e FormData restano uguali perché non sono funzioni del framework.
No, e non viene trattato come tale. Compare appositamente nel markup pubblico, come l’URL di un Google Form. Accetta solo invii in una casella e non permette di leggerla: limiti sul server, controlli contenuti e rilevamento campagne proteggono la ricezione. Il controllo nascosto ferma alcuni bot semplici; i messaggi sospetti possono richiedere verifica o finire in Spam per revisione.
Sì, ma non con un webhook nel codice Svelte. Un URL Discord in un componente arriva al browser di ogni visitatore e chi lo legge può pubblicare nel canale. Aggiungi invece Discord alle notifiche della casella: l’inoltro avviene sul server e l’URL resta lì.
correlati
Moduli e un vero indirizzo email insieme, con notifiche dove lavori. Inizia con un account gratuito.
Crea un modulo gratisNon serve la carta di credito. Free include un progetto e 50 messaggi dal modulo al mese.