docs(mail-browser): phase 2 attachments+draft-reply deployes et testes (2026-07-23), skill hermes-tt cable sur API
This commit is contained in:
@@ -1,73 +1,65 @@
|
||||
# Acces boite mail O365 pro (hermes-tt) — historique et decision
|
||||
# MAIL-BROWSER-HERMES-TT
|
||||
|
||||
## Echec V0 : hermes-mail-proxy (Graph API device code flow)
|
||||
Tentative : client public officiel Microsoft ("Microsoft Graph Command Line Tools",
|
||||
client_id 14d82eec-204b-4c2f-b7e8-296a70dab67e) via MSAL device code flow, pour
|
||||
contourner le besoin d'enregistrement d'appli Azure AD (bloque en self-service sur
|
||||
le tenant TT). Code deploye port 3060 (hermes-mail-proxy), jamais authentifie :
|
||||
consentement Mail.Read/Mail.ReadWrite/Mail.Send bloque par l'admin meme sur ce
|
||||
client pre-consenti. Confirme le 22/07/2026 (curl /auth/status -> authenticated:false
|
||||
apres plusieurs semaines up). Container arrete et supprime le 22/07/2026, port 3060
|
||||
libere. Ne pas retenter la voie Graph API sur ce tenant sans intervention admin TT.
|
||||
Runbook du service de lecture/reponse mail O365 pour hermes-tt, via un
|
||||
navigateur Edge deja authentifie tournant dans le conteneur
|
||||
`hermes-mail-browser` (session MFA maintenue cote serveur).
|
||||
|
||||
## Decision V1 : hermes-mail-browser (session navigateur persistante)
|
||||
Principe : authentification 100% humaine (Nabil, MFA inclus) via noVNC sur un
|
||||
navigateur reel tournant sur le NAS (IP maison tunisienne). L'automatisation ne
|
||||
fait QUE lire sur la session deja ouverte — jamais de re-authentification
|
||||
automatisee, jamais de credentials stockes en clair.
|
||||
## Architecture
|
||||
|
||||
Stack :
|
||||
- Microsoft Edge reel (channel msedge, pas Chromium generique) — fingerprint
|
||||
Sec-CH-UA coherent avec un poste Windows corporate, reduction des heuristiques
|
||||
de detection cote Defender for Cloud Apps.
|
||||
- Affichage virtuel Xvfb + x11vnc, expose uniquement en LAN via noVNC (port 8810,
|
||||
bind 192.168.100.33, AUCUN vhost DSM, AUCUN reverse-proxy).
|
||||
- Edge lance en persistant (--user-data-dir sur volume monte, profil survit aux
|
||||
redemarrages) avec remote debugging port 9222 (localhost uniquement).
|
||||
- API FastAPI (port 3110) se connecte au MEME navigateur via CDP
|
||||
(connect_over_cdp) — pas d'instance separee — pour lire la boite de reception.
|
||||
hermes-tt consomme cette API en lecture seule.
|
||||
- Conteneur : `hermes-mail-browser` (reseau Docker `n8n`)
|
||||
- API interne : `http://hermes-mail-browser:8000` (joignable par
|
||||
`hermes-agent-tt` sur le meme reseau, pas besoin du port 3110 expose)
|
||||
- noVNC : port 8810 (LAN uniquement) — pour reconnexion manuelle O365/MFA
|
||||
- Envoi des projets de reponse : SMTP ik.me vers la boite pro de Nabil
|
||||
(nabil.derouiche@tunisietelecom.tn)
|
||||
|
||||
Scope Phase 1 (lecture seule) : liste boite de reception (expediteur, objet, date,
|
||||
lu/non lu, apercu), lecture corps complet d'un mail. Aucune action d'ecriture
|
||||
(envoi, suppression, deplacement) en V1.
|
||||
## Statut — Phase 2 : COMPLETE (deployee et testee avec succes)
|
||||
|
||||
Gestion expiration session : l'API detecte l'atterrissage sur
|
||||
login.microsoftonline.com et renvoie 409 "reauthentification manuelle requise"
|
||||
plutot que de tenter quoi que ce soit — Nabil rouvre noVNC, se reauthentifie,
|
||||
la session persiste a nouveau.
|
||||
Endpoints construits, deployes et testes le 2026-07-23 :
|
||||
|
||||
Ports : 3110 (API interne), 8810 (noVNC, LAN uniquement). Conteneur :
|
||||
hermes-mail-browser, reseau n8n, UID/GID 1026:100, volume data/ pour le profil
|
||||
navigateur.
|
||||
- `GET /health` — conteneur sain, `authenticated: true`
|
||||
- `GET /inbox?limit=N` — liste (expediteur / objet / heure / apercu) ;
|
||||
`aria_label` contient "pieces jointes" si le mail en a
|
||||
- `GET /message/{index}` — corps texte complet du mail
|
||||
- `GET /message/{index}/attachments` — teste : liste des PJ, OK
|
||||
- `GET /message/{index}/attachments/{filename}/text` — teste sur .docx ET
|
||||
.pdf, extraction correcte confirmee (extraction auto PDF/DOCX/XLSX)
|
||||
- `POST /draft-reply` `{"subject":"...","body_text":"..."}` — teste : mail
|
||||
reellement recu dans la boite O365 pro. Envoie un PROJET vers la boite de
|
||||
Nabil (jamais vers le correspondant). Prefixe de sujet
|
||||
`[REPONSE PROPOSEE] Re: <objet>` ajoute automatiquement par l'API.
|
||||
- Reseau : `hermes-agent-tt` joint `http://hermes-mail-browser:8000/health`
|
||||
sans probleme (meme reseau Docker `n8n`) — teste, OK.
|
||||
|
||||
Statut : conteneur deploye et sain, en attente authentification manuelle (22/07/2026).
|
||||
## Skill hermes-tt
|
||||
|
||||
## Mise a jour 22/07/2026 soir — validation phase 1 complete
|
||||
`/opt/data/skills/mail-o365-tt.md` (dans `hermes-agent-tt`) reecrit le
|
||||
2026-07-23 : les anciennes sections "ENVOI MAIL — SMTP Infomaniak" et
|
||||
"LECTURE MAIL — OWA Navigateur" (methode `browser_snapshot`, obsolete car
|
||||
bloquee par le MFA) ont ete entierement remplacees par des instructions
|
||||
pointant vers l'API ci-dessus. Regle centrale conservee : hermes-tt ne
|
||||
repond JAMAIS directement a un correspondant, il envoie toujours un projet a
|
||||
Nabil qui decide et envoie lui-meme depuis OWA. Les Cas d'usage 1
|
||||
(Trouver+envoyer), 3 (Ingestion AO), 4 (Veille reglementaire) et le bloc
|
||||
REGLES COMPORTEMENTALES ont ete conserves, adaptes a la nouvelle API.
|
||||
|
||||
Bug corrige pendant la validation : premiere version de main.py ouvrait une
|
||||
nouvelle connexion Playwright a CHAQUE requete. Deux requetes de test annulees
|
||||
cote client (timeout curl) ont laisse des coroutines bloquees cote serveur,
|
||||
qui ont ensuite bloque toute nouvelle tentative (verrou de spawn du driver
|
||||
Playwright). Corrige : connexion unique partagee, ouverte au demarrage de
|
||||
app (FastAPI lifespan), reutilisee pour toutes les requetes, timeout de
|
||||
securite 15s sur la connexion CDP.
|
||||
## Session expiree (code 409)
|
||||
|
||||
Piege reseau rencontre en testant : ports 3110/8810 bindes UNIQUEMENT sur
|
||||
192.168.100.33 (delibere, pas de bind 0.0.0.0). Injoignable depuis un
|
||||
conteneur Docker (mcp-nas) via 172.17.0.1 ou directement via 192.168.100.33
|
||||
depuis un container — passer par ssh nas-host pour tout test/usage agent.
|
||||
Si l'API renvoie **409**, la session du navigateur a expire. NE JAMAIS
|
||||
tenter de re-authentifier depuis l'agent : signaler a Nabil qu'une
|
||||
reconnexion manuelle via noVNC (port 8810, LAN) est necessaire.
|
||||
|
||||
Tests reussis en conditions reelles (session Nabil authentifiee) :
|
||||
- GET /auth/status -> authenticated:true
|
||||
- GET /inbox?limit=5 -> expediteur/objet/heure/apercu corrects (5/5), y compris
|
||||
un mail metier Zone Sud reel
|
||||
- GET /message/0 -> corps complet correctement extrait
|
||||
## PIEGE — recreate / docker compose up -d du conteneur
|
||||
|
||||
Phase 1 (lecture seule boite de reception) fonctionnelle, prete pour usage
|
||||
par hermes-tt.
|
||||
Edge tue brutalement laisse des verrous perimes dans le volume persistant.
|
||||
AVANT tout `docker compose up -d` / recreate de `hermes-mail-browser`,
|
||||
TOUJOURS supprimer d'abord :
|
||||
|
||||
Reste a faire : calibrer le 409 sur expiration reelle de session (pas encore
|
||||
observe) ; evaluer robustesse des selecteurs OWA dans la duree ; envisager
|
||||
V1.5 (appel API interne OWA via page.evaluate+fetch) si le DOM scraping
|
||||
devient trop lent.
|
||||
```
|
||||
rm -f /volume1/docker/hermes-mail-browser/data/profile/SingletonLock \
|
||||
/volume1/docker/hermes-mail-browser/data/profile/SingletonCookie \
|
||||
/volume1/docker/hermes-mail-browser/data/profile/SingletonSocket
|
||||
```
|
||||
|
||||
Incident deja rencontre et resolu deux fois — cause = verrous Singleton
|
||||
perimes empechant Edge de redemarrer dans le profil persistant.
|
||||
|
||||
Reference in New Issue
Block a user