Vuoi salvare in automatico gli allegati appena arrivano in Outlook 365? In questa guida pratica trovi cosa è possibile oggi con il Nuovo Outlook e con Outlook classico, come riattivare “Esegui uno script”, una macro VBA pronta all’uso, e due alternative moderne lato server con Power Automate e Microsoft Graph.
Panoramica rapida
Di seguito una sintesi decisionale per scegliere la strada migliore in base al client e ai requisiti.
Scenario | Possibilità attuale | Come procedere |
---|---|---|
Nuovo Outlook (preview) per Windows/Mac | Non supporta COM‑add‑in, macro VBA né l’azione “Esegui uno script”; non può scaricare allegati in automatico lato client. | Se l’automazione è indispensabile, torna a Outlook classico. Invia feedback dal menu ? → Help → Feedback per spingere l’introduzione della funzione. Valuta l’automazione server‑side con Power Automate (consigliata). |
Outlook classico per Windows | Supporta macro VBA e “Esegui uno script”, disattivato di default per ragioni di sicurezza. | Aggiungi la chiave di registro HKEYCURRENTUSER\Software\Microsoft\Office\16.0\Outlook\Security con DWORD EnableUnsafeClientMailRules=1 , poi riavvia Outlook. Crea una regola “Al ricevimento del messaggio” → “Esegui uno script” che richiama una macro VBA per salvare gli allegati in una cartella locale o di rete. Firma digitalmente la macro o limita l’ambito della regola per ridurre i rischi. |
Automazione server‑side | Indipendente dal client (funziona anche con Nuovo Outlook, Web e mobile). | Usa Power Automate con il modello “Save email attachments to OneDrive for Business/SharePoint”. Pro: nessun PC acceso, coerenza su tutti i dispositivi, governance migliore. Contro: richiede licenza; possibile ritardo di qualche minuto; limiti di dimensione allegati (es. 20 MB nei piani standard). |
Comandi manuali nel Nuovo Outlook | Il pulsante “Salva tutto in OneDrive” salva gli allegati ma li comprime in .zip e non è automatico. | Utile solo per casi saltuari; non sostituisce un processo automatizzato. |
Perché non tutti i client possono salvare allegati in automatico
Negli ultimi anni Microsoft ha rafforzato i controlli di sicurezza in Outlook, in particolare contro macro e automazioni che agiscono sui messaggi in arrivo. Il Nuovo Outlook è stato progettato con un’architettura più moderna e sandboxata: non espone l’Object Model di Outlook classico, non carica componenti COM e non esegue macro VBA locali. Per questo non è possibile, oggi, agganciare regole che avviano script locali al momento della ricezione.
Outlook classico per Windows, invece, resta pienamente compatibile con l’Object Model e consente regole lato client con azione “Esegui uno script”. Tale possibilità è disabilitata per impostazione predefinita dopo aggiornamenti di sicurezza, ma può essere riattivata consapevolmente tramite registro o criteri di gruppo.
Quando scegliere client‑side e quando server‑side
- Lato client (VBA + regola): adatto a singole postazioni, ambienti offline, bisogno di salvataggio su cartelle locali o UNC interne. Richiede che Outlook sia in esecuzione e il PC acceso. Sensibile a aggiornamenti, profili utente e antivirus.
- Lato server (Power Automate o API): ideale per team e aziende. Il salvataggio avviene nel cloud (OneDrive/SharePoint) o verso sistemi di archiviazione tramite connettori. Non dipende dal client, scala meglio, è più governabile dal punto di vista di sicurezza e audit.
Guida completa con Outlook classico e macro VBA
Prerequisiti e avvertenze
- Outlook classico per Windows (Microsoft 365 Apps, 2016/2019/2021), versione a 32 o 64 bit.
- Permessi per modificare il registro di sistema nel profilo utente (HKEYCURRENTUSER).
- Consapevolezza dei rischi: le regole che eseguono script possono ridurre la protezione antimalware se usate in modo indiscriminato.
Abilitazione dell’azione “Esegui uno script” nelle regole
- Chiudi Outlook.
- Apri l’Editor del Registro (
regedit.exe
). - Vai a
HKEYCURRENTUSER\Software\Microsoft\Office\16.0\Outlook\Security
(crea le chiavi mancanti se non esistono; la versione16.0
copre Outlook 2016–Microsoft 365). - Crea un valore DWORD (32 bit)
EnableUnsafeClientMailRules
e imposta1
. - Riavvia Outlook.
In alternativa, da prompt amministrativo puoi usare:
reg add "HKCU\Software\Microsoft\Office\16.0\Outlook\Security" ^
/v EnableUnsafeClientMailRules /t REG_DWORD /d 1 /f
Nota: in domini aziendali, un criterio di gruppo o una soluzione EDR può annullare questa impostazione ad ogni avvio. In tal caso coinvolgi l’amministratore di sicurezza.
Impostazioni macro consigliate
- In Outlook: File → Opzioni → Centro protezione → Impostazioni Centro protezione → Impostazioni macro.
- Imposta “Disabilita tutte le macro con notifica” oppure “Consenti solo macro con firma digitale”.
- Se firmi la macro, aggiungi il certificato tra gli autori attendibili.
Macro VBA pronta all’uso per salvare allegati
La macro seguente salva gli allegati di ogni messaggio in arrivo in una cartella, evitando immagini inline e duplicati tramite un suffisso progressivo. Mettila in ThisOutlookSession o in un Modulo standard; la firma corretta per la regola è Sub NomeScript(Item As Outlook.MailItem)
.
' --- ThisOutlookSession ---
' Macro: Salva allegati su disco, esclusi inline (CID/hidden)
' Configura la costante BASE_PATH secondo le tue esigenze.
Option Explicit
Private Const BASE_PATH As String = "C:\AllegatiPosta"
Public Sub SalvaAllegatiInArrivo(Item As Outlook.MailItem)
On Error GoTo EH
Dim fso As Object, saveFolder As String
Set fso = CreateObject("Scripting.FileSystemObject")
' Crea cartella base se non esiste
saveFolder = EnsureFolder(fso, BASE_PATH)
' Crea sotto-cartella per data (YYYY-MM-DD)
Dim subFolder As String
subFolder = EnsureFolder(fso, fso.BuildPath(saveFolder, Format(Now, "yyyy-mm-dd")))
Dim att As Outlook.Attachment, saved As Boolean
For Each att In Item.Attachments
If IsInlineAttachment(att, Item) Then
' Salta immagini inline (es. loghi email)
ElseIf att.Size > 0 Then
Dim cleanName As String
cleanName = CleanFileName(att.FileName)
Dim targetPath As String
targetPath = UniquePath(fso, fso.BuildPath(subFolder, cleanName))
att.SaveAsFile targetPath
saved = True
End If
Next att
' Facoltativo: log minimale
If saved Then
AppendLog fso, fso.BuildPath(saveFolder, "download_log.txt"), Item
End If
Exit Sub
EH:
' Gestione errori di massima
Debug.Print "Errore SalvaAllegatiInArrivo: " & Err.Number & " - " & Err.Description
End Sub
' Determina se un attachment è inline (CID/hidden)
Private Function IsInlineAttachment(att As Outlook.Attachment, itm As Outlook.MailItem) As Boolean
On Error Resume Next
Dim pa As Outlook.PropertyAccessor
Set pa = att.PropertyAccessor
Dim contentId As String
contentId = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F")
Dim isHidden As Boolean
isHidden = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x7FFE000B")
' Alcuni client usano nomi tipo image001.png; doppio controllo
Dim nameLc As String
nameLc = LCase$(att.FileName)
IsInlineAttachment = (contentId <> "") Or isHidden _
Or (InStr(nameLc, "image00") = 1 And (Right$(nameLc, 4) = ".png" Or Right$(nameLc, 4) = ".jpg" Or Right$(nameLc, 5) = ".jpeg" Or Right$(nameLc, 4) = ".gif"))
End Function
' Sanifica il nome file
Private Function CleanFileName(ByVal s As String) As String
Dim badChars As Variant
badChars = Array("\", "/", ":", "*", "?", """", "<", ">", "|")
Dim i As Long
For i = LBound(badChars) To UBound(badChars)
s = Replace$(s, badChars(i), "_")
Next
' Taglia e rimuove spazi finali
s = Trim$(s)
If Len(s) > 180 Then s = Left$(s, 180)
CleanFileName = s
End Function
' Crea la cartella se non esiste
Private Function EnsureFolder(fso As Object, ByVal path As String) As String
If Not fso.FolderExists(path) Then fso.CreateFolder path
EnsureFolder = path
End Function
' Evita sovrascritture con suffisso (1), (2), ...
Private Function UniquePath(fso As Object, ByVal path As String) As String
Dim base As String, ext As String, i As Long, cand As String
Dim dotPos As Long: dotPos = InStrRev(path, ".")
If dotPos > 0 Then
base = Left$(path, dotPos - 1)
ext = Mid$(path, dotPos)
Else
base = path: ext = ""
End If
cand = path: i = 1
Do While fso.FileExists(cand)
cand = base & " (" & i & ")" & ext
i = i + 1
Loop
UniquePath = cand
End Function
' Log minimale su file di testo
Private Sub AppendLog(fso As Object, ByVal logPath As String, itm As Outlook.MailItem)
Dim ts As Object
Set ts = fso.OpenTextFile(logPath, 8, True, -1)
ts.WriteLine Format(Now, "yyyy-mm-dd HH:nn:ss") & " | " & itm.SenderName & " | " & itm.Subject
ts.Close
End Sub
Creazione della regola che esegue la macro
- Apri Outlook e premi ALT+F11 per l’Editor VBA. Importa la macro in ThisOutlookSession o in un Modulo e salva.
- Chiudi l’Editor. Vai in File → Regole e avvisi → Nuova regola.
- Scegli “Applica regola ai messaggi in arrivo”. Aggiungi condizioni utili (es. da persone o gruppo, con allegati, oggetto contiene parole specifiche).
- Nelle azioni seleziona Esegui uno script e scegli
SalvaAllegatiInArrivo
. - Aggiungi eventuali eccezioni (es. escludi mittenti interni o mailing list).
- Dai un nome alla regola, attivala e conferma.
Verifica: invia a te stesso un’email con un allegato di test; controlla che il file compaia nella cartella configurata. In caso di errore, apri l’Editor VBA e monitora la finestra Immediate (CTRL+G) per i messaggi Debug.Print
.
Consigli di hardening
- Limita la regola a mittenti o domini sicuri e a tipi di file attesi.
- Firma digitalmente il progetto VBA e imposta Outlook per consentire solo macro firmate.
- Se salvi su una share, usa permessi di sola scrittura per l’utente di Outlook, così gli allegati non possono essere letti automaticamente da malware locale.
- Configura esclusioni antivirus in modo selettivo solo sulla cartella di destinazione, se strettamente necessario e previo consenso IT.
Automazione server‑side con Power Automate
Questa soluzione è consigliata nella maggior parte dei casi perché non richiede PC accesi, è coerente su tutti i client (Nuovo Outlook incluso) e semplifica la governance della sicurezza.
Vantaggi principali
- Funziona anche se l’utente non ha Outlook aperto.
- Centralizza i file in OneDrive for Business o SharePoint, facilitando condivisione e versioning.
- Si integra con approvazioni, classificazioni e politiche di Data Loss Prevention.
Procedura passo‑passo
- Accedi a Power Automate e crea un flusso cloud automatico.
- Trigger: When a new email arrives (V3) nel connettore Outlook/Office 365 Outlook.
- Imposta i filtri del trigger: cartella Posta in arrivo, include allegati, eventuali condizioni su mittente/oggetto.
- Aggiungi un’azione Condition per verificare che Has Attachments sia true e, se utile, che il tipo di file corrisponda a pattern (es.
endsWith(item()?['name'], '.pdf')
nell’Apply to each). - Nel ramo Yes, aggiungi Apply to each sugli elementi Attachments del trigger.
- All’interno, usa Create file su OneDrive/SharePoint:
- Folder Path: cartella di destinazione (es.
/EmailAttachments/@{formatDateTime(utcNow(),'yyyy-MM-dd')}
). - File Name:
@{guid()}-@{items('Applytoeach')?['name']}
per evitare duplicati. - File Content: Attachments Content.
- Folder Path: cartella di destinazione (es.
- Opzionale: aggiungi una colonna metadati in SharePoint (mittente, oggetto, data) con azioni Update file properties.
- Abilita il Concurrency Control su Apply to each a 1 per ridurre collisioni su file con lo stesso nome.
Limitazioni e come gestirle
- Dimensione allegato: i piani standard spesso limitano a circa 20 MB. Per file più grandi valuta connettori premium, chunk upload o invio a una library SharePoint con supporto a file pesanti.
- Ritardi: il flusso può attivarsi con qualche minuto di lag; non è adatto a scenari near‑real‑time mission‑critical.
- Duplicati: usa
guid()
nel nome e, se necessario, implementa un controllo su Message‑ID per idempotenza.
Alternative senza Power Automate
Servizio Windows o script pianificato con Microsoft Graph
Per chi non dispone di licenze Power Automate o preferisce un controllo totale, è possibile sviluppare un piccolo servizio che legge periodicamente la posta e scarica gli allegati via Microsoft Graph, salvandoli in un percorso locale o in un archivio S3/Azure Blob.
Architettura di riferimento
- App registrata in Entra ID con permessi Mail.Read (delegati o applicazione).
- Autenticazione con certificato o secret, conservato in un vault sicuro.
- Job schedulato (Windows Task Scheduler) che invoca uno script PowerShell o un’app .NET/Python.
- Filtro su cartelle/etichette e su messaggi non ancora processati (tramite estensioni, delta query o proprietà di estensione open type).
Esempio PowerShell concettuale
# Pseudo‑codice con Microsoft Graph PowerShell SDK
Connect-MgGraph -Scopes "Mail.Read"
$messages = Get-MgUserMailFolderMessage -UserId me -MailFolderId Inbox -Top 50 -Filter "hasAttachments eq true"
foreach ($m in $messages) {
$atts = Get-MgUserMessageAttachment -UserId me -MessageId $m.Id
foreach ($a in $atts) {
if ($a.'@odata.type' -eq '#microsoft.graph.fileAttachment') {
$path = "C:\AllegatiPosta\" + (Get-Date -Format yyyy-MM-dd) + "\" + $a.Name
New-Item -ItemType Directory -Force -Path (Split-Path $path) | Out-Null
[IO.File]::WriteAllBytes($path, [Convert]::FromBase64String($a.ContentBytes))
}
}
}
Nota di sicurezza: gestire un’app con accesso alla posta è un’operazione sensibile. Usa least privilege, rotazione delle credenziali, registrazione e audit.
Confronto dettagliato tra approcci
Parametro | Outlook classico + VBA | Power Automate | Servizio custom con Graph |
---|---|---|---|
Dipendenza dal client | Alta: deve essere aperto | Nessuna | Nessuna |
Portabilità tra dispositivi | Bassa | Alta | Alta |
Time‑to‑value | Immediato su singola postazione | Rapido con modello predefinito | Medio/alto (sviluppo richiesto) |
Scalabilità e manutenzione | Limitata, manuale | Buona, centralizzata | Ottima ma a carico del team |
Controlli di sicurezza e audit | Limitati; aumenta la superficie di rischio | Buoni; integrazione DLP e log | Completamente personalizzabili |
Costi | Bassi, inclusi nel client | Licenza Power Automate | Costo di sviluppo/gestione |
Supporto Nuovo Outlook | No | Sì | Sì |
Pratiche di sicurezza e conformità
- Riduci l’ambito: filtra per mittenti attesi, parole chiave in oggetto e dimensione file.
- Evita l’esecuzione indiscriminata di script lato client; usa firme digitali e repository sicuri per il codice.
- Se salvi dati personali o sensibili, applica etichette di riservatezza e conserva i log (chi ha inviato cosa, quando e dove è stato salvato).
- Per dati regolamentati, preferisci il salvataggio su SharePoint con controlli di versione, audit e criteri di retention.
- Considera antivirus/EDR lato server per scansionare gli upload verso OneDrive/SharePoint.
Risoluzione dei problemi
L’azione “Esegui uno script” non compare
- Verifica la chiave di registro
EnableUnsafeClientMailRules=1
inHKCU\Software\Microsoft\Office\16.0\Outlook\Security
. - Se sei in dominio, una GPO potrebbe ripristinare il valore a 0 o impedirne la creazione.
- Controlla che la macro sia un
Sub
pubblico con firma(Item As Outlook.MailItem)
.
La macro non appare nella lista degli script
- Il nome della procedura non deve contenere spazi o caratteri speciali.
- Il progetto VBA deve essere salvato e Outlook riavviato dopo modifiche importanti.
- Se la macro è in un modulo di classe, spostala in ThisOutlookSession o in un modulo standard.
Salvataggi duplicati o sovrascritti
- Usa la funzione
UniquePath
inclusa nella macro per aggiungere un suffisso numerico automatico. - Su Power Automate, anteponi
guid()
al nome del file.
Immagini inline salvate per errore
- La funzione
IsInlineAttachment
filtra Content‑ID e allegati hidden. Raffinane le condizioni se ricevi template HTML particolari.
Permessi insufficienti sulla cartella di destinazione
- Verifica i diritti NTFS/Share e la raggiungibilità di percorsi UNC.
- Se la cartella è in OneDrive sincronizzato, attendi la replica e controlla il client OneDrive.
Domande frequenti
Posso usare la stessa macro su più PC? Sì, ma ogni profilo Outlook ha il proprio archivio VBA. Distribuisci il progetto firmato e mantieni coerenti i percorsi di salvataggio.
Posso salvare solo alcuni tipi di file? Sì. Aggiungi nella macro un controllo su estensione (es. If LCase$(Right$(cleanName, 4)) = ".pdf" Then ...
) oppure usa filtri del trigger in Power Automate.
Posso rinominare i file con data, mittente e oggetto? Certo: modifica cleanName
concatenando Format(Now,"yyyyMMdd")
, Item.SenderEmailAddress
e uno slug dell’oggetto.
Il Nuovo Outlook supporterà in futuro macro o COM? Al momento non è previsto. Per avere download automatico oggi, usa Outlook classico o sposta l’automazione sul server.
Checklist operativa
- Identifica il client usato dagli utenti (Nuovo Outlook o classico).
- Se classico: abilita “Esegui uno script”, importa la macro, crea la regola, testa su e‑mail di prova.
- Se Nuovo Outlook o multi‑dispositivo: crea il flusso in Power Automate e imposta una convenzione di naming robusta.
- Definisci cartelle e permessi di destinazione, e pianifica un ciclo di pulizia o archiviazione.
- Documenta la soluzione (chi fa cosa, dove finiscono i file, come si ripristina).
Note di sicurezza e best practice
- Le macro VBA e la chiave
EnableUnsafeClientMailRules
riducono la protezione antimalware di Outlook: usale solo in ambienti controllati. - In assenza di licenze Power Automate, si può valutare un servizio Windows basato su Microsoft Graph o uno script PowerShell in Task Scheduler per scaricare gli allegati, ma sono richieste competenze di sviluppo e gestione sicura delle credenziali.
- Per scenari enterprise, privilegia l’automazione server‑side: più semplice da auditare, gestire e mettere in sicurezza.
Sintesi finale
- Il Nuovo Outlook non offre oggi il download automatico di allegati. Se ti serve subito, usa Outlook classico o sposta l’automazione su Power Automate.
- Outlook classico lo consente con macro VBA, abilitando “Esegui uno script” via registro.
- Power Automate è la via moderna, server‑side e indipendente dal client, a patto di disporre della licenza adeguata.
Con questi approcci avrai una soluzione funzionante subito e una strategia a lungo termine allineata all’evoluzione di Microsoft 365.