Outlook 365: download automatico degli allegati con VBA, Power Automate e alternative sicure

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.

Indice

Panoramica rapida

Di seguito una sintesi decisionale per scegliere la strada migliore in base al client e ai requisiti.

ScenarioPossibilità attualeCome procedere
Nuovo Outlook (preview) per Windows/MacNon 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 WindowsSupporta 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‑sideIndipendente 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 OutlookIl 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

  1. Chiudi Outlook.
  2. Apri l’Editor del Registro (regedit.exe).
  3. Vai a HKEYCURRENTUSER\Software\Microsoft\Office\16.0\Outlook\Security (crea le chiavi mancanti se non esistono; la versione 16.0 copre Outlook 2016–Microsoft 365).
  4. Crea un valore DWORD (32 bit) EnableUnsafeClientMailRules e imposta 1.
  5. 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

  1. In Outlook: File → Opzioni → Centro protezione → Impostazioni Centro protezione → Impostazioni macro.
  2. Imposta “Disabilita tutte le macro con notifica” oppure “Consenti solo macro con firma digitale”.
  3. 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

  1. Apri Outlook e premi ALT+F11 per l’Editor VBA. Importa la macro in ThisOutlookSession o in un Modulo e salva.
  2. Chiudi l’Editor. Vai in File → Regole e avvisi → Nuova regola.
  3. Scegli “Applica regola ai messaggi in arrivo”. Aggiungi condizioni utili (es. da persone o gruppo, con allegati, oggetto contiene parole specifiche).
  4. Nelle azioni seleziona Esegui uno script e scegli SalvaAllegatiInArrivo.
  5. Aggiungi eventuali eccezioni (es. escludi mittenti interni o mailing list).
  6. 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

  1. Accedi a Power Automate e crea un flusso cloud automatico.
  2. Trigger: When a new email arrives (V3) nel connettore Outlook/Office 365 Outlook.
  3. Imposta i filtri del trigger: cartella Posta in arrivo, include allegati, eventuali condizioni su mittente/oggetto.
  4. 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).
  5. Nel ramo Yes, aggiungi Apply to each sugli elementi Attachments del trigger.
  6. 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.
  7. Opzionale: aggiungi una colonna metadati in SharePoint (mittente, oggetto, data) con azioni Update file properties.
  8. 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

  1. App registrata in Entra ID con permessi Mail.Read (delegati o applicazione).
  2. Autenticazione con certificato o secret, conservato in un vault sicuro.
  3. Job schedulato (Windows Task Scheduler) che invoca uno script PowerShell o un’app .NET/Python.
  4. 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

ParametroOutlook classico + VBAPower AutomateServizio custom con Graph
Dipendenza dal clientAlta: deve essere apertoNessunaNessuna
Portabilità tra dispositiviBassaAltaAlta
Time‑to‑valueImmediato su singola postazioneRapido con modello predefinitoMedio/alto (sviluppo richiesto)
Scalabilità e manutenzioneLimitata, manualeBuona, centralizzataOttima ma a carico del team
Controlli di sicurezza e auditLimitati; aumenta la superficie di rischioBuoni; integrazione DLP e logCompletamente personalizzabili
CostiBassi, inclusi nel clientLicenza Power AutomateCosto di sviluppo/gestione
Supporto Nuovo OutlookNo

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 in HKCU\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.

Indice