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.