Initial commit: EmailToChat — multi-channel email manager with AI

Desktop app (Electron + Vite + React + TypeScript) that receives email via
IMAP, sends/forwards via SMTP, Telegram (Bot API + MTProto user account) and
WhatsApp (whatsapp-web.js), with AI integration (Anthropic, OpenAI, Ollama)
for auto-classification, summary, structured extraction and reply drafts.

Features:
- Multi-account IMAP/SMTP with Gmail OAuth2 (loopback flow) + App Password preset
- Telegram Bot API via telegraf, with chat discovery from getUpdates
- Telegram MTProto via gram.js for sending to phone numbers like WhatsApp
- WhatsApp via whatsapp-web.js with QR-code session (locally generated PNG)
- Forwarding engine with rule-based filters incl. AI category match
- SQLite persistence (better-sqlite3) with idempotent migrations
- Contact picker with autocomplete, CSV/vCard import, search
- Dark mode (light/dark/system) with futuristic glass-morphism UI
- Settings tabbed: Email Accounts / Telegram / WhatsApp / AI / OAuth creds / Preferences

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
luzadevandClaude Opus 4.7 committed 2026-05-20 14:42:12 +02:00
commit 620b8fca67
53 files changed
+18873

No files matched your search

+216
View File
@@ -0,0 +1,216 @@
# EmailToChat
Gestore email desktop multi-canale con AI integrata.
Riceve email via **IMAP**, le inoltra automaticamente su **SMTP**, **Telegram**
e **WhatsApp** secondo regole personalizzabili, e permette di analizzarle con
**Claude (Anthropic)**, **OpenAI** o **Ollama locale**.
## Funzionalità
- **Multi-account**: configura più caselle IMAP/SMTP, più bot Telegram, più
sessioni WhatsApp in parallelo.
- **Ricezione IMAP** con polling configurabile per casella, parsing completo
(mailparser) di body HTML/testo e allegati.
- **Invio SMTP** via `nodemailer`, con allegati e from-name personalizzabile.
- **Bot Telegram** via `telegraf` (Telegram Bot API). Supporta lunghi messaggi
con auto-chunk, foto e documenti.
- **WhatsApp** via `whatsapp-web.js`. Login QR-code, sessione persistente
locale, invio testo e media.
- **Motore di forwarding** con regole basate su: from/to/oggetto/corpo/allegati
e **categoria AI**. Template messaggi con placeholder.
- **AI multi-provider**: Anthropic Claude, OpenAI, Ollama. Funzioni:
- **Classificazione** (automatica al ricevimento o on-demand)
- **Riassunto** (on-demand)
- **Estrazione informazioni strutturate** in JSON (date, importi, action items…)
- **Bozza di risposta** suggerita
- **Rubrica contatti** condivisa tra i canali.
- **DB SQLite** locale (`better-sqlite3`), salvato nella userData di Electron.
- **Toast notifications** per nuovi messaggi ed errori in tempo reale.
## Stack tecnico
- Electron + electron-vite
- TypeScript
- React 18 + Tailwind CSS
- better-sqlite3, imapflow, mailparser, nodemailer, telegraf, whatsapp-web.js
- @anthropic-ai/sdk, openai (SDK)
## Setup
### Prerequisiti
- Node.js 20+ e npm
- macOS, Windows o Linux
- (Per WhatsApp) connessione internet stabile + sufficienti risorse per Puppeteer headless
### Installazione
```bash
npm install
```
`postinstall` esegue `electron-builder install-app-deps` che ricompila i moduli
nativi (`better-sqlite3`) per la versione di Electron usata.
### Avvio in sviluppo
```bash
npm run dev
```
Apre l'app in modalità dev con hot-reload del renderer.
### Build di produzione
```bash
npm run build
npm run dist:mac # oppure dist:win / dist:linux
```
L'output finisce in `release/`.
## Primo utilizzo
### 1. Configurare un account Email (IMAP+SMTP)
Pagina **Email Account → + Nuovo account**.
Esempio Gmail (richiede una "App Password" se hai 2FA attiva):
| Campo | Valore |
|------------------|-----------------------|
| IMAP host | `imap.gmail.com` |
| IMAP porta | `993` |
| IMAP secure | sì |
| SMTP host | `smtp.gmail.com` |
| SMTP porta | `465` |
| SMTP secure | sì |
| User / Password | la tua email + app password |
Clicca **Test** per verificare la connessione. Se l'account è attivo, il
polling parte automaticamente.
### 2. Configurare un bot Telegram
1. Apri Telegram → scrivi a `@BotFather` → `/newbot` → segui le istruzioni.
2. Copia il token e incollalo in **Telegram → + Nuovo bot**.
3. Per ottenere il tuo `chat_id`: scrivi al bot, poi apri nel browser:
`https://api.telegram.org/bot<TOKEN>/getUpdates` → cerca `"chat":{"id":...}`.
### 3. Configurare una sessione WhatsApp
1. Vai su **WhatsApp → + Nuova sessione** → dai un nome.
2. Clicca **Avvia**: comparirà un QR code.
3. Apri WhatsApp sul telefono → Impostazioni → Dispositivi collegati →
Collega un dispositivo → scansiona il QR.
4. Quando lo stato passa a `ready`, la sessione è pronta. Resta autenticata
anche dopo il riavvio dell'app (sessione salvata in
`userData/whatsapp-sessions/`).
### 4. Configurare l'AI
Pagina **AI → + Nuovo provider**.
- **Anthropic**: ottieni una API key da console.anthropic.com,
modello consigliato `claude-haiku-4-5-20251001` per velocità o
`claude-sonnet-4-6` per qualità.
- **OpenAI**: API key da platform.openai.com,
modello consigliato `gpt-4o-mini`.
- **Ollama**: avvia Ollama localmente (`ollama serve`) e indica
`http://localhost:11434` come Base URL. Esempio modello: `llama3.2`.
Imposta un provider come **predefinito** (per azioni on-demand) e attiva
**Classificazione automatica** su uno solo dei provider per categorizzare
ogni email all'arrivo.
### 5. Creare una regola di inoltro
Esempio: "Inoltra su Telegram tutte le email categorizzate come `fattura`".
Pagina **Regole Forward → + Nuova regola**:
- Filtro: `Categoria AI` = `fattura`
- Destinazione: canale `telegram`, identifier `1:123456789` (bot id 1, chat 123456789)
- Includi corpo: sì
- Includi allegati: sì
Per inoltrare su WhatsApp invece, l'identifier ha formato
`sessionId|numero` (es. `1|393331234567`). Se vuoi usare il
destinatario predefinito della sessione, scrivi solo `1|`.
### 6. Comporre e inviare un messaggio
Pagina **Componi**: scegli canale (SMTP/Telegram/WhatsApp), account/bot/sessione,
destinatario, messaggio. I contatti in rubrica appaiono come suggerimenti.
## Struttura del progetto
```
EmailToChat/
├── electron.vite.config.ts # Configurazione electron-vite
├── package.json
├── src/
│ ├── main/ # Electron main process
│ │ ├── index.ts # Bootstrap finestra + servizi
│ │ ├── ipc.ts # IPC handlers
│ │ ├── db/
│ │ │ ├── database.ts # SQLite + migrations
│ │ │ └── repositories.ts # Repository pattern
│ │ └── services/
│ │ ├── imap.ts # Polling IMAP
│ │ ├── smtp.ts # Invio SMTP
│ │ ├── telegram.ts # Bot Telegram
│ │ ├── whatsapp.ts # whatsapp-web.js
│ │ ├── ai.ts # Anthropic/OpenAI/Ollama
│ │ └── forwarder.ts # Motore regole
│ ├── preload/
│ │ ├── index.ts # contextBridge IPC
│ │ └── index.d.ts # Tipi window.api
│ ├── renderer/
│ │ ├── index.html
│ │ └── src/
│ │ ├── App.tsx
│ │ ├── main.tsx
│ │ ├── styles.css
│ │ ├── components/ # Sidebar, Modal, Toaster, PageHeader
│ │ └── views/ # 8 pagine UI
│ └── shared/
│ ├── types.ts # DTO condivisi main/renderer
│ └── ipc-channels.ts # Costanti canali IPC
```
## Dati e privacy
- Tutti i dati sono memorizzati **localmente** in:
- macOS: `~/Library/Application Support/EmailToChat/`
- Windows: `%APPDATA%/EmailToChat/`
- Linux: `~/.config/EmailToChat/`
- DB: `data/emailtochat.db`
- Allegati: `attachments/<accountId>/<messageId>/`
- Sessioni WhatsApp: `whatsapp-sessions/wa-<id>/`
- Le API key dei provider AI sono salvate **in chiaro** nel DB. Per maggiore
sicurezza puoi cifrare il filesystem.
## Note operative
- **Gmail App Passwords**: se hai 2FA, devi generare una password app-specifica
da `https://myaccount.google.com/apppasswords`.
- **whatsapp-web.js** dipende da Chromium scaricato da Puppeteer (~150 MB
al primo `npm install`).
- **Telegram Bot vs Channel**: per inviare a un canale, il bot deve esserne
admin e il chat_id ha la forma `-100xxxxxxxxx`.
- **Limite messaggi Telegram**: 4096 caratteri, l'app fa auto-chunk.
- **Polling IMAP minimo**: 15 secondi per evitare ban dai provider email.
## Sviluppi futuri suggeriti
- Cifratura del DB (sqlcipher) per le credenziali
- IMAP IDLE invece di polling per ricezione push
- Search globale su messaggi
- Allegati Telegram/WhatsApp anche per messaggi outbound dalla compose UI
- Support webhook per Telegram in alternativa al long-polling
- Pannello "AI Chat" per fare domande sull'intera casella
## Licenza
MIT