Deux causes racines généraient ~170 erreurs/cycle (toutes les 10 min) sur
la prod : "syncFolder[...] listMessages failed: Folder ... not found".
1. Double-encodage UTF7-IMAP : listFolders() stocke le chemin brut UTF7-IMAP,
mais ImapMailProvider rappelait getFolder($path) qui ré-encode UTF8->UTF7-IMAP
(webklex Client::getFolderByPath, utf7=false). Le caractère de shift "&" était
ré-encodé, rendant introuvables les dossiers à accents/specials. Fix :
getFolder($path, null, utf7: true) partout dans ImapMailProvider.
2. Dossiers fantômes jamais purgés : syncFolderStructure() gardait en DB les
dossiers disparus du serveur, re-tentés à chaque cycle. Fix :
syncFolderStructure() retourne le set des chemins présents sur le serveur ;
doSyncAll() skip silencieusement les dossiers DB absents (conservés en DB
pour les liens messages/tâches). Fallback historique si listFolders échoue.
Test : testSyncAllSkipsFoldersNoLongerPresentOnServer.
- Décode les encoded-words MIME (RFC 2047) des sujets et noms d'expéditeur
via App\Mail\MimeHeaderDecoder, appliqué dans ImapMailProvider (sync propre)
- Commande app:mail:redecode-headers (--dry-run) pour re-décoder l'existant en base
- Aperçu inline images + PDF en visionneuse modale plein écran (MailAttachmentPreview),
téléchargement conservé pour les autres types
- Tests unitaires du décodeur + maj docs/mail-integration.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>