Ton site doit envoyer des emails, et le mail() PHP ne suffit plus
Un formulaire de contact, une confirmation de commande, un lien « mot de passe oublié » : dès que ton site doit envoyer un email, tu as besoin d’une brique fiable. Et c’est là que beaucoup de projets se cassent les dents.
Pendant vingt ans, la solution par défaut a été la fonction mail() de PHP. Elle marche en théorie. En pratique, elle envoie depuis l’IP de ton serveur d’hébergement, sans authentification, sans signature. Résultat : tes mails finissent en spam, ou disparaissent purement et simplement. Pire, tu n’es même pas prévenu.
L’alternative moderne, c’est une API d’email transactionnel. Et Resend est aujourd’hui la plus simple à mettre en place, surtout sur un site déployé en JavaScript (Astro, Next.js, etc.). Voici comment passer de zéro à ton premier email envoyé, proprement.
C’est quoi Resend, et pourquoi pas juste un SMTP bricolé
Resend est un service qui prend en charge l’envoi de tes emails à ta place. Tu lui envoies une requête HTTP — « voici l’expéditeur, le destinataire, le sujet et le contenu » — et c’est lui qui gère la partie difficile : réputation des serveurs d’envoi, signature des messages, files d’attente, gestion des rebonds.
Trois raisons concrètes de l’utiliser plutôt que le mail() PHP ou un SMTP monté à la main :
- Fiabilité. Resend envoie depuis des IP dédiées à la délivrabilité, surveillées en permanence. Ton serveur d’hébergement mutualisé, lui, partage son IP avec des centaines de sites, dont certains spamment. Tu hérites de leur mauvaise réputation.
- Délivrabilité. Resend te guide pour poser SPF, DKIM et DMARC sur ton domaine. Sans ces enregistrements, Gmail et Outlook te filtrent quoi que tu fasses. (On y revient : c’est l’étape qui décide de tout.)
- Simplicité. Une clé API, un appel HTTP, c’est tout. Pas de port SMTP à débloquer, pas de mot de passe à stocker côté serveur, pas de configuration
postfixà déboguer à 23 h.
Pour le détail de la mécanique d’authentification (à quoi servent exactement SPF, DKIM et DMARC), lis notre guide dédié : email pro en spam : régler SPF, DKIM et DMARC. C’est le socle de tout ce qui suit.
Étape 1 : créer un compte Resend
Va sur resend.com et crée un compte. L’inscription est gratuite, et le plan gratuit te donne 3 000 emails par mois (100 par jour) — largement assez pour un formulaire de contact ou les confirmations d’un petit e-commerce.
Une fois connecté, tu arrives sur le tableau de bord. Deux sections vont t’intéresser : Domains (tes domaines vérifiés) et API Keys (tes clés d’envoi). On va les traiter dans l’ordre.
Étape 2 : ajouter et vérifier ton domaine
C’est l’étape la plus importante. Sans elle, rien n’arrivera correctement.
- Dans Resend, va dans Domains puis clique sur Add Domain.
- Saisis ton domaine, par exemple
tondomaine.fr. Resend te recommande d’utiliser un sous-domaine d’envoi (send.tondomaine.fr) pour isoler la réputation — c’est une bonne pratique, mais l’apex fonctionne aussi. - Resend affiche alors une liste d’enregistrements DNS à ajouter chez ton registrar (OVH, IONOS, Gandi, Cloudflare…). Il y a typiquement :
| Enregistrement | Rôle |
|---|---|
| MX (sur le sous-domaine d’envoi) | Gestion des rebonds |
| TXT — SPF | Autorise les serveurs Resend à envoyer pour toi |
| TXT — DKIM | Signe cryptographiquement chaque message |
| TXT — DMARC (recommandé) | Politique en cas d’échec + rapports |
Recopie chaque enregistrement exactement : type, nom et valeur. Une erreur de copier-coller (un espace en trop, un @ oublié) suffit à tout casser.
Si ton domaine ne pointe nulle part ou que tu galères avec ta zone DNS, c’est un autre symptôme à traiter d’abord : mon domaine ne pointe pas.
Une fois les enregistrements posés, reviens dans Resend et clique sur Verify. La propagation DNS peut prendre de quelques minutes à 48 h. Tant que le domaine n’affiche pas Verified (le statut passe au vert), n’avance pas : tes envois échoueront. Pour comprendre le détail de chaque enregistrement, le guide SPF, DKIM, DMARC reste ta référence.
Étape 3 : générer une clé API
Une fois le domaine vérifié, va dans API Keys puis Create API Key.
- Donne-lui un nom parlant :
prod-site-vitrineoucontact-form. - Choisis la permission Sending access (envoi seul). Inutile de donner les droits complets à une clé qui ne fait qu’expédier des mails.
- Si Resend te le propose, restreins la clé à ton domaine vérifié.
La clé s’affiche une seule fois. Copie-la immédiatement. Elle ressemble à re_xxxxxxxxxxxxxxxxxxxx. Tu vas la stocker en variable d’environnement à l’étape 5 — surtout pas en dur dans ton code.
Étape 4 : envoyer ton premier email
L’API Resend, c’est une requête POST sur https://api.resend.com/emails. Voici le test le plus rapide, en curl :
curl -X POST 'https://api.resend.com/emails' \
-H 'Authorization: Bearer re_xxxxxxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{
"from": "Contact <contact@tondomaine.fr>",
"to": ["toi@gmail.com"],
"subject": "Premier test Resend",
"html": "<p>Si tu lis ça, ton envoi fonctionne.</p>"
}'
Le même appel côté serveur, en JavaScript (route API Astro/Next.js) avec fetch :
const res = await fetch("https://api.resend.com/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RESEND_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "Contact <contact@tondomaine.fr>",
to: ["destinataire@exemple.fr"],
subject: "Nouveau message depuis le site",
html: "<p>Le contenu de ton email en HTML.</p>",
reply_to: "client@exemple.fr",
}),
});
Deux points non négociables :
- Le
fromDOIT être sur ton domaine vérifié. Si ton domaine vérifié esttondomaine.fr, tu ne peux pas envoyer depuismonsite@gmail.com. Resend refusera avec une erreur 403. Lefromdoit matcher le domaine validé à l’étape 2. - Le
reply_toest ton meilleur ami pour un formulaire de contact. Quand un visiteur remplit ton formulaire, mets son adresse dansreply_to. Comme ça, quand tu cliques « Répondre » sur le mail reçu, tu réponds directement au visiteur, pas àcontact@tondomaine.fr.
Étape 5 : stocker la clé en variable d’environnement
Ta clé API est un secret. Quiconque la possède peut envoyer des emails en ton nom. Ne la colle jamais en dur dans ton code, et ne la committe jamais dans ton repo Git.
La bonne pratique : une variable d’environnement nommée RESEND_API_KEY.
En local, dans un fichier .env (ajouté à ton .gitignore) :
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxx
En production, tu la déclares dans le tableau de bord de ton hébergeur :
- Vercel : Project Settings > Environment Variables > ajoute
RESEND_API_KEY, puis redéploie. - Netlify : Site settings > Environment variables > ajoute la même variable.
Sur Vercel comme Netlify, une variable ajoutée après le dernier déploiement n’est prise en compte qu’au prochain build. Pense à redéployer après l’avoir posée, sinon ton code lira une variable vide.
Si tes envois échouaient en local mais pas en prod (ou l’inverse), commence toujours par vérifier que la variable est bien présente des deux côtés. Voir aussi nos guides problème de déploiement Vercel et problème de déploiement Netlify.
Étape 6 : tester pour de vrai
Ne te fie pas à un simple « ça a l’air parti ». Vérifie :
- Le statut de la réponse API. Resend renvoie un objet avec un
iden cas de succès, ou un message d’erreur clair sinon (domaine non vérifié,frominvalide, clé erronée). Logge cette réponse côté serveur. - La réception réelle. Envoie un test vers une adresse Gmail et une adresse Outlook. Ouvre le mail, et dans Gmail clique sur « Afficher l’original » : SPF, DKIM et DMARC doivent afficher
PASS. - Le dashboard Resend. L’onglet Emails liste chaque envoi avec son statut (delivered, bounced, complained). C’est ton journal de bord.
Pièges courants
- Domaine non vérifié → erreur 403. Tu génères ta clé, tu envoies, et Resend te renvoie « domain is not verified ». La cause : tu n’as pas attendu que le domaine passe au vert, ou un enregistrement DNS est mal recopié. Retourne dans Domains, vérifie chaque ligne, attends la propagation.
- Le
fromest sur le mauvais domaine. Tu envoies depuiscontact@gmail.comalors que ton domaine vérifié esttondomaine.fr. Rejet immédiat. Lefromdoit toujours être une adresse de ton domaine validé. - La clé API en clair dans le repo. Tu colles
re_...directement dans le code, tu pushes sur GitHub — et ta clé est exposée publiquement en quelques secondes. Toujours en variable d’environnement, jamais dans le code. Si ça t’arrive, révoque la clé dans Resend et génères-en une nouvelle. - Dépasser le quota du plan gratuit. 100 emails/jour, 3 000/mois. Un formulaire de contact ne les atteindra jamais ; un e-commerce qui envoie confirmations + relances peut les saturer. Surveille le dashboard et passe au plan payant avant le mur.
- L’email arrive… en spam. Presque toujours un DKIM absent ou invalide. Sans signature, Gmail te dégrade. Vérifie que DKIM affiche bien
PASSavec le guide SPF, DKIM, DMARC.
Et si tu es sur WordPress ?
Resend est l’option idéale pour un site codé (Astro, Next.js, une route API). Mais si ton site tourne sous WordPress, l’approche est différente : tu passes par un plugin SMTP, sans toucher au code. On a écrit le guide complet : tes emails WordPress n’arrivent pas : configurer l’envoi (SMTP).
Une brique d’envoi qui marche, c’est invisible quand tout va bien — et c’est des clients perdus en silence quand ça casse. Tu veux qu’on s’en occupe à ta place ? Demande un audit gratuit.
Ce problème, Peechy s'en occupe
Plutôt que de tout gérer seul, confiez votre site à une agence qui s'occupe de tout — hébergement, sécurité, maintenance et corrections. Encore plus simple en abonnement : on règle les soucis avant même que vous les remarquiez.
Confier mon site à Peechy