Resend reçoit des e-mails, et depuis quand
Pendant longtemps, Resend n'a fait qu'envoyer, et une ancienne page de sa FAQ (« You can't receive emails yet ») reste indexée, ce qui entretient la confusion. Depuis 2025, la réception (« Receiving ») est documentée sur resend.com/docs : un domaine peut avoir la capacité receiving activée ; Resend accepte alors le courrier qui lui est adressé, le stocke temporairement et déclenche un webhook.
Côté facturation, un e-mail reçu compte comme un e-mail envoyé. Le plan gratuit couvre 3 000 e-mails par mois et 100 par jour ; le plan Pro coûte 20 $ par mois pour 50 000 e-mails (resend.com/pricing). Pour du courrier humain, c'est large.
Étape 1 : activer la réception sur le domaine
Dans le tableau de bord Resend, ouvrez « Domains », ajoutez votre domaine (ou ouvrez un domaine déjà vérifié) et activez la réception dans ses capacités. Par API, la même chose s'écrit en un appel ; pour un domaine existant, domains.update active la réception sans toucher à l'envoi.
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY);
// Nouveau domaine : envoi + réception
const { data } = await resend.domains.create({
name: "votredomaine.fr",
region: "eu-west-1",
capabilities: { sending: "enabled", receiving: "enabled" },
});
// Domaine déjà présent : activer seulement la réception
await resend.domains.update({ id: data!.id, capabilities: { receiving: "enabled" } });La réponse contient la liste des enregistrements DNS à poser : SPF et DKIM pour l'envoi, un MX pour la réception (marqué « Receiving »), et un MX sur le sous-domaine send.votredomaine.fr qui sert aux retours d'erreur (bounces) de l'envoi, pas à la réception.
Étape 2 : ajouter l'enregistrement MX et comprendre sa priorité
Dans votre zone DNS, créez un enregistrement MX sur le nom indiqué (@ pour le domaine entier, ou un sous-domaine comme mail) avec l'hôte et la priorité fournis par Resend. Tout se joue sur cette priorité.
La priorité MX est un nombre, et plus il est petit, plus le serveur est prioritaire : un serveur expéditeur essaie d'abord le MX à la plus petite valeur, puis les suivants seulement en cas d'échec. Si deux MX ont la même valeur, le courrier est réparti entre eux. Conséquence : si votre domaine a déjà un MX Google en priorité 1 et que vous ajoutez Resend en priorité 10, Resend ne recevra rien ; si vous les mettez à égalité, une partie du courrier ira d'un côté, une partie de l'autre.
- 01Notez les MX existants (
dig MX votredomaine.fr +short) et leur TTL. - 02Baissez le TTL à 300 secondes, attendez l'ancien TTL.
- 03Ajoutez le MX Resend avec la priorité fournie ; supprimez les anciens MX si vous migrez entièrement.
- 04Revenez dans Resend et lancez « Verify » : le statut de l'enregistrement « Receiving » passe à vérifié.
Étape 3 : le webhook email.received
Resend ne « pousse » pas le contenu des messages : il envoie une notification. Dans « Webhooks », ajoutez un endpoint HTTPS et cochez l'événement `email.received` (ou créez-le par API avec webhooks.create). À chaque message entrant, Resend appelle votre URL avec un JSON contenant l'identifiant de l'e-mail, l'expéditeur, les destinataires et le sujet, et signe la requête (en-têtes svix-*) avec le secret du webhook, à vérifier avant tout traitement.
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY);
export async function POST(req: Request) {
const event = await req.json(); // vérifiez d'abord la signature svix-*
if (event.type !== "email.received") return new Response("ignored", { status: 200 });
// Le webhook ne contient pas le corps : on le récupère par l'API.
const { data: email } = await resend.emails.receiving.get(event.data.email_id);
if (!email) return new Response("not found", { status: 404 });
// email.from, email.to, email.subject, email.html, email.text, email.attachments[]
await saveToDatabase(email);
return new Response("ok", { status: 200 });
}L'API emails.receiving complète le tableau : receiving.get(id) renvoie les en-têtes, le texte, le HTML et la liste des pièces jointes ; receiving.attachments.get({ emailId, id }) télécharge une pièce jointe ; receiving.list({ limit }) permet de rattraper les messages manqués ou de fonctionner sans webhook public, par exemple en développement local.
Rétention, hébergement et limites
Resend conserve les e-mails reçus 30 jours sur le plan gratuit, et ses données sont hébergées aux États-Unis (l'envoi peut partir de la région eu-west-1, en Irlande). Si vous voulez un historique durable ou un stockage en Europe, c'est à vous de copier les messages dans votre propre base au moment du webhook. Les durées des autres plans sont sur resend.com/pricing.
Ce que Resend ne fait pas
- Pas d'IMAP ni de POP. Impossible de brancher Apple Mail, Outlook ou Thunderbird sur un domaine Resend.
- Le SMTP sert uniquement à envoyer.
smtp.resend.comaccepte vos messages sortants ; il ne permet pas de relever une boîte. - Pas de boîte d'équipe complète en dehors d'Inboxes. Fils de discussion, recherche, archivage, règles, signatures : à construire ou à déléguer.
- Pas de stockage long. Au-delà de la rétention, le message disparaît chez Resend.
Trois façons de lire ses e-mails Resend
Option 1 : Resend Inboxes
Resend propose ses propres boîtes dans le tableau de bord : 3 boîtes incluses, puis 1 $ par boîte et par mois, avec fils de discussion et brouillons, et une conservation de 30 jours. C'est la voie la plus courte pour une ou deux adresses support gérées par des développeurs qui vivent déjà dans Resend. Voir le comparatif Resend Inboxes ou Rzner.
Option 2 : coder son propre webhook
Le code ci-dessus est le point de départ ; il reste à prévoir le stockage, les pièces jointes, le regroupement en conversations, l'interface de lecture, la réponse depuis la bonne adresse et la vérification de signature. C'est le bon choix si la réception alimente un produit (tickets, automatisations, agents) plutôt qu'une boîte lue par des humains.
Option 3 : Rzner, en dix minutes
Rzner fait exactement ce travail au-dessus de votre compte Resend : vous collez votre clé API, il déclare le domaine avec envoi et réception, crée le webhook email.received, affiche les enregistrements DNS avec leur statut, récupère le contenu et les pièces jointes et les stocke dans une base Postgres à Francfort. L'historique est de 30 jours en Free et illimité en Pro ; le webmail regroupe toutes vos adresses et tous vos domaines, avec une adresse catch-all par domaine. Prix : 0 € pour 1 domaine et 3 adresses, puis 9 € HT par mois par espace (tarifs).
| Resend Inboxes | Votre webhook | Rzner | |
|---|---|---|---|
| Mise en place | Quelques minutes | Plusieurs jours de développement | Dix minutes |
| Prix pour 10 adresses | 7 $/mois + quota Resend | Hébergement de votre code | 9 € HT/mois + quota Resend |
| Historique | 30 jours | Ce que vous stockez | 30 jours (Free), illimité (Pro) |
| Hébergement des messages | États-Unis | Votre choix | UE (Francfort) |
| Pour qui | Développeurs, 1 ou 2 boîtes | Produits et automatisations | Équipes, plusieurs domaines |
Tarifs publics relevés le 8 novembre 2026.
Questions fréquentes
Les e-mails reçus comptent-ils dans le quota Resend ?
Oui. Un e-mail reçu est décompté comme un e-mail envoyé : 3 000 par mois et 100 par jour sur le plan gratuit, 50 000 par mois sur le plan Pro à 20 $. Les spams reçus comptent aussi.
Peut-on lire ses e-mails Resend dans Outlook ou Apple Mail ?
Non. Resend ne fournit pas d'IMAP ni de POP, et son SMTP ne sert qu'à envoyer. La lecture passe par Resend Inboxes, par votre propre code branché sur le webhook email.received, ou par un webmail comme Rzner.
Puis-je recevoir avec Resend sans toucher aux MX de mon domaine principal ?
Oui, en activant la réception sur un sous-domaine comme mail.votredomaine.fr : il possède ses propres enregistrements MX, indépendants de ceux du domaine racine. Vos e-mails actuels continuent d'arriver où ils arrivent aujourd'hui.