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 :

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.

  1. Dans Resend, va dans Domains puis clique sur Add Domain.
  2. 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.
  3. Resend affiche alors une liste d’enregistrements DNS à ajouter chez ton registrar (OVH, IONOS, Gandi, Cloudflare…). Il y a typiquement :
EnregistrementRôle
MX (sur le sous-domaine d’envoi)Gestion des rebonds
TXT — SPFAutorise les serveurs Resend à envoyer pour toi
TXT — DKIMSigne 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.

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 :


É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 :

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 :

  1. Le statut de la réponse API. Resend renvoie un objet avec un id en cas de succès, ou un message d’erreur clair sinon (domaine non vérifié, from invalide, clé erronée). Logge cette réponse côté serveur.
  2. 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.
  3. Le dashboard Resend. L’onglet Emails liste chaque envoi avec son statut (delivered, bounced, complained). C’est ton journal de bord.

Pièges courants


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