Bêta privéeMailbeam est en bêta privée : l'API publique n'est pas encore ouverte.Rejoindre la liste d'attente

Mailbeam
Supabase + Edge FunctionsIntermédiaire25 minutesMis à jour en janvier 2025

Vérification d'e-mails avec Supabase

Supabase permet d'intercepter les événements d'authentification par des Auth Hooks. Ce tutoriel crée une Edge Function qui appelle Mailbeam avant que Supabase ne crée un utilisateur, ce qui bloque les adresses jetables et invalides au niveau de la couche d'identité.

Prérequis


Créer l'Edge Function

supabase functions new verify-email
// supabase/functions/verify-email/index.ts
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";

const MAILBEAM_KEY = Deno.env.get("MAILBEAM_KEY")!;
const MIN_SCORE = 60;

serve(async (req) => {
  const payload = await req.json();
  // Le payload de l'Auth Hook porte les données utilisateur dans payload.user
  const email = payload?.user?.email ?? payload?.email;

  if (!email) {
    return new Response(JSON.stringify({ decision: "reject" }), {
      headers: { "Content-Type": "application/json" },
    });
  }

  try {
    const response = await fetch("https://api.mailbeam.dev/v1/verify", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${MAILBEAM_KEY}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ email }),
      signal: AbortSignal.timeout(5000),
    });

    if (!response.ok) throw new Error(`HTTP ${response.status}`);

    const { valid, score, reason } = await response.json();

    if (!valid || score < MIN_SCORE) {
      const message =
        reason === "disposable_domain"
          ? "Merci d'utiliser une adresse e-mail permanente."
          : "Merci de fournir une adresse e-mail valide et joignable.";

      return new Response(
        JSON.stringify({ decision: "reject", message }),
        { status: 200, headers: { "Content-Type": "application/json" } }
      );
    }
  } catch (err) {
    // Échec permissif — ne rejette pas sur une erreur de l'API Mailbeam
    console.error("Erreur Mailbeam :", err);
  }

  return new Response(
    JSON.stringify({ decision: "continue" }),
    { status: 200, headers: { "Content-Type": "application/json" } }
  );
});

Définir la variable d'environnement

supabase secrets set MAILBEAM_KEY=mb_live_xxxxxxxxxxxxxxxxxxxx

Déployer et brancher sur l'Auth Hook

supabase functions deploy verify-email

Dans le tableau de bord Supabase → Authentication → Hooks :

  • Activez Before User Creation
  • Sélectionnez votre Edge Function verify-email

Tester en local

supabase start
supabase functions serve verify-email --env-file .env.local

# Test avec curl
curl -X POST http://localhost:54321/functions/v1/verify-email \
  -H "Content-Type: application/json" \
  -d '{"user": {"email": "temp@mailinator.com"}}'
# → {"decision":"reject","message":"Merci d'utiliser une adresse e-mail permanente."}

Bonnes pratiques

  • Renvoyez toujours { decision: "continue" } dans le bloc catch — échec permissif
  • Posez un AbortSignal.timeout(5000) pour éviter que la fonction ne reste bloquée
  • Journalisez les erreurs dans les logs de fonction Supabase, pour la supervision

Prochaines étapes