Beta privataMailbeam è in beta privata: l'API pubblica non è ancora aperta.Iscriviti alla lista d'attesa

Mailbeam
Supabase + Edge FunctionsIntermedio25 minutiAggiornato a gennaio 2025

Verifica delle email con Supabase

Supabase permette di intercettare gli eventi di autenticazione con gli Auth Hooks. Questo tutorial crea una Edge Function che chiama Mailbeam prima che Supabase crei un nuovo utente, bloccando le email usa e getta e non valide nello strato di identità.

Prerequisiti

  • Un progetto Supabase (con la CLI installata)
  • Una chiave API di Mailbeam (iscriviti gratis)

Crea la 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();
  // Il payload dell'Auth Hook porta i dati dell'utente in 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"
          ? "Usa un indirizzo email permanente."
          : "Inserisci un indirizzo email valido e raggiungibile.";

      return new Response(
        JSON.stringify({ decision: "reject", message }),
        { status: 200, headers: { "Content-Type": "application/json" } }
      );
    }
  } catch (err) {
    // In caso di errore lascia passare: non rifiutare per un guasto dell'API di Mailbeam
    console.error("Errore di Mailbeam:", err);
  }

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

Definisci la variabile d'ambiente

supabase secrets set MAILBEAM_KEY=mb_live_xxxxxxxxxxxxxxxxxxxx

Pubblica e collegala all'Auth Hook

supabase functions deploy verify-email

Nel pannello di Supabase → Authentication → Hooks:

  • Attiva Before User Creation
  • Seleziona la tua Edge Function verify-email

Provala in locale

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

# Prova con 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":"Usa un indirizzo email permanente."}

Buone pratiche

  • Restituisci sempre { decision: "continue" } nel blocco catch: in caso di errore lascia passare
  • Metti AbortSignal.timeout(5000) perché la funzione non resti appesa
  • Registra gli errori nei log delle funzioni di Supabase per poterli sorvegliare

Prossimi passi