← Tutte le idee Strumenti online

Clova

Un'app email dove ogni casella accetta un solo mittente

Cosa fa

Un servizio email diverso: crei un indirizzo per ogni mittente (la banca, il negozio, la newsletter), così sai chi ha venduto il tuo indirizzo e blocchi lo spam con un clic.

Come guadagna

Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: abbonamento per più indirizzi e dominio personale.

Rendilo tuo

  • Parti dall'inoltro: indirizzi usa-e-getta che inoltrano alla tua email vera.
  • Per famiglie: un indirizzo per scuola, medico, bollette.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Un Indirizzo a Testa": crea un indirizzo email diverso per ogni sito a cui ti iscrivi (es. amazon.mario@tuodominio), inoltra tutto alla tua casella vera e ti fa bloccare con un clic chi inizia a mandare spam o ha venduto il tuo indirizzo. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con come funziona e il prezzo
2. Registrazione e indicazione della casella vera dove ricevere
3. I miei indirizzi: elenco con mittente, email ricevute, attivo o bloccato
4. Crea un indirizzo (anche dall'estensione del browser mentre ti iscrivi)
5. Statistiche: chi ha mandato più spam, indirizzi usati da altri mittenti

Stile: pulito e protettivo: sfondo bianco, blu #1D4ED8, verde #16A34A per "attivo", rosso #DC2626 per "bloccato", carattere "Inter", elenco compatto con interruttori. Nessuna immagine generica di stock.

Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.

2. Database, account e sicurezza

Collega il progetto a Supabase e attiva la registrazione con email e password.

Crea queste tabelle:
- "alias": indirizzo creato, a cosa serve (es. "Amazon"), attivo o bloccato, email inoltrate, ultimo mittente, collegati all'utente
- "ricevute": registro minimo delle email arrivate (alias, mittente, data, inoltrata o bloccata), senza il contenuto

Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi alias e il loro registro
- il contenuto delle email non si salva: si inoltra e basta
- la ricezione e l'inoltro li fa solo la Edge Function

Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.

3. Ricevere e inoltrare

Il dominio del servizio riceve tutte le email tramite un servizio di ricezione (inbound) che le passa alla Edge Function "ricevi" (codice nei Dettagli tecnici). La funzione trova l'alias: se è attivo inoltra l'email alla casella vera dell'utente, se è bloccato la scarta. In entrambi i casi registra solo mittente e data, mai il contenuto.

Per arrivare nella posta in arrivo e non nello spam, l'inoltro parte dal dominio del servizio (con SPF, DKIM e DMARC configurati) e mette il mittente originale in "Rispondi a".

Gli alias si creano dal pannello o con un'estensione del browser che compila il campo email delle pagine di iscrizione con un alias nuovo, chiamato come il sito.

4. Bloccare e capire chi ha venduto l'indirizzo

Elenco degli alias con interruttore attivo/bloccato. Se un alias creato per "Negozio X" riceve email da mittenti diversi da Negozio X, compare l'avviso: "Questo indirizzo è finito ad altri mittenti: forse è stato ceduto o rubato".

In fondo a ogni email inoltrata, una riga discreta con il link "Blocca questo indirizzo". Statistiche degli alias con più spam.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 2,99 € al mese. Gratis l'utente ha: 10 alias. Con il piano Pro sblocca: alias illimitati, risposta dall'alias, dominio personale ed estensione per il browser.

A pagamento riuscito il webhook porta l'utente al piano Pro; se l'abbonamento viene disdetto o non rinnovato lo riporta al piano gratuito.

Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.

6. Controlli specifici di questo progetto

Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Recapito: inoltra 20 email di prova a Gmail e Outlook: devono arrivare nella posta in arrivo, non nello spam.
2. Privacy: controlla nel database che non ci sia mai il contenuto o l'oggetto delle email.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Ricevere e inoltrare un'email

La Edge Function chiamata dal servizio di ricezione: trova l'alias, inoltra o scarta, e registra solo mittente e data.

// supabase/functions/ricevi/index.ts  (protetta da un segreto condiviso con il servizio di ricezione)
import { createClient } from "npm:@supabase/supabase-js";

const db = createClient(Deno.env.get("SUPABASE_URL")!, Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!);

Deno.serve(async (req) => {
  if (req.headers.get("x-segreto") !== Deno.env.get("SEGRETO_RICEZIONE")) {
    return new Response("Non autorizzato", { status: 401 });
  }
  const email = await req.json();   // { to, from, subject, html, text } dal servizio di ricezione
  const indirizzo = String(email.to).toLowerCase().trim();

  const { data: alias } = await db
    .from("alias")
    .select("id, attivo, email_vera")
    .eq("indirizzo", indirizzo)
    .single();
  if (!alias) return new Response("ok");                       // alias inesistente: si ignora

  if (alias.attivo) {
    const blocca = "https://unindirizzo.it/blocca?a=" + alias.id;
    await fetch("https://api.resend.com/emails", {
      method: "POST",
      headers: { Authorization: "Bearer " + Deno.env.get("RESEND_API_KEY"), "Content-Type": "application/json" },
      body: JSON.stringify({
        from: "Inoltro <inoltro@unindirizzo.it>",            // dominio nostro, con SPF e DKIM
        reply_to: email.from,
        to: alias.email_vera,
        subject: email.subject,
        html: (email.html ?? "<pre>" + (email.text ?? "") + "</pre>") +
          '<p style="font-size:11px;color:#888">Ricevuta su ' + indirizzo +
          ' · <a href="' + blocca + '">Blocca questo indirizzo</a></p>',
      }),
    });
  }

  // Registro minimo: niente oggetto, niente contenuto
  await db.from("ricevute").insert({ alias_id: alias.id, mittente: email.from, inoltrata: alias.attivo });
  return new Response("ok");
});

Alias e mittenti sospetti

Gli alias dell'utente e la query che trova quelli che ricevono email da domini diversi da quello per cui sono stati creati.

create table alias (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  indirizzo text not null unique,
  email_vera text not null,            -- dove inoltrare
  etichetta text not null,             -- es. "Amazon"
  dominio_atteso text,                 -- es. "amazon.it"
  attivo boolean not null default true,
  creato_il timestamptz not null default now()
);

create table ricevute (
  id bigint generated always as identity primary key,
  alias_id uuid not null references alias(id) on delete cascade,
  mittente text not null,
  inoltrata boolean not null,
  ricevuta_il timestamptz not null default now()
);

alter table alias enable row level security;
create policy "le mie righe" on alias
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
alter table ricevute enable row level security;
create policy "il registro dei miei alias" on ricevute for select using (exists (
  select 1 from alias a where a.id = alias_id and a.utente_id = auth.uid()));

-- Alias usati da mittenti estranei
select a.etichetta, a.indirizzo, array_agg(distinct split_part(r.mittente, '@', 2)) as domini_estranei
from alias a join ricevute r on r.alias_id = a.id
where a.utente_id = auth.uid()
  and a.dominio_atteso is not null
  and split_part(r.mittente, '@', 2) not like '%' || a.dominio_atteso
group by a.id, a.etichetta, a.indirizzo;

Pezzi comuni a tutti i progetti

Glossario

Alias
Un indirizzo email in più che inoltra tutto alla tua casella vera: se riceve spam, lo spegni.
SPF, DKIM, DMARC
Impostazioni del dominio che dimostrano ai servizi di posta che le email sono autentiche, così non finiscono nello spam.