L'e-mail est un composant essentiel des applications web modernes, utilisé pour tout, de l'intégration et des notifications des utilisateurs aux réinitialisations de mot de passe et aux campagnes marketing. Cependant, la création et la gestion d'une infrastructure d'envoi d'e-mails fiable peuvent être complexes et prendre du temps. C'est là que les services d'API d'e-mail comme Resend entrent en jeu.
Resend propose une plateforme conviviale pour les développeurs, conçue pour simplifier le processus d'envoi d'e-mails transactionnels et marketing. Elle fournit des API robustes, des analyses détaillées et une excellente délivrabilité, ce qui permet aux développeurs de se concentrer sur la création de leurs applications plutôt que de se soucier de l'infrastructure d'e-mail.
Ce guide complet vous expliquera tout ce que vous devez savoir pour commencer à utiliser l'API Resend, de la compréhension de ses concepts de base et de sa tarification à son intégration avec divers frameworks et plateformes populaires.
Vous voulez une plateforme intégrée, tout-en-un, pour que votre équipe de développeurs travaille ensemble avec une productivité maximale ?
Apidog répond à toutes vos demandes et remplace Postman à un prix beaucoup plus abordable !
Qu'est-ce que Resend ?

Resend est une plateforme d'API d'e-mail conçue pour les développeurs. Elle vise à offrir une expérience développeur supérieure à celle des anciens fournisseurs de services de messagerie (ESP). Les principales fonctionnalités incluent :
- API moderne : une API propre et RESTful, facile à intégrer dans n'importe quelle application.
- Haute délivrabilité : se concentre sur la garantie que vos e-mails atteignent la boîte de réception, et non le dossier spam, grâce à des fonctionnalités telles que la vérification de domaine personnalisé (DKIM, SPF, DMARC), les adresses IP dédiées (en tant que module complémentaire) et la gestion automatique des listes de suppression.
- Intégrations de frameworks : propose des SDK et des guides officiels pour les frameworks populaires comme Node.js, Next.js, Python, Ruby, PHP, Go, et plus encore.
- Intégration React Email : s'intègre de manière transparente avec React Email, vous permettant de créer de magnifiques modèles d'e-mails réactifs à l'aide de composants React.
- Webhooks : fournit des notifications en temps réel sur les événements d'e-mail tels que la remise, les rebonds, les ouvertures, les clics et les plaintes de spam.
- Analyses détaillées : offre des informations sur les performances des e-mails via un tableau de bord convivial.
- Focus développeur : conçu pour les développeurs, offrant une documentation claire, des SDK utiles et des outils comme les e-mails de test pour faciliter le développement et le débogage.
Resend se positionne comme une alternative plus moderne et axée sur les développeurs aux acteurs établis comme SendGrid, Mailgun ou AWS SES, en se concentrant sur la facilité d'utilisation, la fiabilité et une bonne intégration avec les flux de travail de développement web modernes.
Quelle est la tarification de Resend ?

