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.).
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:
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”.
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.
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.
```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":
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.");
}
}
```
Perché lo script parta da solo ogni mattina, senza aprire nulla:
inviaRiepilogoEmailConGeminiDa qui in poi Google esegue lo script ogni giorno e ti recapita il report.
gemini-1.5-flash via AI Studio ha un piano gratuito generoso; per volumi alti di email valuta i limiti di quota.newer_than:1d guarda le ultime 24h; allineala all’orario del trigger per non perdere o duplicare messaggi.