Après une mise à jour, votre règle Outlook n’imprime plus automatiquement les pièces jointes d’un expéditeur précis ? Voici une méthode fiable, sûre et documentée pour rétablir l’automatisation sous Windows, avec ou sans règle « Exécuter un script ».
Contexte et symptômes après mise à jour d’Outlook
De nombreux utilisateurs disposaient d’une règle Outlook exécutant un script VBA (par exemple Project1:ThisOutlookSession AttachmentAutoprint) pour envoyer directement à l’imprimante les pièces jointes reçues d’un expéditeur donné. Après une mise à jour d’Outlook pour Windows, la règle cesse souvent de fonctionner. Les causes les plus courantes :
- La commande « Exécuter un script » est à nouveau masquée pour des raisons de sécurité et doit être réactivée côté registre.
- La stratégie de macros a été durcie (macros signées uniquement, macros désactivées, etc.).
- Vous utilisez le nouveau Outlook pour Windows (application moderne) qui ne prend pas en charge le VBA ; la solution ne fonctionne que dans Outlook « classique » (Win32).
- Le script s’appuyait sur une règle, mais le code placé dans
ThisOutlookSession
avec l’événementNewMailEx
n’a pas été remis en place ou n’est pas activé.
Deux approches fiables pour l’impression automatique
Vous pouvez rétablir l’automatisation de deux manières ; choisissez celle qui s’intègre le mieux à votre environnement.
Approche A – Sans règle : pilotez tout avec l’événement NewMailEx
Le code VBA placé dans ThisOutlookSession
se déclenche à l’arrivée d’un nouveau message. Il filtre l’expéditeur et lance l’impression. Avantage : pas de dépendance à l’action « Exécuter un script ». Inconvénient : nécessite de conserver Outlook ouvert et le projet VBA chargé.
Approche B – Avec règle : réactiver « Exécuter un script »
On conserve la règle Outlook « provenant de : [expéditeur] » et on appelle une macro de type Sub NomMacro(Item As MailItem)
. Avantage : logique métier visible dans l’interface des règles. Inconvénient : il faut réactiver l’option « Exécuter un script » dans le Registre et gérer les paramètres de sécurité des macros.
Critère | Approche A – NewMailEx | Approche B – Règle + « Exécuter un script » |
---|---|---|
Support VBA | Outlook classique (Win32) | Outlook classique (Win32) |
Nouveau Outlook pour Windows | Non pris en charge | Non pris en charge |
Réactivation Registre requise | Non | Oui (EnableUnsafeClientMailRules ) |
Complexité d’installation | Faible | Moyenne |
Lisibilité dans l’interface des règles | Logique dans le code | Logique visible dans la règle |
Prérequis et vérifications indispensables
Point à vérifier | Détails |
---|---|
Édition d’Outlook | Fonctionne uniquement avec Outlook « classique » pour Windows (Office 2016/2019/2021/Microsoft 365 – architecture 32/64 bits). Le nouveau Outlook pour Windows ne prend pas en charge le VBA. |
VBA activé | Fichier ▸ Options ▸ Centre de gestion de la confidentialité ▸ Paramètres des macros. Choisissez « Macros signées numériquement ou activées » ou un niveau permettant votre certificat (voir ci‑dessous). |
Certificat de signature | Recommandé : signer le projet VBA (par exemple avec SelfCert.exe) pour n’autoriser que votre code. |
Imprimante | Notez le nom exact de l’imprimante (locale ou réseau). Testez une impression manuelle de PDF/ images depuis le poste. |
Dossier temporaire | Créez un répertoire local accessible au compte utilisateur (ex. C:\Temp\OutlookAutoPrint\ ), et prévoyez un nettoyage périodique. |
Extensions autorisées | Par défaut, imprimez d’abord les formats sûrs (PDF, TIFF/JPG/PNG). L’impression de DOCX/XLSX peut nécessiter d’ouvrir Office et sortir de la vue protégée. |
Réactiver l’action « Exécuter un script » (si vous choisissez l’approche B)
Pour réafficher l’action « Exécuter un script » dans l’assistant de règles :
Clé : HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security
Valeur : EnableUnsafeClientMailRules (DWORD) = 1
- Fermez Outlook, créez la valeur si elle n’existe pas, puis redémarrez Outlook.
- Si vous êtes en environnement d’entreprise, une stratégie peut écraser ce paramètre ; rapprochez‑vous de votre administrateur.
Durcir et ajuster la sécurité des macros
- Ouvrez Fichier ▸ Options ▸ Centre de gestion de la confidentialité ▸ Paramètres des macros.
- Choisissez une option qui permet l’exécution de macros signées. Idéalement, créez et installez un certificat personnel (via SelfCert.exe), signez votre projet dans l’Éditeur VBA (Outils ▸ Signature numérique), redémarrez Outlook et faites confiance à ce certificat.
- Conservez « Activer l’accès approuvé au modèle d’objet de projet VBA » décoché (inutile ici).
Bonnes pratiques : limitez votre logique aux expéditeurs autorisés et filtrez par domaine si besoin (@entreprise.com
) ; désactivez la macro quand vous n’en avez pas l’usage, et signez le projet.
Code VBA prêt à l’emploi : fiable, commenté, compatible 32/64 bits
Le bloc ci‑dessous fournit une base robuste : il enregistre chaque pièce jointe dans un dossier temporaire, imprime via l’application par défaut (PDF → lecteur PDF, images → visionneuse) et marque le message d’une catégorie pour éviter les doublons. Adaptez :
expediteur@example.com
: l’adresse expéditeur à autoriser (ou remplacez par un test de domaine).TEMP_FOLDER
: le répertoire de travail (ex.C:\Temp\OutlookAutoPrint\
).PRINTER_NAME
: laissez vide pour l’imprimante par défaut, ou indiquez le nom exact de l’imprimante cible.AllowedExt
: liste des extensions à imprimer.
Module standard : modAutoPrint
Option Explicit
\#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" \_
(ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, \_
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
\#Else
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" \_
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, \_
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
\#End If
Public Const TEMP\_FOLDER As String = "C:\Temp\OutlookAutoPrint"
Public Const PRINTER\_NAME As String = "" ' Vide = imprimante par défaut
Public Const CATEGORY\_PRINTED As String = "Auto-Print"
Public AllowedExt As Variant
Public Sub InitializeAutoPrint()
On Error Resume Next
AllowedExt = Array("pdf", "tif", "tiff", "jpg", "jpeg", "png")
CreateFolderIfMissing TEMP\_FOLDER
End Sub
' === Point d'entrée pour la RÈGLE Outlook (Approche B) ===
Public Sub Rule\_AutoPrint(ByVal Item As Outlook.MailItem)
InitializeAutoPrint
If ShouldAutoPrint(Item) Then
PrintAllAttachments Item
End If
End Sub
' === Filtrage des mails à traiter ===
Public Function ShouldAutoPrint(ByVal Mail As Outlook.MailItem) As Boolean
Dim sender As String
sender = GetSmtp(Mail)
If LCase\$(sender) = LCase\$("[expediteur@example.com](mailto:expediteur@example.com)") Then
ShouldAutoPrint = True
End If
' Exemple de filtrage par domaine :
' If LCase\$(Right\$(sender, 14)) = "@entreprise.com" Then ShouldAutoPrint = True
End Function
' Récupère l'adresse SMTP réelle y compris en environnement Exchange
Public Function GetSmtp(ByVal Mail As Outlook.MailItem) As String
On Error Resume Next
If Mail.SenderEmailType = "EX" Then
GetSmtp = Mail.Sender.GetExchangeUser().PrimarySmtpAddress
Else
GetSmtp = Mail.SenderEmailAddress
End If
If Len(GetSmtp) = 0 Then GetSmtp = Mail.Sender.Address
End Function
' Impression de toutes les PJ autorisées
Public Sub PrintAllAttachments(ByVal Mail As Outlook.MailItem)
On Error GoTo CleanFail
Dim att As Outlook.Attachment, f As String
Dim printed As Long
If Mail.Attachments.Count = 0 Then Exit Sub
If AlreadyProcessed(Mail) Then Exit Sub
```
For Each att In Mail.Attachments
If IsAllowed(att.FileName) Then
f = SafeSave(att)
If Len(f) > 0 Then
If ShellPrint(f, PRINTER_NAME) Then printed = printed + 1
End If
End If
Next att
If printed > 0 Then MarkProcessed Mail
```
CleanFail:
End Sub
' Enregistrement sécurisé avec dédoublonnage
Private Function SafeSave(ByVal att As Outlook.Attachment) As String
Dim name As String, full As String, i As Long, base As String, ext As String
name = att.FileName
If InStrRev(name, ".") <= 0 Then name = name & ".bin"
base = Left\$(name, InStrRev(name, ".") - 1)
ext = Mid\$(name, InStrRev(name, ".") + 1)
full = TEMP\_FOLDER & name
i = 1
Do While FileExists(full)
full = TEMP\_FOLDER & base & "*" & Format\$(Now, "yyyymmdd\_hhnnss") & "*" & i & "." & ext
i = i + 1
Loop
att.SaveAsFile full
SafeSave = full
End Function
' Impression via l'application par défaut (print / printto)
Private Function ShellPrint(ByVal filePath As String, ByVal printer As String) As Boolean
Dim ret As LongPtr
Dim op As String, params As String
If Len(printer) > 0 Then
op = "printto"
params = """" & printer & """"
Else
op = "print"
params = vbNullString
End If
ret = ShellExecute(0, op, filePath, params, vbNullString, 0)
ShellPrint = (ret > 32)
End Function
Private Function FileExists(ByVal p As String) As Boolean
FileExists = (Dir\$(p, vbNormal) <> "")
End Function
Private Function IsAllowed(ByVal fileName As String) As Boolean
Dim ext As String, i As Long
If InStrRev(fileName, ".") = 0 Then Exit Function
ext = LCase\$(Mid\$(fileName, InStrRev(fileName, ".") + 1))
For i = LBound(AllowedExt) To UBound(AllowedExt)
If ext = AllowedExt(i) Then IsAllowed = True: Exit Function
Next i
IsAllowed = False
End Function
Private Sub CreateFolderIfMissing(ByVal p As String)
If Len(Dir\$(p, vbDirectory)) = 0 Then MkDir p
End Sub
Private Function AlreadyProcessed(ByVal Mail As Outlook.MailItem) As Boolean
On Error Resume Next
AlreadyProcessed = InStr(1, "," & Mail.Categories & ",", "," & CATEGORY\_PRINTED & ",", vbTextCompare) > 0
End Function
Private Sub MarkProcessed(ByVal Mail As Outlook.MailItem)
On Error Resume Next
If Len(Mail.Categories) = 0 Then
Mail.Categories = CATEGORY\_PRINTED
ElseIf InStr(1, Mail.Categories, CATEGORY\_PRINTED, vbTextCompare) = 0 Then
Mail.Categories = Mail.Categories & "," & CATEGORY\_PRINTED
End If
Mail.Save
End Sub
Module ThisOutlookSession (Approche A : traitement automatique sans règle)
Option Explicit
Private Sub Application\_Startup()
InitializeAutoPrint
End Sub
Private Sub Application\_NewMailEx(ByVal EntryIDCollection As String)
Dim ids() As String, i As Long
Dim itm As Object
Dim m As Outlook.MailItem
```
ids = Split(EntryIDCollection, ",")
For i = LBound(ids) To UBound(ids)
Set itm = Session.GetItemFromID(ids(i))
If TypeOf itm Is Outlook.MailItem Then
Set m = itm
If ShouldAutoPrint(m) Then
PrintAllAttachments m
End If
End If
Next i
```
End Sub
Alternative d’événement ItemAdd (si NewMailEx
ne se déclenche pas)
Si l’événement NewMailEx
est capricieux dans votre environnement, vous pouvez écouter les ajouts dans la Boîte de réception :
' Placez ceci dans ThisOutlookSession à la place de NewMailEx si besoin
Option Explicit
Private WithEvents InboxItems As Outlook.Items
Private Sub Application\_Startup()
InitializeAutoPrint
Set InboxItems = Session.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub InboxItems\_ItemAdd(ByVal Item As Object)
If TypeOf Item Is Outlook.MailItem Then
If ShouldAutoPrint(Item) Then
PrintAllAttachments Item
End If
End If
End Sub
Créer ou modifier la règle Outlook (Approche B)
- Accueil ▸ Règles ▸ Gérer les règles et alertes ▸ Nouvelle règle…
- Condition : provenant de personnes ou de groupes publics → choisissez l’expéditeur ciblé.
- Action : Exécuter un script → sélectionnez
Project1.modAutoPrint.Rule_AutoPrint
. - Nommez la règle (ex. « Auto‑print PJ – expéditeur »), enregistrez.
Astuce : si l’option « Exécuter un script » n’apparaît pas, vérifiez la valeur de Registre EnableUnsafeClientMailRules
et redémarrez Outlook.
Paramètres à adapter : tableau récapitulatif
Paramètre | Où | Valeur par défaut | Exemple de personnalisation |
---|---|---|---|
Expéditeur autorisé | ShouldAutoPrint | expediteur@example.com | @entreprise.com pour tout un domaine |
Dossier temporaire | TEMP_FOLDER | C:\Temp\OutlookAutoPrint\ | Chemin local non réseau (ex. D:\Jobs\PrintQueue\ ) |
Imprimante | PRINTER_NAME | Chaîne vide → imprimante par défaut | HP LaserJet M404 (Réseau) |
Extensions permises | AllowedExt | pdf, tif, tiff, jpg, jpeg, png | Ajoutez csv ou txt si nécessaire |
Déduplication | Catégorie | Auto-Print | Personnalisez la catégorie (couleur) pour suivi visuel |
Procédure de test rapide
- Vérifiez que l’imprimante choisie imprime un PDF manuellement.
- Créez le dossier temporaire et placez‑y un PDF de test ; tentez une impression via clic droit « Imprimer » : si cela échoue, adaptez votre lecteur PDF.
- Dans l’Éditeur VBA (Alt+F11), collez les modules, enregistrez, redémarrez Outlook.
- Envoyez‑vous un email depuis l’adresse autorisée avec une PJ
.pdf
: la pièce jointe doit s’imprimer automatiquement et le mail se marquer en catégorie « Auto‑Print ». - Si vous utilisez la règle (Approche B), lancez Règles ▸ Exécuter les règles maintenant… sur un message de test.
Conseils de fiabilité et de performance
- Restreignez le nombre d’extensions : les PDF et images s’impriment de manière plus prédictible que les documents Office (qui peuvent passer en vue protégée).
- Chemin local : évitez un répertoire réseau pour la sauvegarde des PJ afin de réduire la latence et les erreurs d’accès.
- Noms d’imprimantes exacts : copiez‑collez le nom tel qu’affiché dans Paramètres ▸ Imprimantes et scanners. Pour un partage réseau, notez
\\Serveur\NomImprimante
si l’application associée le gère. - Service Spouleur : si des impressions restent bloquées, videz la file d’attente et redémarrez le spouleur.
- Journalisation : ajoutez facilement une écriture dans un fichier
.log
(fonctionOpen For Append
) si vous voulez tracer les erreurs d’impression.
Résolution de problèmes : check‑list
Symptôme | Piste de résolution |
---|---|
L’option « Exécuter un script » n’apparaît pas | Vérifiez EnableUnsafeClientMailRules=1 et redémarrez Outlook. En domaine, une GPO peut l’interdire. |
Le code ne se déclenche pas | Assurez‑vous d’être sur Outlook classique. Dans VBE, Outils ▸ Références : aucune référence « Manquante ». Redémarrez Outlook après modification de ThisOutlookSession . |
Rien ne s’imprime, mais les fichiers se sauvegardent | L’association « Imprimer » de l’extension n’est pas enregistrée : ouvrez le format avec l’application par défaut et configurez la commande d’impression. Essayez printto avec un nom d’imprimante explicite. |
Imprimante réseau muette | Vérifiez l’accessibilité et les droits. Testez l’impression d’un fichier local hors Outlook. Essayez l’imprimante par défaut (laissez PRINTER_NAME vide). |
Pièces jointes Office non imprimées | Formats Office peuvent s’ouvrir en vue protégée. Privilégiez les PDF ou configurez la stratégie de fichiers « de confiance ». Sinon, automatiser Word/Excel pour imprimer (plus complexe). |
Doublons d’impression | La catégorie Auto‑Print évite les répétitions. Ne lancez pas simultanément l’Approche A et B sur la même boîte. |
Règle ignorée | Placez la règle en tête, décochez « arrêter le traitement des règles » sur les règles concurrentes si nécessaire. |
Sécurité : bonnes pratiques indispensables
- Signez votre projet VBA et autorisez uniquement les macros signées.
- Filtrez strictement expéditeur(s) et extensions imprimables.
- Désactivez la macro pendant vos tests si vous craignez des impressions intempestives.
- Nettoyez le dossier temporaire et surveillez l’espace disque.
Alternative sans VBA : outils dédiés
Si vous ne pouvez pas (ou ne souhaitez pas) réactiver VBA, des solutions tierces spécialisées existent et automatisent l’impression des pièces jointes. Elles proposent des filtres d’expéditeurs, des files d’attente, la planification et la gestion centralisée, mais sont payantes. Autre piste : conception d’un flux local via un outil d’automatisation (par ex. un robot qui surveille un répertoire et imprime les PDF déposés par une règle Outlook « Enregistrer la pièce jointe »). Ces approches sont robustes mais impliquent une configuration initiale.
FAQ rapide
Q : Puis‑je imprimer uniquement les PDF et ignorer les ZIP ?
R : Oui. Modifiez le tableau AllowedExt
pour n’autoriser que pdf
(et éventuellement tif
, jpg
, etc.).
Q : Comment connaître le nom exact de mon imprimante ?
R : Ouvrez Paramètres ▸ Imprimantes et scanners, copiez le nom tel qu’affiché. Évitez les alias tronqués.
Q : Le nouveau Outlook pour Windows est‑il compatible ?
R : Non. Le nouveau client ne prend pas en charge VBA. Utilisez Outlook classique ou une solution tierce.
Q : Dois‑je créer une règle si j’utilise NewMailEx
?
R : Non. L’Approche A n’exige pas de règle. L’Approche B est utile si vous voulez piloter les déclencheurs depuis l’assistant de règles.
Q : Comment éviter d’imprimer plusieurs fois le même message ?
R : Le code ajoute la catégorie Auto‑Print
après succès ; elle sert de garde‑fou. Vous pouvez aussi déplacer le message vers un sous‑dossier « Imprimés ».
Q : Les impressions restent « en attente »
R : Videz la file d’attente, redémarrez le spouleur, testez l’impression manuelle d’un PDF, puis relancez Outlook.
En résumé
- Pas de méthode 100 % native « simple » : l’impression automatique repose sur un script VBA ou un outil tiers.
- La voie la plus directe : placer un code dans
ThisOutlookSession
(Approche A) ou réactiver « Exécuter un script » et référencer une macroSub …(Item As MailItem)
dans une règle (Approche B). - Sécurisez : signez le projet, limitez l’exécution à des expéditeurs fiables, n’imprimez que les formats nécessaires, et nettoyez régulièrement le dossier temporaire.
Procédure essentielle pas à pas (version courte)
- Vérifiez que vous utilisez Outlook « classique » (Win32) et pas le nouveau Outlook.
- Créez
C:\Temp\OutlookAutoPrint\
(ou le dossier de votre choix). - Dans Outlook, Alt+F11 : collez les deux blocs de code (module standard +
ThisOutlookSession
), modifiez expéditeur, dossier et imprimante. - Optionnelle (Approche B) : activez
EnableUnsafeClientMailRules=1
puis créez la règle « Exécuter un script » ►Rule_AutoPrint
. - Réglez la sécurité des macros (idéal : macros signées). Redémarrez Outlook et testez.
Annexe : commande d’impression – alternatives
Commande | Quand l’utiliser | Remarques |
---|---|---|
ShellExecute "print" | Imprimer via l’application par défaut et l’imprimante par défaut | La plus simple ; exige que l’association « Imprimer » soit définie pour l’extension. |
ShellExecute "printto", "...", ""NomImprimante"" | Cibler explicitement une imprimante | Selon l’application, le paramètre printto peut nécessiter le port « \\Serveur\Imprimante ». |
print /d:NomImprimante "fichier.pdf" | En dernier recours via cmd | Fonctionne si l’application enregistre la commande print pour le type de fichier. |
Ce qu’il faut retenir
Rétablir l’impression automatique des pièces jointes sous Outlook pour Windows tient en trois points : un VBA propre (événement NewMailEx
ou règle), la réactivation éventuelle de « Exécuter un script » et une stratégie de macros conforme à vos exigences de sécurité. Avec le modèle ci‑dessus, vous partez d’une base solide, fiable et maintenable.