6.3 KiB
Signatures CABM
Gestion centralisée des signatures email des agents de la CA Béziers Méditerranée : un add-in Outlook insère automatiquement la signature (OWA, nouvel Outlook, Outlook mobile), un back-office Laravel gère templates, affectations par groupes AD, campagnes et portail agent.
Architecture et lotissement : document « Signatures email CABM — Architecture et lotissement ».
Structure
AddinOutlook/
├── addin/ Add-in Outlook (TypeScript, manifeste XML, NAA)
│ ├── manifest.xml Modèle ; la version finale est générée dans dist/ au build
│ └── src/
│ ├── launchevent/ Gestionnaires OnNewMessageCompose / OnNewAppointmentOrganizer / OnMessageFromChanged
│ ├── taskpane/ Volet « Ma signature » (aperçu, réinsertion, lien portail)
│ └── shared/ Authentification NAA, appel API, cache roamingSettings
├── backend/ Fichiers du back-office, à fusionner avec un Laravel neuf (install-backend.ps1)
│ ├── app/Signature/ Rendu des templates, choix du template, calcul de la signature
│ ├── app/Services/ Client Graph, synchro annuaire, validation des jetons Entra
│ ├── database/ Migration du modèle de données, seeders, templates d'exemple
│ └── tests/ Tests unitaires et fonctionnels (php artisan test)
├── docker/ Image PHP-FPM, Nginx (certificat wildcard), entrypoint
├── docker-compose.yml app + scheduler + nginx + mariadb
├── docs/
│ ├── 01-entra-app-registrations.md Inscriptions Entra, groupes AD, déploiement Integrated Apps
│ └── 02-deploiement.md VM DMZ, flux Stormshield, exploitation
└── install-backend.ps1 Installation du back-office sur le poste de dev (Laragon)
Démarrage sur le poste de dev (Laragon)
- Créer les deux inscriptions Entra et les groupes AD :
docs/01-entra-app-registrations.md. - Back-office, dans le terminal Laragon :
Le script crée un Laravel neuf, y ajoute nos fichiers, installe
cd C:\laragon\www\AddinOutlook powershell -ExecutionPolicy Bypass -File .\install-backend.ps1firebase/php-jwt,laravel/socialite,socialiteproviders/microsoft-azure, prépare.envet lance les tests. - Compléter
backend\.env(base MySQL Laragon, identifiants Entra), puis :Pour un hôte virtuel Laragon, faire pointer la racine web surcd backend php artisan migrate --seed php artisan signature:sync --full php artisan servebackend\public. - Add-in :
cd ..\addin copy .env.example .env # compléter npm install npm run build # produit dist\ (dont dist\manifest.xml) npm run validate # validation du manifeste par le service Microsoft
L'add-in doit être servi en HTTPS avec un certificat de confiance : les tests se font sur la VM DMZ
(docs/02-deploiement.md) avec un chargement manuel du manifeste dans Outlook web.
API
GET /api/v1/signature?context=new|reply|forward|appointment&mailbox=<adresse>
En-tête Authorization: Bearer <jeton Entra NAA> → { html, variant, template, generated_at }.
- Template : groupe
signature_mail_*de plus haute priorité, sinon template par défaut. - Réponse / transfert : variante choisie par l'agent (courte, complète, aucune), défaut
short. - Boîte partagée déclarée : son template, avec ou sans le nom de l'agent selon le réglage de la boîte.
- Bannière : une seule par signature, insérée par
{{{banniere}}}dans la variante complète uniquement. Parmi les campagnes actives et en cours qui ciblent l'agent (tous, ou un de ses groupes), la priorité la plus haute l'emporte ; à égalité, la plus ancienne.
Campagnes (bannières)
Écran /admin/campagnes : image (choisie dans la bibliothèque ou envoyée depuis le formulaire), texte alternatif
obligatoire, lien facultatif, période en heure de Paris, priorité, groupes AD ciblés (aucun = tous les agents).
- L'éditeur prépare les campagnes : elles restent inactives. L'administrateur active, modifie une campagne active et supprime.
- La liste indique le nombre d'agents qui reçoivent réellement chaque campagne en cours (0 = masquée par une
campagne plus prioritaire) et signale les templates publiés sans
{{{banniere}}}. - Aucun cache à purger : l'add-in interroge l'API à chaque nouveau message, la bannière apparaît et disparaît donc à l'heure. Les messages déjà envoyés la conservent tant que l'image reste dans la bibliothèque.
Interface du back-office
Aucune dépendance externe ni étape de compilation : tout est servi depuis backend/public.
css/app.css: feuille unique. Les couleurs, rayons et polices sont des variables en tête de fichier (:root).js/app.js: notifications, boîte de confirmation (data-confirmsur un formulaire), zone de dépôt (data-dropzone), copie (data-copy), bouton occupé (data-busy). Sans JavaScript, les formulaires restent utilisables.fonts/: Atkinson Hyperlegible Next et Mono (licence OFL, fichier joint), hébergées localement.resources/views/components/icon.blade.php: icônes Lucide (licence ISC) intégrées,<x-icon name="plus" />.
Syntaxe des templates
| Syntaxe | Effet |
|---|---|
{{prenom}} |
Valeur échappée |
{{#if mobile}}Mob. {{mobile}}<br>{{/if}} |
Ligne masquée si le champ est vide |
{{#unless x}}…{{/unless}} |
Bloc affiché si le champ est vide |
{{{banniere}}} |
Bannière de campagne (HTML généré par le serveur) |
Variables : prenom, nom, nom_complet, fonction, service, organisation, bureau, telephone,
mobile, email, adresse, code_postal, ville, site_url, banniere, et pour une boîte partagée
boite_nom, boite_email.
Contenu du lot 0 et suite
Livré : socle complet (modèle de données, synchro Graph delta toutes les 15 min, API signature, validation des jetons, add-in avec cache de secours, SSO, rôles par groupes AD, tableau de bord, portail en aperçu).
Lots suivants : écrans d'édition des templates (HTML + éditeur visuel), affectations et priorités, boîtes partagées, campagnes, champs modifiables par l'agent et préférence de réponse, journal d'audit consultable.