Quand on travaille dans l’industrie, le papier reste parfois un élément important de traçabilité. Le passage au tout numérique n’est pas toujours aussi simple qu’on le souhaiterait.
L’impression de flux de commande est souvent une tâche chronophage, sans réelle valeur ajoutée. L’automatiser permet donc de libérer du temps utile pour les équipes.

Dans cet article, je vous partage une solution déployée en production, permettant d’imprimer automatiquement les pièces jointes PDF reçues sur une boîte Exchange 365 partagée, sous environnement Linux Debian, avec un contrôle précis sur les émetteurs et les paramètres d’impression.
Objectifs du script
- Se connecter à Microsoft Graph en mode application
- Lire les mails non lus d’une boîte partagée
- Filtrer les messages selon l’adresse de l’expéditeur
- Télécharger uniquement les pièces jointes PDF
- Les imprimer silencieusement via
lp
(CUPS) - Marquer les mails comme lus et les catégoriser (ex. « Imprimé »)
Architecture de la solution
Composant | Description |
---|---|
OS | Debian 12 |
Langage | PowerShell Core (pwsh ) |
API | Microsoft Graph via Invoke-RestMethod |
HTML → PDF | wkhtmltopdf (optionnel) |
Impression | lp avec options CUPS (bac, recto, N&B) |
Orchestration | cron (toutes les 5 min, 8h–18h, jours ouvrés) |
Pourquoi Linux + PowerShell ?
- Éviter la dépendance à Windows Server
- Mutualiser avec d’autres scripts d’automatisation
- S’appuyer sur CUPS, un composant robuste, standard et bien documenté
Cas d’usage métier
- Impression automatique de bons de réservation
- Réception d’alertes critiques (température, alarmes, flux patients)
- Traitement de documents entrants par fax ou email à valeur légale
Points de vigilance
- Vérifier les droits Graph API (accès à la boîte partagée)
- Forcer le format PDF pour éviter les erreurs de conversion
- S’assurer que l’imprimante supporte les options CUPS (bac, noir & blanc, recto)
Extrait de script (simplifié)
powershellCopierModifier# Authentification MS Graph
$token = Get-MSGraphToken -TenantId $tenantId -ClientId $clientId -ClientSecret $clientSecret
# Lire les mails non lus d’une boîte partagée
$messages = Invoke-RestMethod -Headers @{Authorization = "Bearer $token"} `
-Uri "https://graph.microsoft.com/v1.0/users/$sharedMailbox/messages?filter=isRead eq false"
foreach ($mail in $messages.value) {
if ($mail.from.emailAddress.address -in $allowedSenders) {
foreach ($attachment in $mail.attachments) {
if ($attachment.name -like "*.pdf") {
$filePath = "/tmp/$($attachment.name)"
[System.IO.File]::WriteAllBytes($filePath, [System.Convert]::FromBase64String($attachment.contentBytes))
lp -d "printer-name" -o media=Custom.Bac3 -o sides=one-sided -o ColorModel=Gray $filePath
}
}
# Marquer comme lu + catégorie "Imprimé"
Invoke-RestMethod -Method PATCH -Headers @{Authorization = "Bearer $token"} `
-Uri "https://graph.microsoft.com/v1.0/users/$sharedMailbox/messages/$($mail.id)" `
-Body '{"isRead": true, "categories": ["Imprimé"]}' -ContentType "application/json"
}
}
Sécurité
Le point critique à mon sens : le token d’accès à Microsoft Graph.
Dans sa configuration de base, il peut permettre un accès étendu à l’ensemble des boîtes partagées de votre tenant, avec des permissions puissantes : lecture, marquage, classification, suppression…
C’est très puissant, mais aussi un risque de sécurité majeur si mal maîtrisé. Une gestion fine des permissions (Application Permissions
+ Access Policies
ciblées) est indispensable.
Je publierai prochainement un article spécifique sur la sécurisation des accès techniques Graph API.
Conclusion
Ce type de script montre bien que Linux et PowerShell peuvent former une alliance puissante pour automatiser des processus critiques.
Combiné à Microsoft Graph, on obtient une solution :
- Robuste
- Fiable
- Adaptée aux contraintes métiers
- Et surtout, à sécuriser rigoureusement