integrazioni · framework

Un modulo di contatto Vue, senza backend.

Un modulo è la parte di Vue che meno necessita stato: tre campi, un’esecuzione e l’utente esce. Eppure si consiglia una route Express o funzione serverless il cui unico scopo è leggere tre stringhe e inoltrarle a un’API email.

Punta invece a mailcontact. Puoi farlo senza JavaScript oppure con @submit.prevent e FormData per restare sulla pagina e mostrare il tuo successo. In entrambi i casi il progetto non ha server.

configurazione consigliata

Usa lo script MailContact con il tuo design.

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.

contact.html
<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

Alternativa: integrazione diretta per Vue.

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.

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>

come funziona

Tre passaggi dall’inizio alla fine.

01

Crea una casella

Una casella per progetto. Ottieni subito endpoint ed email, prima di scrivere componenti.

02

Inserisci il componente

Incolla il blocco e cambia l’ID endpoint. Usa new FormData(event.target): i nomi del template sono quelli ricevuti. Nessun v-model o oggetto reattivo da sincronizzare.

03

Ricevi notifiche

Aggiungi un canale Discord, Slack, email o webhook. I messaggi ti raggiungono dove sei invece di restare in un database da ricordarti di controllare.

perché mailcontact

Pensato per funzionare con Vue.

Qui FormData è più adatto di v-model

Un modulo non richiede reattività a ogni tasto. Leggerlo una volta all’invio evita ref e logica di reset e offre gratis la validazione required nativa del browser.

Funziona in una semplice SPA Vite

Niente SSR, Nitro o adattatori. Lo stesso codice vale su Vite, Vue CLI o island Vue in altri siti: l’unica dipendenza a runtime è fetch.

La casella non è il tuo database

Fare da te significa scegliere dove inviare, poi costruire una schermata per leggere. La casella di progetto è quella schermata e riceve anche email a [email protected].

FAQ

Vue + mailcontact: le risposte

Un’app Vue può inviare email senza backend?

Non da solo. I browser non parlano SMTP e qualsiasi chiave API email in un componente Vue viene inviata al browser, dove tutti possono leggerla e abusarne. Il modulo deve inviare a un server; devi solo decidere se gestirlo tu. Un endpoint ti evita questo lavoro.

Serve davvero @submit.prevent?

No. Rimuovi il blocco script e assegna al modulo un semplice action verso l’endpoint: funziona senza JavaScript, ideale per una pagina prevalentemente statica. Usa @submit.prevent per restare sulla pagina e mostrare la tua conferma.

Come mostro gli errori di convalida?

Mantieni quella del browser. required, type="email" e pattern si applicano ancora perché è un vero elemento form. Per messaggi personalizzati, controlla event.target.checkValidity() prima della fetch e mostra il tuo testo.

Funziona con Options API o Vue 2?

Sì. Non dipende da script setup o Composition API: è un gestore che chiama fetch con FormData. Sposta submit in methods e sent in data e funziona con Options API, anche Vue 2 con lo stesso evento DOM.

correlati

Funziona anche con

Una casella per ogni progetto Vue che pubblichi.

Moduli e un vero indirizzo email insieme, con notifiche dove lavori. Inizia con un account gratuito.

Crea un modulo gratis

Non serve la carta di credito. Free include un progetto e 50 messaggi dal modulo al mese.