Pas de serveur à greffer à votre SPA
Une compilation Vite ou CRA est statique. CORS permet au navigateur de parler directement à mailcontact. Sans proxy, fonction ni déploiement supplémentaire.
intégrations · framework
Une SPA React issue de Vite n’a pas de serveur pour les formulaires. Pas besoin d’en ajouter : envoyez un POST à mailcontact depuis le navigateur, CORS ouvert. Les messages arrivent en boîte avec alertes Discord, Slack, email ou webhook.
L’alternative API ci-dessous utilise formulaire, fetch et useState pour le succès. Sans Express, fonction serverless ou SDK email. La compilation reste statique.
Prefer zero JavaScript? A plain <form action="…" method="POST"> posts to the same endpoint. See the FAQ for the trade-off.
configuration recommandée
Ajoutez ce HTML à votre site, ou utilisez le générateur de formulaires. Remplacez le lien du formulaire par le vôtre. Le script hébergé injecte le contrôle caché, gère l’envoi et la vérification automatique, et conserve le brouillon en cas d’erreur. Vous contrôlez le HTML et le CSS. Les formulaires Free affichent un lien visible « Traité par mailcontact.app » ; Pro et Plus ne l’affichent pas. Les messages de retour suivent la langue du navigateur ; définissez data-mailcontact-language="fr" sur le formulaire pour imposer le français.
<form action="https://mailcontact.app/api/forms/your-form-id" method="POST" data-mailcontact-form lang="fr" data-mailcontact-language="fr">
<input type="hidden" name="_language" value="fr" />
<fieldset>
<legend>Contactez-nous</legend>
<label>
Nom (facultatif)
<input name="name" type="text" autocomplete="name" maxlength="200" />
</label>
<label>
Email
<input name="email" type="email" autocomplete="email" maxlength="320" required />
</label>
<label>
Message
<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>Site web
<input name="company_website" type="text" tabindex="-1" autocomplete="off" />
</label>
</div>
</noscript>
<button type="submit">Envoyer le message</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>Pour un composant doté de son propre gestionnaire d’envoi, chargez le même script et utilisez MailContact.prepare(form) et MailContact.send() au lieu du marqueur automatique. Voir la référence des interfaces personnalisées pour le chargement, les messages de retour et l’attribution Free.
l’extrait
Cet exemple appelle directement l’API. Gardez le champ requis company_website champ présent et vide. Les envois natifs ouvrent du JSON en cas de succès ou une page de vérification si nécessaire. Les scripts personnalisés sans vérification envoient les messages suspects dans les spams pour examen ; les spams manifestes y sont aussi retenus sans notification ni consommation du quota. Un succès confirme la réception, y compris pour examen, ou l’abandon silencieux d’un contrôle rempli. Voir protection antispam pour le comportement complet.
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>
);
}fonctionnement
Une boîte par projet. Nommez-la comme l’application pour obtenir immédiatement point de réception et adresse.
Collez ContactForm.tsx, remplacez l’identifiant et affichez-le dans route, pied de page ou modale. Les styles vous appartiennent.
Ajoutez Discord, Slack, email ou webhook. Les messages livrés vous alertent dans vos outils.
pourquoi mailcontact
Une compilation Vite ou CRA est statique. CORS permet au navigateur de parler directement à mailcontact. Sans proxy, fonction ni déploiement supplémentaire.
fetch et useState gardent les visiteurs dans l’application : bouton désactivé pendant l’envoi, remerciement après succès. Aucune sortie du routeur client.
Un composant de formulaire simple, sans widget ni iframe. Utilisez Tailwind, CSS Modules, styled-components ou vos styles existants.
FAQ
Exact. Le point de réception accepte les POST de toute origine (CORS est ouvert), donc le navigateur envoie directement à mailcontact. Votre application React peut être déployée en fichiers statiques, sans aucune fonction.
Envoyez avec fetch comme dans l’exemple et modifiez un état useState lorsque la réponse est ok. Les envois natifs renvoient actuellement du JSON au lieu de rediriger vers le site (aucune redirection configurable), donc fetch convient aujourd’hui à une SPA.
Envoyez email et message (obligatoires), name et subject (facultatifs), et le contrôle company_website vide, au format FormData ou JSON. Les requêtes sont limitées à 20 par minute et par IP, avec un corps de 64 Ko maximum, largement suffisant pour un formulaire.
Oui. mailcontact reçoit le POST : créez le formulaire à votre guise (react-hook-form, champs contrôlés, kit UI) avec email, message et company_website vide. name et subject sont facultatifs ; MailContact.send() gère la vérification dans une interface personnalisée.
voir aussi
Formulaires et vraie adresse email, ensemble, avec des notifications dans vos outils. Commencez gratuitement.
Créer mon formulaireAucune carte bancaire requise. Free comprend un projet et 50 messages de formulaire par mois.