Resend propose une structure de tarification échelonnée basée sur le nombre d'e-mails envoyés par mois, avec des considérations distinctes pour les e-mails transactionnels et marketing (bien que la page de tarification détaille principalement les forfaits transactionnels).
Voici une ventilation de leurs forfaits d'e-mails transactionnels (au moment de la rédaction) :
Forfait gratuit :
- Coût : 0 $ / mois
- E-mails : jusqu'à 3 000 e-mails par mois
- Limite quotidienne : 100 e-mails par jour
- Domaines : 1 domaine personnalisé
- Conservation des données : 1 jour
- Assistance : assistance par ticket
- Fonctionnalités clés : API RESTful, relais SMTP, SDK, suivi des ouvertures/liens, intégration React Email, liste de suppression automatique, authentification DKIM/SPF/DMARC, 1 point de terminaison Webhook.
- Limitations : pas d'authentification unique (SSO), pas d'adresses IP dédiées, domaines et envoi quotidiens limités.
Forfait Pro :
- Coût : 20 $ / mois
- E-mails : jusqu'à 50 000 e-mails par mois (avec des frais de dépassement s'appliquant au-delà de cela)
- Limite quotidienne : pas de limite quotidienne
- Domaines : 10 domaines personnalisés
- Conservation des données : 3 jours
- Assistance : assistance par ticket
- Fonctionnalités clés : toutes les fonctionnalités du forfait gratuit, plus SSO, 10 points de terminaison Webhook.
- Limitations : pas d'adresses IP dédiées incluses (disponibles en tant que module complémentaire plus tard), pas d'assistance Slack.
Forfait Scale :
- Coût : 90 $ / mois
- E-mails : jusqu'à 100 000 e-mails par mois (avec des frais de dépassement)
- Limite quotidienne : pas de limite quotidienne
- Domaines : 1 000 domaines personnalisés
- Conservation des données : 7 jours
- Assistance : assistance Slack et par ticket
- Fonctionnalités clés : toutes les fonctionnalités du forfait Pro, plus IP dédiée disponible en tant que module complémentaire (30 $/mois, nécessite > 500 e-mails/jour).
- Limitations : les adresses IP dédiées sont un module complémentaire.
Forfait Entreprise :
- Coût : tarification personnalisée
- E-mails : volume personnalisé
- Limite quotidienne : pas de limite quotidienne
- Domaines : flexible
- Conservation des données : flexible
- Assistance : assistance prioritaire, accord de niveau de service (SLA) de réponse urgente, expertise en matière de délivrabilité
- Fonctionnalités clés : toutes les fonctionnalités du forfait Scale, plus l'échauffement IP dédié, les informations sur la délivrabilité, les webhooks flexibles, SSO inclus.
Considérations clés :
- Dépassement : l'envoi de plus d'e-mails que votre forfait ne le permet entraînera des coûts supplémentaires par e-mail.
- Adresses IP dédiées : disponibles en tant que module complémentaire pour les forfaits Scale et Entreprise moyennant des frais mensuels supplémentaires, recommandées pour les expéditeurs à volume élevé préoccupés par la réputation IP partagée.
- Conservation des données : la durée pendant laquelle Resend stocke les journaux et les détails de vos e-mails envoyés varie selon le forfait.
- E-mails marketing : la page de tarification comporte un bouton bascule pour les e-mails marketing, suggérant que différents forfaits ou structures de tarification pourraient s'appliquer, mais les détails étaient axés sur les e-mails transactionnels dans le contenu extrait. Consultez le site Web de Resend pour connaître la tarification des e-mails marketing la plus récente.
Le forfait gratuit est suffisamment généreux pour les petits projets ou à des fins de test. Les forfaits Pro et Scale s'adressent aux applications en croissance avec des volumes d'e-mails et des exigences de fonctionnalités croissants. Le forfait Entreprise fournit des solutions sur mesure pour les opérations à grande échelle.
Premiers pas avec Resend
Avant de pouvoir envoyer des e-mails, vous devez configurer votre compte Resend et configurer votre domaine d'envoi.
1. Inscrivez-vous et créez une clé API
- Accédez au site Web de Resend et inscrivez-vous pour créer un compte.
- Accédez à la section Clés API de votre tableau de bord Resend (https://resend.com/api-keys).
- Cliquez sur Créer une clé API.
- Donnez un nom descriptif à votre clé API (par exemple,
my-app-key
). - Choisissez le niveau d'autorisation :
- Accès complet : autorise toutes les actions de l'API (créer, supprimer, obtenir, mettre à jour les ressources). À utiliser avec prudence, généralement uniquement nécessaire pour les tâches de gestion du backend.
- Accès en envoi : autorise uniquement l'envoi d'e-mails. Il s'agit de l'autorisation recommandée pour la logique d'envoi de votre application. Vous pouvez éventuellement restreindre cette clé pour qu'elle n'envoie que depuis un domaine vérifié spécifique.
- Cliquez sur Créer.
- Important : Resend vous montrera la clé API une seule fois. Copiez-la immédiatement et stockez-la en toute sécurité (par exemple, dans une variable d'environnement, un gestionnaire de secrets). Ne l'engagez pas directement dans votre base de code.
2. Vérifiez votre domaine
Pour envoyer des e-mails qui semblent professionnels et éviter les filtres anti-spam, vous devez vérifier un domaine que vous possédez. L'envoi à partir de domaines non vérifiés ou d'adresses par défaut comme onboarding@resend.dev
ne convient qu'aux tests initiaux.
- Accédez à la section Domaines de votre tableau de bord Resend (https://resend.com/domains).
- Cliquez sur Ajouter un domaine et entrez le domaine à partir duquel vous souhaitez envoyer des e-mails (par exemple,
yourcompany.com
). - Choisissez votre fournisseur DNS dans la liste ou sélectionnez « Autre ».
- Resend vous fournira des enregistrements DNS (généralement MX, TXT pour SPF et CNAME/TXT pour DKIM) que vous devez ajouter aux paramètres DNS de votre domaine.
- SPF (Sender Policy Framework) : spécifie quels serveurs de messagerie sont autorisés à envoyer des e-mails au nom de votre domaine.
- DKIM (DomainKeys Identified Mail) : ajoute une signature numérique aux e-mails, permettant aux serveurs de réception de vérifier que l'e-mail n'a pas été falsifié et qu'il provient d'un serveur autorisé.
- Connectez-vous à votre registraire de domaine ou à votre fournisseur DNS (par exemple, GoDaddy, Cloudflare, Namecheap) et ajoutez les enregistrements fournis par Resend.
- Les modifications DNS peuvent prendre un certain temps pour se propager (minutes à heures, parfois jusqu'à 48 heures).
- Une fois les enregistrements ajoutés, revenez au tableau de bord Domaines de Resend et cliquez sur le bouton Vérifier à côté de votre domaine. Resend vérifiera si les enregistrements DNS sont correctement configurés. Une fois vérifié, l'état sera mis à jour et vous pourrez commencer à envoyer des e-mails à partir d'adresses associées à ce domaine (par exemple,
support@yourcompany.com
,noreply@yourcompany.com
).
3. Envoi d'e-mails de test
Pendant le développement, il est essentiel de tester l'envoi d'e-mails sans affecter la réputation de votre domaine ni envoyer accidentellement à de vrais utilisateurs. Resend fournit des adresses e-mail spéciales pour tester différents scénarios :
- Test livré : envoyer à
delivered@resend.dev
. Cela simule un e-mail livré avec succès. - Test renvoyé : envoyer à
bounced@resend.dev
. Cela simule un rebond dur (par exemple, l'adresse du destinataire n'existe pas), déclenchant un événement de rebond. - Test marqué comme spam : envoyer à
complained@resend.dev
. Cela simule un destinataire marquant votre e-mail comme spam, déclenchant un événement de plainte.
L'utilisation de ces adresses de test vous permet de vérifier votre intégration et de tester en toute sécurité les gestionnaires de webhooks pour les événements de rebond et de plainte.
Intégration de Resend avec des frameworks
Resend fournit des SDK officiels et des méthodes d'intégration simples pour divers langages et frameworks. Nous allons couvrir quelques exemples populaires basés sur la documentation fournie. Le concept de base implique généralement :
- Installation du SDK Resend (si disponible) ou utilisation de requêtes HTTP standard.
- Initialisation du client Resend avec votre clé API (chargée en toute sécurité, généralement à partir de variables d'environnement).
- Appel de la méthode
emails.send
(ou équivalent) avec des paramètres tels quefrom
,to
,subject
ethtml
oureact
.
Envoi avec Next.js
Next.js est un framework React populaire. Resend s'intègre bien, en particulier avec React Email.
1. Installer :
npm install resend
# ou
yarn add resend
# ou
pnpm add resend
2. Créer un modèle d'e-mail (facultatif mais recommandé) : utilisez React Email ou créez un simple composant React pour le corps de votre e-mail.
// components/email-template.tsx
import * as React from 'react';
interface EmailTemplateProps {
firstName: string;
}
export const EmailTemplate: React.FC<Readonly<EmailTemplateProps>> = ({
firstName,
}) => (
<div>
<h1>Bienvenue, {firstName} !</h1>
</div>
);
3. Créer un itinéraire API : créez un gestionnaire d'itinéraire API pour envoyer l'e-mail.
- Routeur d'application :
app/api/send/route.ts
- Routeur de pages :
pages/api/send.ts
// app/api/send/route.ts (Exemple de routeur d'application)
import { EmailTemplate } from '../../../components/email-template'; // Ajuster le chemin si nécessaire
import { Resend } from 'resend';
// Assurez-vous que RESEND_API_KEY est défini dans votre .env.local
const resend = new Resend(process.env.RESEND_API_KEY);
export async function POST() {
try {
const { data, error } = await resend.emails.send({
from: 'Votre nom <vous@votredomainevérifié.com>', // Utilisez votre domaine vérifié
to: ['delivered@resend.dev'], // Remplacez par le destinataire ou l'adresse de test
subject: 'Bonjour de Resend et Next.js !',
react: EmailTemplate({ firstName: 'Test' }), // Transmettez les propriétés à votre modèle
// Alternativement, utilisez `html` :
// html: '<strong>Ça marche !</strong>'
});
if (error) {
return Response.json({ error }, { status: 400 });
}
return Response.json(data);
} catch (error) {
return Response.json({ error }, { status: 500 });
}
}
// pages/api/send.ts (Exemple de routeur de pages - adapter les importations/réponse)
// import type { NextApiRequest, NextApiResponse } from 'next';
// import { EmailTemplate } from '../../components/EmailTemplate';
// import { Resend } from 'resend';
//
// const resend = new Resend(process.env.RESEND_API_KEY);
//
// export default async (req: NextApiRequest, res: NextApiResponse) => {
// try { // Ajout de try...catch pour une meilleure gestion des erreurs
// const { data, error } = await resend.emails.send({
// from: 'Votre nom <vous@votredomainevérifié.com>',
// to: ['delivered@resend.dev'],
// subject: 'Bonjour le monde',
// react: EmailTemplate({ firstName: 'John' }),
// });
//
// if (error) {
// return res.status(400).json(error);
// }
//
// res.status(200).json(data);
// } catch (e) {
// res.status(500).json({ error: 'Erreur interne du serveur' });
// }
// };
4. Déclencher : appelez ce point de terminaison API depuis votre frontend (par exemple, après la soumission d'un formulaire) à l'aide de fetch
ou d'une bibliothèque comme axios
. N'oubliez pas de remplacer les valeurs d'espace réservé par votre domaine vérifié et vos listes de destinataires réels.
Envoi avec Astro
Astro est un constructeur de site statique moderne qui prend également en charge le rendu côté serveur (SSR).
1. Installer Resend :
npm install resend
# ou
yarn add resend
# ou
pnpm add resend
2. Installer l'adaptateur SSR : Astro a besoin d'un adaptateur SSR pour exécuter du code côté serveur à la demande. Installez-en un adapté à votre cible de déploiement (par exemple, @astrojs/node
, @astrojs/vercel
, @astrojs/cloudflare
).
npx astro add node # Exemple pour l'adaptateur Node.js
Suivez les instructions de configuration de l'adaptateur dans votre astro.config.mjs
.
3. Ajouter la clé API : stockez votre RESEND_API_KEY
dans votre fichier .env
.
4. Créer une action Astro : utilisez les actions Astro (fonctionnalité expérimentale au moment de la rédaction, consultez la documentation Astro pour connaître l'état actuel) ou les points de terminaison API standard.
// src/actions/index.ts (Utilisation des actions Astro)
import { ActionError, defineAction, z } from 'astro:actions';
import { Resend } from 'resend';
// Assurez-vous que RESEND_API_KEY est disponible via import.meta.env
const resend = new Resend(import.meta.env.RESEND_API_KEY);
export const server = {
send: defineAction({
// Exemple : définir la validation d'entrée si nécessaire
// input: z.object({ email: z.string().email() }),
handler: async (/* { email } - si vous utilisez l'entrée */) => {
try { // Ajout de try...catch
const { data, error } = await resend.emails.send({
from: 'Votre nom <vous@votredomainevérifié.com>',
to: ['delivered@resend.dev'], // Remplacez par le destinataire
subject: 'Bonjour de Resend et Astro !',
html: '<strong>Astro fonctionne !</strong>',
// Vous pouvez également utiliser des modèles React si vous configurez React dans Astro
// react: <YourAstroCompatibleReactEmail firstName="Astro" />
});
if (error) {
console.error("Erreur Resend :", error); // Journaliser l'erreur
// L'envoi d'ActionError aide Astro à gérer les erreurs avec élégance
throw new ActionError({
code: 'BAD_REQUEST', // Ou être plus spécifique en fonction de l'erreur
message: error.message || 'Échec de l'envoi de l'e-mail',
});
}
return data; // Retourner les données de réussite
} catch (e) {
console.error("Erreur du gestionnaire :", e);
// Relancer ou lancer un nouvel ActionError
throw new ActionError({
code: 'INTERNAL_SERVER_ERROR',
message: 'Une erreur inattendue s'est produite.',
});
}
},
}),
};
// Alternative : point de terminaison API (par exemple, src/pages/api/send.ts)
// import type { APIRoute } from 'astro';
// import { Resend } from 'resend';
//
// const resend = new Resend(import.meta.env.RESEND_API_KEY);
//
// export const POST: APIRoute = async ({ request }) => {
// // const body = await request.json(); // Si les données proviennent du corps de la requête
// try {
// const { data, error } = await resend.emails.send({ /* ... paramètres de l'e-mail ... */ });
// if (error) {
// return new Response(JSON.stringify(error), { status: 400 });
// }
// return new Response(JSON.stringify(data), { status: 200 });
// } catch (e) {
// return new Response(JSON.stringify({ message: "Erreur du serveur"}), { status: 500 });
// }
// }
5. Déclencher : appelez l'action ou le point de terminaison à partir de vos composants ou pages Astro, généralement dans un gestionnaire de soumission de formulaire.
Envoi avec Bun
Bun est un runtime JavaScript rapide avec un bundler, un transpiler, un exécuteur de tâches et un client npm intégrés.
1. Installer :
bun install resend
2. Créer un modèle d'e-mail (facultatif) : comme pour Next.js, vous pouvez créer un fichier .tsx
pour votre modèle d'e-mail React.
// email-template.tsx
import * as React from 'react';
interface EmailTemplateProps {
firstName: string;
}
export const EmailTemplate: React.FC<Readonly<EmailTemplateProps>> = ({
firstName,
}) => (
<div>
<h1>Bienvenue, {firstName} !</h1>
</div>
);
3. Créer un script de serveur Bun : créez un script (par exemple, index.tsx
) pour exécuter un serveur HTTP simple à l'aide de Bun.
// index.tsx
import { Resend } from 'resend';
import { EmailTemplate } from './email-template'; // En supposant qu'il se trouve dans le même répertoire
// Charger la clé API à partir des variables d'environnement
const resendApiKey = process.env.RESEND_API_KEY;
if (!resendApiKey) {
console.error("Erreur : la variable d'environnement RESEND_API_KEY n'est pas définie.");
process.exit(1); // Quitter si la clé est manquante
}
const resend = new Resend(resendApiKey);
const server = Bun.serve({
port: 3000,
async fetch(req) { // Ajout de l'argument 'req'
// Facultatif : vérifier la méthode de la requête, le chemin, etc.
// if (new URL(req.url).pathname !== '/send') {
// return new Response("Non trouvé", { status: 404 });
// }
// if (req.method !== 'POST') {
// return new Response("Méthode non autorisée", { status: 405 });
// }
try {
const { data, error } = await resend.emails.send({
from: 'Votre nom <vous@votredomainevérifié.com>',
to: ['delivered@resend.dev'],
subject: 'Bonjour de Resend et Bun !',
react: EmailTemplate({ firstName: 'Utilisateur Bun' }),
// Ou utiliser html : '<strong>Bun fonctionne !</strong>'
});
if (error) {
console.error("Erreur Resend :", error);
// Retourner une réponse d'erreur JSON appropriée
return new Response(JSON.stringify({ error: error.message || 'Échec de l'envoi de l'e-mail' }), {
status: 500, // Ou 400 selon le type d'erreur
headers: { 'Content-Type': 'application/json' },
});
}
// Retourner la réponse de réussite
return new Response(JSON.stringify(data), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
} catch (e) {
console.error("Erreur du serveur :", e);
return new Response(JSON.stringify({ error: 'Erreur interne du serveur' }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
});
}
},
error(error) { // Ajout d'un gestionnaire d'erreurs de base pour le serveur lui-même
return new Response(`<pre>${error}\\\\\\\\n${error.stack}</pre>`, {
headers: { "Content-Type": "text/html" },
});
},
});
console.log(`Écoute sur <http://localhost>:${server.port} ...`);
4. Exécuter : démarrez le serveur à l'aide de RESEND_API_KEY=your_api_key bun run index.tsx
. L'accès à http://localhost:3000
(ou le déclenchement de l'itinéraire/de la méthode spécifique que vous avez défini) enverra l'e-mail.
Envoi avec Nuxt
Nuxt est un framework Vue.js populaire.
1. Installer :
npm install resend
# ou
yarn add resend
# ou
pnpm add resend
2. Créer un itinéraire de serveur : Nuxt utilise un répertoire server/
pour la logique du backend. Créez un fichier comme server/api/send.post.ts
(le .post
indique qu'il gère les requêtes POST).
// server/api/send.post.ts
import { Resend } from 'resend';
// Accéder à la clé API en toute sécurité (par exemple, via runtimeConfig dans nuxt.config.ts)
// Voir : <https://nuxt.com/docs/guide/going-further/runtime-config>
const config = useRuntimeConfig();
const resend = new Resend(config.resendApiKey); // En supposant que la clé est définie dans la configuration d'exécution
export default defineEventHandler(async (event) => {
// Facultatif : lire le corps si les données proviennent de la requête
// const body = await readBody(event);
try {
const data = await resend.emails.send({
from: 'Votre nom <vous@votredomainevérifié.com>',
to: ['delivered@resend.dev'],
subject: 'Bonjour de Resend et Nuxt !',
html: '<strong>Nuxt fonctionne !</strong>',
// Vous pouvez intégrer des modèles d'e-mails Vue (par exemple, en utilisant vue-email)
// Voir : <https://github.com/Dave136/vue-email>
});
// Nuxt 3 gère automatiquement le retour des données au format JSON
return data;
} catch (error: any) { // Capturer des types d'erreurs spécifiques si possible
console.error("Erreur Resend :", error);
// Lancer une erreur que Nuxt peut gérer, en définissant le code d'état
throw createError({
statusCode: 400, // Ou 500
statusMessage: 'Échec de l'envoi de l'e-mail',
data: error // Inclure éventuellement les détails de l'erreur
});
}
});
// Dans votre nuxt.config.ts, définissez runtimeConfig :
// export default defineNuxtConfig({
// runtimeConfig: {
// resendApiKey: process.env.NUXT_RESEND_API_KEY, // Côté serveur uniquement
// public: {
// // Clés publiques accessibles côté client
// }
// }
// })
// Et définissez NUXT_RESEND_API_KEY dans votre .env
3. Déclencher : appelez le point de terminaison /api/send
(à l'aide de la méthode POST) à partir de vos pages ou composants Nuxt à l'aide de $fetch
ou useFetch
.
Envoi avec les fonctions Vercel
Les fonctions Vercel sont des fonctions sans serveur qui s'intègrent de manière transparente à Next.js ou peuvent être utilisées seules. L'exemple Next.js ci-dessus démontre déjà l'utilisation dans un environnement Vercel. Si vous utilisez les fonctions Vercel sans Next.js (par exemple, avec un générateur de site statique ou un autre framework déployé sur Vercel), l'approche est similaire :
1. Créer une fonction : créez un fichier dans le répertoire api/
de votre projet (par exemple, api/send.ts
).
// api/send.ts (Exemple pour la fonction Vercel standard)
import type { VercelRequest, VercelResponse } from '@vercel/node';
import { Resend } from 'resend'; // Vous devrez