# EmailTriage (Technofox)

Programme **local** pour lire une copie des e-mails (fichiers `.eml`), les **classifier**, suivre l’avancement dans un **journal**, et (étape 2) créer des **cartes TechnofoxTodo**.

Sources possibles :
- **local** : export `.eml` sous `Documents/MailExport` (ou `Doc/MailExport`)
- **IMAP** : boîte live via `config/mail/*.conf` (ex. `c.rey@technofox-usa.com`)

---

## Objectif métier

| Champ produit | Source |
|---------------|--------|
| **Titre** | Sujet du mail |
| **Description / résumé** | Extrait du corps (texte) |
| **Priorité** | `URGENT` / `HAUTE` / `MOYENNE` / `INFO` → Todo `P0`/`P1`/`P2` |
| **Tag / catégorie** | Facturation, Banque, Réunion, Spam/Pub, Notification, … |
| **Deadline** | Date trouvée dans le mail, sinon **indicative** : URGENT +1j, HAUTE +3j, MOYENNE +7j, INFO +14j |
| **Process** | Si réponse utile → **brouillon mail adapté** ; sinon tâche (payer, classer…) |

### Étapes

1. **✅ Tri local + journal anti-doublon + liste d’avancement**
2. **✅ Push cartes TechnofoxTodo** (`--push-todo`)
3. **⏳ Plus tard** : rapport matinal (mail / digest)

---

## Emplacement

```
/home/life/workspace/Développement/EmailTriage/     # dans life-box / Hermes
# équivalent hôte :
# /var/lib/containers/storage/volumes/life-home/_data/workspace/Développement/EmailTriage/

email_triage.py          # programme principal
README.md                # ce fichier
data/
  processed_mails.json   # journal : mails déjà traités (ne pas retraiter)
  progress.txt           # vue texte priorités / dernier run
  last_run.json          # stats dernier run
  skip_candidates.json   # spam/pub/notif à valider AVANT suppression
  cron.log               # optionnel (cron → log local, jamais /var/log)
```

**Source des mails :**  
`…/workspace/Documents/MailExport/`  
(sous-dossiers `c.rey_at_technofox.ch`, `c.rey_at_technofox-international.com`, …)

Le script **détecte automatiquement** le workspace (conteneur `life-box` ou volume hôte).

---

## Prérequis

- Python 3.10+ (stdlib uniquement — pas de pip requis)
- Export mails présents sous `Documents/MailExport`
- Pour l’étape 2 : serveur TechnofoxTodo démarré (`python3 server.py` → port **8788** sur l’hôte)

### Réseau important (Hermes / life-box)

| Depuis | URL Todo |
|--------|----------|
| Terminal **Hermes** (conteneur) | `http://host.containers.internal:8788` |
| Navigateur / shell **hôte** | `http://127.0.0.1:8788` |

`curl http://127.0.0.1:8788` **dans le conteneur** → `connection refused` : normal.  
Utiliser `host.containers.internal` (le script le fait tout seul avec `--push-todo`).

---

## Utilisation

### Local (.eml export)

```bash
cd /home/life/workspace/Dev/EmailTriage

python3 email_triage.py --source local --since 2026-08-01 --max-emails 10 --dry-run
python3 email_triage.py --source local --since 2026-08-01 --max-emails 10 --push-todo
```

### IMAP live (ex. USA)

```bash
cd /home/life/workspace/Dev/EmailTriage

# Test sans écrire
python3 email_triage.py --source imap \
  --imap-config config/mail/crey_technofoxusa.inc.conf \
  --since 2026-08-01 --max-emails 10 --dry-run

# Non lus uniquement + cartes Todo
python3 email_triage.py --source imap \
  --imap-config config/mail/crey_technofoxusa.inc.conf \
  --unseen-only --max-emails 20 --push-todo
```

(`--imap-config` bascule automatiquement en mode IMAP si tu oublies `--source imap`.)

Changer de boîte = autre fichier sous `config/mail/` (ex. `crey_technofox_ch.conf`).

### Statut « lu » côté boîte mail (important)

L’agent **ne marque pas** les mails comme lus sur le serveur :

- ouverture IMAP en **EXAMINE** (read-only), pas SELECT en écriture ;
- fetch avec **`BODY.PEEK[]`** (ne pose pas le flag `\Seen`) ;
- **aucun** `STORE +FLAGS (\Seen)`.

Le suivi « déjà traité » se fait **uniquement** dans `data/processed_mails.json` (journal local).  
Tu continues à voir les mails **non lus** dans ta boîte pour y répondre.

