Outlook (Windows) : rétablir l’impression automatique des pièces jointes après mise à jour – VBA et règle « Exécuter un script »

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 ».

Sommaire

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énement NewMailEx 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èreApproche A – NewMailExApproche B – Règle + « Exécuter un script »
Support VBAOutlook classique (Win32)Outlook classique (Win32)
Nouveau Outlook pour WindowsNon pris en chargeNon pris en charge
Réactivation Registre requiseNonOui (EnableUnsafeClientMailRules)
Complexité d’installationFaibleMoyenne
Lisibilité dans l’interface des règlesLogique dans le codeLogique visible dans la règle

Prérequis et vérifications indispensables

Point à vérifierDétails
Édition d’OutlookFonctionne 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 signatureRecommandé : signer le projet VBA (par exemple avec SelfCert.exe) pour n’autoriser que votre code.
ImprimanteNotez le nom exact de l’imprimante (locale ou réseau). Testez une impression manuelle de PDF/ images depuis le poste.
Dossier temporaireCréez un répertoire local accessible au compte utilisateur (ex. C:\Temp\OutlookAutoPrint\), et prévoyez un nettoyage périodique.
Extensions autoriséesPar 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

  1. Ouvrez Fichier ▸ Options ▸ Centre de gestion de la confidentialité ▸ Paramètres des macros.
  2. 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.
  3. 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)

  1. Accueil ▸ Règles ▸ Gérer les règles et alertesNouvelle règle…
  2. Condition : provenant de personnes ou de groupes publics → choisissez l’expéditeur ciblé.
  3. Action : Exécuter un script → sélectionnez Project1.modAutoPrint.Rule_AutoPrint.
  4. 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ètreValeur par défautExemple de personnalisation
Expéditeur autoriséShouldAutoPrintexpediteur@example.com@entreprise.com pour tout un domaine
Dossier temporaireTEMP_FOLDERC:\Temp\OutlookAutoPrint\Chemin local non réseau (ex. D:\Jobs\PrintQueue\)
ImprimantePRINTER_NAMEChaîne vide → imprimante par défautHP LaserJet M404 (Réseau)
Extensions permisesAllowedExtpdf, tif, tiff, jpg, jpeg, pngAjoutez csv ou txt si nécessaire
DéduplicationCatégorieAuto-PrintPersonnalisez la catégorie (couleur) pour suivi visuel

Procédure de test rapide

  1. Vérifiez que l’imprimante choisie imprime un PDF manuellement.
  2. 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.
  3. Dans l’Éditeur VBA (Alt+F11), collez les modules, enregistrez, redémarrez Outlook.
  4. 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 ».
  5. 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 (fonction Open For Append) si vous voulez tracer les erreurs d’impression.

Résolution de problèmes : check‑list

SymptômePiste de résolution
L’option « Exécuter un script » n’apparaît pasVérifiez EnableUnsafeClientMailRules=1 et redémarrez Outlook. En domaine, une GPO peut l’interdire.
Le code ne se déclenche pasAssurez‑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 sauvegardentL’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 muetteVé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éesFormats 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’impressionLa 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éePlacez 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 macro Sub …(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)

  1. Vérifiez que vous utilisez Outlook « classique » (Win32) et pas le nouveau Outlook.
  2. Créez C:\Temp\OutlookAutoPrint\ (ou le dossier de votre choix).
  3. Dans Outlook, Alt+F11 : collez les deux blocs de code (module standard + ThisOutlookSession), modifiez expéditeur, dossier et imprimante.
  4. Optionnelle (Approche B) : activez EnableUnsafeClientMailRules=1 puis créez la règle « Exécuter un script » ► Rule_AutoPrint.
  5. Réglez la sécurité des macros (idéal : macros signées). Redémarrez Outlook et testez.

Annexe : commande d’impression – alternatives

CommandeQuand l’utiliserRemarques
ShellExecute "print"Imprimer via l’application par défaut et l’imprimante par défautLa plus simple ; exige que l’association « Imprimer » soit définie pour l’extension.
ShellExecute "printto", "...", ""NomImprimante""Cibler explicitement une imprimanteSelon l’application, le paramètre printto peut nécessiter le port « \\Serveur\Imprimante ».
print /d:NomImprimante "fichier.pdf"En dernier recours via cmdFonctionne 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.

Sommaire