From bcbc04325e90ac0ac7a0d77ede62cbae45ad37a7 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Thu, 21 May 2026 11:42:06 +0200 Subject: [PATCH] =?UTF-8?q?feat(mail)=20:=20d=C3=A9codage=20des=20en-t?= =?UTF-8?q?=C3=AAtes=20MIME=20+=20aper=C3=A7u=20inline=20des=20pi=C3=A8ces?= =?UTF-8?q?=20jointes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- docs/mail-integration.md | 5 +- .../components/mail/MailAttachmentPreview.vue | 121 ++++++++++++++++++ .../components/mail/MailMessageViewer.vue | 115 +++++++++++++++-- frontend/i18n/locales/fr.json | 6 + src/Command/MailRedecodeHeadersCommand.php | 84 ++++++++++++ src/Mail/ImapMailProvider.php | 6 +- src/Mail/MimeHeaderDecoder.php | 47 +++++++ tests/Unit/Mail/MimeHeaderDecoderTest.php | 50 ++++++++ 8 files changed, 421 insertions(+), 13 deletions(-) create mode 100644 frontend/components/mail/MailAttachmentPreview.vue create mode 100644 src/Command/MailRedecodeHeadersCommand.php create mode 100644 src/Mail/MimeHeaderDecoder.php create mode 100644 tests/Unit/Mail/MimeHeaderDecoderTest.php diff --git a/docs/mail-integration.md b/docs/mail-integration.md index 92edece..5e4544a 100644 --- a/docs/mail-integration.md +++ b/docs/mail-integration.md @@ -35,6 +35,7 @@ > make mail-sync # synchro complète > docker exec -i -u www-data php-lesstime-fpm php bin/console app:mail:sync --folder=INBOX -v > docker exec -i -u www-data php-lesstime-fpm php bin/console messenger:consume async -vv # worker (fait marcher le bouton) +> docker exec -i php-lesstime-fpm php bin/console app:mail:redecode-headers [--dry-run] # re-décode les en-têtes MIME déjà en base (backfill) > make test # 33 tests > ``` > Fixtures `make fixtures` plantent sur un état legacy `workflow_id` (hors-scope mail) — configurer la boîte via l'UI admin. @@ -45,6 +46,8 @@ - Navigation par dossiers (arbre récursif avec compteurs non-lus) - Liste paginée des messages (infinite scroll, cursor-based) - Lecture des corps de mail sanitisés (DOMPurify — protection XSS + pixels tracking) +- Décodage des en-têtes MIME encodés (RFC 2047, ex `=?UTF-8?Q?...`) sur sujet + nom d'expéditeur (`App\Mail\MimeHeaderDecoder`, appliqué dans `ImapMailProvider`) +- Aperçu inline des pièces jointes images + PDF (visionneuse modale plein écran), téléchargement pour les autres types - Création d'une tâche Lesstime depuis un mail (sujet → titre, texte → description) - Lien mail ↔ tâche (bidirectionnel) - Onglet "Mails" dans le TaskDrawer pour retrouver les mails liés à une tâche @@ -107,7 +110,7 @@ Tous les endpoints `/api/mail/*` refusent explicitement `ROLE_CLIENT`. ### Frontend - `frontend/pages/mail.vue` — page principale 3 colonnes -- `frontend/components/mail/` — MailFolderTree, MailMessageList, MailMessageViewer, MailRefreshButton +- `frontend/components/mail/` — MailFolderTree, MailMessageList, MailMessageViewer, MailRefreshButton, MailAttachmentPreview (visionneuse modale image/PDF) - `frontend/components/admin/AdminMailTab.vue` — onglet config admin - `frontend/stores/mail.ts` — store Pinia (folders, messages, polling) - `frontend/services/mail.ts` — service API (toutes les méthodes) diff --git a/frontend/components/mail/MailAttachmentPreview.vue b/frontend/components/mail/MailAttachmentPreview.vue new file mode 100644 index 0000000..dee9b3f --- /dev/null +++ b/frontend/components/mail/MailAttachmentPreview.vue @@ -0,0 +1,121 @@ + + +