Trovare ogni giorno le email “da persone vere” a cui non hai risposto, usando Gemini

Un problema classico: la casella si riempie di newsletter, notifiche di piattaforme, ricevute automatiche… e in mezzo si perdono le poche email scritte da persone reali che aspettano una risposta.

Questo post mostra come costruire un report giornaliero che isola solo quelle email, con un approccio fuzzy: invece di indovinare con parole chiave, è Gemini a leggere il contenuto e decidere cosa merita davvero una risposta umana. Il tutto pianificato per girare da solo ogni mattina con Google Apps Script.

Tutti gli indirizzi, nomi e dati personali in questo post sono sostituiti con placeholder ([email protected], ecc.).


Il punto di partenza: chiedere a Gemini dentro Gmail

Dentro l’app Gemini puoi interrogare la posta attivando l’estensione Google Workspace e anteponendo @Gmail alla richiesta:

@Gmail cerca le mail a cui non ho risposto

Funziona per query interattive al volo, ma ha due limiti:

  1. La ricerca “on demand” non sempre distingue bene una persona reale da una piattaforma.
  2. Non puoi pianificarla: Gemini in chat risponde solo a un comando diretto, non c’è un “mandami questo report ogni mattina”.

La soluzione per l’automazione è spostare la logica in Google Apps Script, che può girare su un timer giornaliero e delegare a Gemini la parte “intelligente”.


L’idea: ricerca fuzzy con Gemini

Facciamo leggere il contenuto di ogni email a Gemini e lasciamo decidere a lui se sembra scritta da un umano che vuole qualcosa da te. Il modello coglie il contesto: tono confidenziale, richiesta esplicita, oppure notifica automatica mascherata da testo normale. Non cerca parole spia — legge.

Lo script: 1. Raccoglie le email delle ultime 24h (scartando quelle a cui hai già risposto). 2. Ne estrae un estratto del corpo. 3. Passa tutto a Gemini con un prompt fuzzy che chiede di restituire solo JSON con gli id delle email che meritano risposta e il motivo. 4. Costruisce il report e te lo invia via email.


Passo 1 — Chiave API (gratuita)

  1. Vai su aistudio.google.com con il tuo account Google.
  2. Get API Key → Create API Key e copia la chiave.

Passo 2 — Salvare la chiave nello script (non in chiaro)

In script.google.com crea un nuovo progetto, poi: - icona ingranaggio → Impostazioni progetto - in fondo, Proprietà dello script → Aggiungi proprietà - nome: GEMINI_KEY, valore: la tua chiave. Salva.

Così la chiave sta nelle proprietà dello script e non viene mai scritta nel codice.

Passo 3 — Il codice

```javascript function inviaRiepilogoEmailConGemini() { const DESTINATARIO_REPORT = "[email protected]";

// 1. Email delle ultime 24 ore const query = "newer_than:1d"; const threads = GmailApp.search(query); if (threads.length === 0) { Logger.log("Nessuna nuova email nelle ultime 24 ore."); return; }

const emailDaAnalizzare = [];

for (let i = 0; i < threads.length; i++) { const thread = threads[i]; const messaggi = thread.getMessages(); const ultimoMessaggio = messaggi[messaggi.length - 1];

// Salta se hai già risposto (ultimo messaggio inviato da te)
const mittente = ultimoMessaggio.getFrom();
if (mittente.includes(GmailApp.getAliases()[0]) ||
    mittente.includes(Session.getActiveUser().getEmail())) {
  continue;
}

// Estratto del corpo per non sforare i limiti di token
const corpoTesto = ultimoMessaggio.getPlainBody().substring(0, 1500);

emailDaAnalizzare.push({
  id: i,
  mittente: mittente,
  oggetto: ultimoMessaggio.getSubject(),
  estratto: corpoTesto,
  link: thread.getPermalink()
});

}

if (emailDaAnalizzare.length === 0) { Logger.log("Nessuna email in sospeso dai controlli preliminari."); return; }

// 2. Il prompt fuzzy const prompt = `Agisci come un assistente personale estremamente intelligente. Analizza questa lista di email ricevute nelle ultime 24 ore. Il tuo unico obiettivo è identificare SOLO le email scritte da persone reali (clienti, colleghi, partner, amici) che richiedono una risposta, un'azione o un'attenzione da parte mia.

