integrazioni · framework

Un modulo di contatto per React, senza creare un backend.

Una SPA React non ha dove inviare: dietro una build Vite non c’è server. Non serve aggiungerlo. Invia i campi con POST dal browser a mailcontact (CORS aperto a ogni origine) e ricevi nella casella con avvisi Discord, Slack, email o webhook.

L’alternativa API diretta sotto usa un modulo, una fetch e un flag useState per il successo. Niente Express, funzioni serverless o SDK email. La build resta un insieme di file statici.

Prefer zero JavaScript? A plain <form action="…" method="POST"> posts to the same endpoint. See the FAQ for the trade-off.

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

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.tsx
import { useState } from "react";

export default function ContactForm() {
  const [status, setStatus] = useState<"idle" | "sending" | "sent" | "error">("idle");

  async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
    event.preventDefault();
    const data = new FormData(event.currentTarget);
    setStatus("sending");
    try {
      const res = await fetch("https://mailcontact.app/api/forms/your-form-id", {
        method: "POST",
        body: data,
      });
      setStatus(res.ok ? "sent" : "error");
    } catch {
      setStatus("error");
    }
  }

  if (status === "sent") {
    return <p>Thanks! Your message is on its way.</p>;
  }

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" name="name" placeholder="Your name" />
      <input type="email" name="email" placeholder="[email protected]" required />
      <textarea name="message" placeholder="What's on your mind?" required />
      <button type="submit" disabled={status === "sending"}>
        {status === "sending" ? "Sending…" : "Send"}
      </button>
      {status === "error" && <p>Something went wrong. Please try again.</p>}
      <input name="company_website" type="text" tabIndex={-1} autoComplete="off"
        style={{ position: "absolute", left: "-10000px" }} aria-hidden="true" />
    </form>
  );
}

come funziona

Tre passaggi dall’inizio alla fine.

01

Crea una casella

Una casella per progetto. Chiamala come l’app e ottieni subito endpoint modulo ed email.

02

Inserisci il componente

Incolla ContactForm.tsx, inserisci l’ID modulo e usalo ovunque: route, piè di pagina, modale. Il markup è tuo da ristilizzare.

03

Ricevi notifiche

Aggiungi Discord, Slack, email o webhook. I messaggi consegnati ti avvisano dove sei già.

perché mailcontact

Pensato per funzionare con React.

Nessun server da affiancare alla SPA

Una build Vite o CRA è fatta di file statici. L’endpoint accetta richieste da origini diverse, quindi il browser parla direttamente a mailcontact. Nessun proxy, funzione serverless o deploy aggiuntivo.

Conferme di invio in stile React

fetch e useState mantengono il visitatore nell’app: disabilita il pulsante durante l’invio e mostra un ringraziamento al successo. Nessuna navigazione completa fuori dal router client.

Il tuo JSX, il tuo design system

È un componente form semplice, non widget o iframe. Stilizzalo con Tailwind, CSS Modules, styled-components o gli strumenti del resto dell’app.

FAQ

React + mailcontact: le risposte

Davvero non serve un backend o una funzione serverless?

Esatto. L’endpoint accetta POST da origini diverse (CORS aperto), quindi il browser invia direttamente a mailcontact. Puoi pubblicare l’app React come semplici file statici, senza funzioni.

Come mostro un messaggio di successo senza lasciare la pagina?

Invia con fetch come nello snippet e cambia un flag useState quando la risposta è ok. Gli invii nativi restituiscono attualmente JSON anziché reindirizzare al sito (il reindirizzamento configurabile non è disponibile), quindi fetch è oggi adatto a una SPA.

Quali campi accetta l’endpoint e quali sono i limiti?

Invia email e message (obbligatori), name e subject facoltativi e company_website obbligatorio e vuoto come FormData o JSON. Limite di 20 richieste al minuto per IP e corpo massimo di 64KB, ampio per un modulo di contatto.

Posso usare react-hook-form o la mia libreria di componenti?

Sì. mailcontact vede solo il POST: costruisci il modulo come vuoi (react-hook-form, input controllati, kit UI), purché invii email, message e company_website obbligatorio e vuoto. Name e subject sono facoltativi; MailContact.send() gestisce la verifica automatica nell’interfaccia personalizzata.

correlati

Funziona anche con

Una casella per ogni progetto React 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.