### Relancer sans doublons

Le fichier `data/processed_mails.json` mémorise chaque mail traité (`mail_id`).  
Un second run **ne recrée pas** les mêmes cartes / entrées.

Pour forcer un re-traitement (attention : nouvelles cartes Todo) :

```bash
# supprimer une entrée dans processed_mails.json, ou :
rm data/processed_mails.json   # reset complet du journal
```

### Voir les mails peu intéressants (spam / pub / notif)

```bash
python3 email_triage.py --list-skips
# ou lire :
cat data/skip_candidates.json
```

**Aucune suppression automatique.**  
Quand Cédric valide la liste, on pourra ajouter une commande `--delete-validated-skips` (étape future).

### Cron (exemple)

Logs **uniquement** dans `data/` (pas `/var/log` — refusé par FS_GUARD Hermes) :

```cron
0 8 * * * cd /home/life/workspace/Développement/EmailTriage && \
  python3 email_triage.py --push-todo \
  >> data/cron.log 2>&1
```

---

## Options CLI

| Option | Description |
|--------|-------------|
| `--since YYYY-MM-DD` | Filtre date min (défaut `2026-08-01`) |
| `--max-emails N` | Limite aux N plus récents |
| `--source local\|imap` | Export `.eml` ou boîte IMAP |
| `--imap-config PATH` | Fichier conf (`host`/`user`/`pass`) |
| `--unseen-only` | IMAP : uniquement non lus |
| `--push-todo` | POST `/api/cards` sur TechnofoxTodo |
| `--todo-url URL` | Forcer la base URL Todo |
| `--dry-run` | Analyse sans écrire journal ni Todo |
| `--include-skip` | Pousser aussi spam/notif en Todo (déconseillé) |
| `--list-skips` | Afficher candidats suppression |
| `-h` / `--help` | Aide |

---

## Fichiers de suivi (priorités & avancement)

1. **`data/progress.txt`** — liste lisible triée par priorité après chaque run  
2. **`data/processed_mails.json`** — source de vérité anti-boucle  
3. **`data/skip_candidates.json`** — mails « peu intéressants » en attente de validation  
4. **`data/last_run.json`** — compteurs du dernier run  

Ouvrir `progress.txt` pour voir d’un coup d’œil URGENT / HAUTE / SKIP.

---

## Classification (règles simples)

- **Mots-clés** catégorie (facture, réunion, e-banking, newsletter, unsubscribe, …)
- **Expéditeurs prioritaires** (Technofox, partenaires listés dans le script)
- **Urgence** si mots « urgent / impayé / mahnung / deadline » + contexte crédible
- **Skip candidat** : catégories `Spam/Pub` et `Notification` → pas de carte Todo par défaut

Ce n’est **pas** un LLM : règles déterministes, rapides, adaptées au cron.  
On pourra brancher un modèle plus tard pour le résumé / brouillon.

---

## API TechnofoxTodo utilisée

```http
POST /api/cards
Content-Type: application/json

{
  "title": "...",
  "description": "...",
  "summary": "...",
  "action_proposal": "...",
  "action_type": "mail|call|admin|finance|other",
  "priority": "P0|P1|P2",
  "tags": ["Facturation"],
  "due_date": "YYYY-MM-DD",
  "column_id": "backlog"
}
```

---

## Dépannage

| Symptôme | Cause probable | Fix |
|----------|----------------|-----|
| `MailExport introuvable` | Mauvais cwd / volume | Lancer depuis ce dossier ou vérifier `Documents/MailExport` |
| `0 candidats` | Pas de `.eml` ≥ `--since` | Vérifier noms `202608…` ou élargir la date |
| Todo unreachable | Serveur arrêté ou mauvais host | Sur l’hôte : `cd …/TechnofoxTodo && python3 server.py` ; depuis conteneur le script utilise `host.containers.internal` |
| Doublons non créés | Normal | Déjà dans `processed_mails.json` |
| FS_GUARD /var/log | Redirection cron hors workspace | Logger vers `data/cron.log` uniquement |

---

## Suite prévue

- [ ] Validation Cédric → suppression des mails listés dans `skip_candidates.json`
- [ ] Étape 3 : rapport matinal (synthèse URGENT/HAUTE + nouveaux mails)
- [x] IMAP live (`--source imap --imap-config …`)

---

## Auteur / contexte

Technofox — usage ops Cédric Rey.  
Script écrit pour être **lisible par un agent** (Hermes) et exécutable en **cron** sans dépendance externe.