Escludi tassativamente: - Newsletter di notizie, aggiornamenti o marketing. - Email transazionali automatiche (ricevute di acquisto, conferme di prenotazione, notifiche di piattaforme, avvisi di sistema). - Notifiche social o comunicazioni generiche da bot commerciali.

Per ogni email che ritieni richieda sinceramente una risposta umana, compila questo schema JSON. Rispondi ESCLUSIVAMENTE con JSON valido, senza testo prima o dopo: [ { "id": , "motivo": "" } ]

Ecco la lista delle email da analizzare: ${JSON.stringify(emailDaAnalizzare, null, 2)}`;

// 3. Chiamata a Gemini let risposteSelezionate = []; try { const apiKey = PropertiesService.getScriptProperties().getProperty("GEMINIKEY"); if (!apiKey) { Logger.log("Errore: GEMINIKEY non trovata nelle proprietà dello script."); return; }

const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${apiKey}`;

const payload = {
  contents: [{ parts: [{ text: prompt }] }],
  generationConfig: { responseMimeType: "application/json" } // forza JSON pulito
};

const response = UrlFetchApp.fetch(url, {
  method: "POST",
  contentType: "application/json",
  payload: JSON.stringify(payload),
  muteHttpExceptions: true
});

const jsonRisposta = JSON.parse(response.getContentText());
if (jsonRisposta.candidates && jsonRisposta.candidates[0].content.parts[0].text) {
  const testoModello = jsonRisposta.candidates[0].content.parts[0].text;
  risposteSelezionate = JSON.parse(testoModello);
} else {
  Logger.log("Risposta inattesa da Gemini: " + response.getContentText());
  return;
}

} catch (errore) { Logger.log("Errore durante la chiamata a Gemini: " + errore); return; }

// 4. Report finale if (risposteSelezionate && risposteSelezionate.length > 0) { let corpo = "Ciao,\n\nGemini ha analizzato la casella e ha isolato queste email da persone reali in attesa di risposta:\n\n"; risposteSelezionate.forEach((sel, idx) => { const e = emailDaAnalizzare.find(x => x.id === sel.id); if (e) { corpo += ${idx + 1}. Da: ${e.mittente}\n Oggetto: ${e.oggetto}\n Contesto: ${sel.motivo}\n Rispondi: ${e.link}\n\n; } }); GmailApp.sendEmail( DESTINATARIO_REPORT, [Report Smart] ${risposteSelezionate.length} email a cui rispondere, corpo ); Logger.log("Report smart inviato."); } else { Logger.log("Nessuna email umana da segnalare oggi."); } } ```


Passo 4 — Pianificare l’esecuzione giornaliera (il trigger)

Perché lo script parta da solo ogni mattina, senza aprire nulla:

  1. Nel pannello di Apps Script, clicca l’icona Sveglia / Orologio (Attivatori / Triggers) nella barra laterale sinistra.
  2. In basso a destra, + Aggiungi attivatore.
  3. Configura così:
  4. Funzione da eseguire: inviaRiepilogoEmailConGemini
  5. Sorgente dell’evento: Sulla base del tempo
  6. Tipo di attivatore basato sul tempo: Timer giornaliero
  7. Ora del giorno: la fascia che preferisci (es. 07:00–08:00, così il report è pronto all’inizio della giornata)
  8. Salva e concedi le autorizzazioni richieste all’account (accesso a Gmail e invio email).
  9. Se compare l’avviso “Applicazione non verificata”: Avanzate → Apri [nome progetto].

Da qui in poi Google esegue lo script ogni giorno e ti recapita il report.


Note pratiche