access vba: per inviare email da Microsoft Access con VBA puoi usare DoCmd.SendObject quando vuoi una soluzione semplice basata sul client di posta compatibile con MAPI, oppure automatizzare Outlook classico per Windows tramite il relativo object model quando servono maggiore controllo, allegati multipli, HTML o gestione avanzata del messaggio. È importante distinguere Outlook classico dal nuovo Outlook per Windows: Microsoft documenta che i tradizionali add-in COM/VSTO non sono supportati nel nuovo Outlook e che le integrazioni moderne devono orientarsi a web add-in e, per scenari di servizio, Microsoft Graph.
Questa guida mostra come progettare un invio email affidabile da Access per Microsoft 365 e Access 2024, come creare messaggi con SendObject, come generare un PDF e allegarlo con Outlook classico, come evitare invii accidentali, come gestire Runtime, 32/64 bit e sicurezza e quali limiti considerare quando gli utenti stanno migrando al nuovo Outlook.
Indice
- SendObject: soluzione semplice
- Inviare una query o un report
- Mostrare o inviare subito
- Automazione Outlook classico
- Early binding e late binding
- Allegare PDF
- HTML e destinatari
- Nuovo Outlook: limiti attuali
- Runtime e sicurezza
- Troubleshooting
- FAQ
Prima di scegliere il metodo
Chiediti che tipo di email devi creare. Se vuoi semplicemente inviare una query, tabella o report in uno dei formati supportati e lasciare che l’utente controlli il messaggio, SendObject può essere sufficiente. Se devi creare una mail HTML con più allegati, firme personalizzate o proprietà Outlook specifiche, l’automazione di Outlook classico offre più controllo.
Se però l’organizzazione usa il nuovo Outlook per Windows, non progettare una soluzione nuova basata sull’Outlook Object Model COM come se fosse una piattaforma futura garantita. Microsoft ha spostato il nuovo Outlook verso il modello dei web add-in; le integrazioni esterne devono essere ripensate quando dipendono da COM.
DoCmd.SendObject: il punto di partenza
Microsoft Learn documenta DoCmd.SendObject per includere oggetti Access in un messaggio di posta. Un esempio semplice:
Public Sub InviaRiepilogo()
DoCmd.SendObject acSendQuery, "qryRiepilogo", acFormatXLSX, _
"amministrazione@example.com", , , _
"Riepilogo Access", _
"In allegato il riepilogo aggiornato.", True
End Sub
L’ultimo argomento True apre il messaggio per consentire all’utente di controllarlo. False tenta l’invio senza modifica, a seconda del client e della configurazione.
Perché iniziare con EditMessage=True
Durante sviluppo e test usa sempre la modalità che mostra il messaggio. Evita di inviare decine di email reali per un bug nel ciclo o nel filtro. Usa destinatari di test e un ambiente separato. Solo dopo aver verificato destinatari, allegati e testo valuta l’invio automatico.
Inviare una query
SendObject può inviare un datasheet di query in formati supportati. È utile per report operativi semplici, ma non aspettarti la stessa resa grafica di un PDF progettato. Se la presentazione è importante, crea un report Access ed esportalo in PDF.
Inviare un report con SendObject
Puoi usare acSendReport e scegliere il formato disponibile. Verifica sempre la resa effettiva. Alcuni formati storici supportati da SendObject non sono equivalenti ai moderni XLSX o PDF in ogni scenario.
Creare prima un PDF
Una strategia robusta è: aprire il report filtrato, esportarlo con DoCmd.OutputTo in PDF, chiuderlo e poi allegare il file a una mail. Questo separa generazione del documento e invio.
Il nome file dovrebbe includere identificativo e data, evitando caratteri non validi. Verifica che la cartella sia accessibile e che il PDF esista prima di creare l’email.
Automazione Outlook classico
Con Outlook classico puoi creare un oggetto Outlook.Application e un MailItem. In early binding devi aggiungere un riferimento alla libreria Microsoft Outlook; in late binding usi CreateObject e costanti numeriche.
Esempio concettuale late binding:
Public Sub CreaMailOutlookClassico()
Dim olApp As Object
Dim olMail As Object
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.CreateItem(0)
With olMail
.To = "cliente@example.com"
.Subject = "Report mensile"
.Body = "In allegato il report."
.Display
End With
Set olMail = Nothing
Set olApp = Nothing
End Sub
Usa .Display durante i test. .Send invia direttamente e richiede controlli più rigorosi.
Early binding o late binding
Early binding offre IntelliSense e costanti leggibili, utile in sviluppo. Richiede però un riferimento Outlook nel progetto e può creare problemi se la libreria manca. Late binding evita il riferimento esplicito ma perde IntelliSense e richiede costanti numeriche o dichiarate manualmente.
Se distribuisci a molti PC, late binding può ridurre alcuni problemi di riferimenti, ma non risolve l’assenza di Outlook classico né rende compatibile il codice con il nuovo Outlook.
Allegare un file
Con Outlook classico:
.Attachments.Add filePath
Prima controlla Len(Dir(filePath)) > 0. Un file non trovato deve produrre un messaggio prima dell’apertura della mail.
Allegare più documenti
Puoi aggiungere più allegati in sequenza. Non allegare automaticamente intere cartelle senza filtri: rischi di inviare documenti non pertinenti o sensibili. Costruisci una lista esplicita e verificata.
Email HTML
Outlook classico espone HTMLBody. Se costruisci HTML da dati utente, devi eseguire escaping dei caratteri per evitare markup rotto. Mantieni il template semplice e testalo su diversi client.
Non usare HTML email come meccanismo per eseguire script: i client di posta applicano restrizioni per sicurezza.
Destinatari To, CC e BCC
Valida gli indirizzi prima dell’invio. Una semplice presenza di @ non garantisce che l’indirizzo esista. Se la mail contiene dati sensibili, fai attenzione ai destinatari multipli: spesso BCC è preferibile quando i destinatari non devono vedere gli altri indirizzi.
Non memorizzare liste di destinatari critiche direttamente nel codice se cambiano spesso. Usa una tabella di configurazione con accesso controllato.
Invio per ogni cliente: rischio maggiore
Un ciclo che invia centinaia di email è un processo sensibile. Prima genera un’anteprima della lista destinatari e dei documenti. Introduci un flag «Test» che sostituisce tutti i destinatari con una casella interna. Registra ogni invio con ID cliente, oggetto, file e stato, evitando di salvare contenuti personali non necessari.
Non inviare dallo stesso evento più volte
Evita di collegare l’invio a eventi che possono scattare più volte, come Current o AfterUpdate senza controlli. Un pulsante esplicito o una procedura batch controllata è più sicuro. Se l’invio deve avvenire dopo un salvataggio, registra uno stato che impedisca duplicati.
Nuovo Outlook per Windows: cosa cambia
Microsoft Learn indica che i COM add-in non sono supportati nel nuovo Outlook per Windows e che, durante la migrazione, vengono installate controparti web quando disponibili. Microsoft descrive i web add-in come il modello moderno supportato nel nuovo Outlook. Di conseguenza il codice Access che crea Outlook.Application tramite COM deve essere considerato una dipendenza da Outlook classico.
Se l’azienda sta passando al nuovo Outlook, pianifica una migrazione. Per integrazioni client puoi valutare Office.js/web add-in; per automazioni a livello mailbox o servizio, Microsoft Graph è spesso il percorso moderno. Access VBA non chiama automaticamente queste API senza un’architettura e autenticazione dedicate.
SendObject e nuovo Outlook
SendObject usa il sistema di posta disponibile e storicamente MAPI. Non dare per scontato che ogni combinazione di nuovo Outlook, account e Windows si comporti come Outlook classico. Testa sul client realmente distribuito. Se il flusso è critico, non basarlo su un comportamento non verificato.
Alternative senza automazione Outlook
Per processi aziendali puoi esportare il file da Access e affidare l’invio a Power Automate, Microsoft Graph tramite un servizio intermedio o un sistema mail aziendale. Questa separazione evita di legare un database desktop alla presenza di un client Outlook specifico.
La scelta dipende da licenze, sicurezza, autenticazione e volume. Non inserire credenziali SMTP in chiaro nel VBA.
Generare un PDF per un singolo cliente
Pattern:
DoCmd.OpenReport "rptFattura", acViewPreview, , "IDFattura=" & idFattura
DoCmd.OutputTo acOutputReport, "rptFattura", acFormatPDF, filePath, False
DoCmd.Close acReport, "rptFattura"
Usa un error handler per chiudere il report anche se OutputTo fallisce. Se più utenti generano PDF nella stessa cartella, crea nomi univoci.
Gestione errori
Distinguere errori di generazione documento da errori di creazione email. Se il PDF non esiste, non aprire una mail «con allegato» senza allegato. Registra numero e descrizione dell’errore.
Con automazione Outlook, rilascia oggetti anche in uscita. Non usare On Error Resume Next per tutto il processo.
Sicurezza e privacy
L’email può uscire dal perimetro del database. Applica principio del minimo dato: invia soltanto ciò che serve. Controlla destinatario e allegato. Per dati personali o riservati segui policy aziendali e requisiti normativi.
Non proteggere allegati sensibili con password hard-coded nel VBA. Se serve cifratura, usa strumenti e processi appropriati.
Access Runtime
Le procedure VBA e SendObject possono essere eseguite nel Runtime se l’applicazione e il client mail sono configurati. L’utente non deve modificare codice. Prevedi schermate di configurazione e log.
Testa specificamente il Runtime sul PC destinazione, perché Outlook, account predefinito e associazioni possono variare.
32 e 64 bit
SendObject non cambia tra architetture. L’automazione COM Outlook deve avere componenti compatibili con l’ambiente Office installato. Il late binding riduce i riferimenti espliciti ma non elimina la necessità di un client COM supportato.
Microsoft 365 e Access 2024
SendObject è documentato nel modello Access VBA. Outlook classico continua a supportare il modello tradizionale; il nuovo Outlook usa un’architettura diversa. Nel 2026 è quindi fondamentale dichiarare chiaramente quale client supporta la tua soluzione.
Problemi comuni
ActiveX component can’t create object
Outlook classico può non essere installato, registrato o accessibile. Se l’utente usa solo nuovo Outlook, la COM automation non è il percorso corretto.
Il file allegato non esiste
Controlla generazione PDF e percorso prima della mail.
La mail parte due volte
Verifica l’evento che chiama la procedura e registra lo stato di invio.
Riferimento Outlook MISSING
Se usi early binding, correggi il riferimento o valuta late binding. Compila il progetto.
SendObject non usa il client previsto
Controlla associazioni Windows e configurazione del client. Per processi critici valuta un’integrazione indipendente dal client locale.
Checklist
Definisci client supportato, destinatari, oggetto, corpo, allegati, modalità test, log, gestione duplicati, privacy, errori e comportamento con Outlook assente. Prova casella test, file mancante, destinatario vuoto, nuovo Outlook e Outlook classico se entrambi sono presenti.
Prima di attivare invii automatici di massa aggiungi un limite massimo di messaggi per esecuzione e una modalità dry-run. Un errore nel filtro non deve trasformarsi in centinaia di email sbagliate.
FAQ
Qual è il modo più semplice per inviare da Access?
DoCmd.SendObject quando il requisito è semplice e il client mail supporta il flusso.
Come allego un PDF?
Genera il PDF con OutputTo e, con Outlook classico, usa Attachments.Add.
Il codice Outlook.Application funziona nel nuovo Outlook?
Non va progettato come integrazione del nuovo Outlook: il modello COM appartiene a Outlook classico; il nuovo Outlook usa web add-in e modelli moderni.
Posso inviare senza mostrare la mail?
Sì in diversi scenari, ma durante sviluppo usa Display/EditMessage e attiva Send solo dopo controlli rigorosi.
Come automatizzo senza dipendere da Outlook?
Valuta Power Automate, Microsoft Graph o un servizio mail aziendale con autenticazione gestita.
Approfondimenti
- Come usare VBA in Access
- Esportare un report Access in PDF
- Integrare Access con Outlook
- Tutte le Guide Access
- Microsoft Learn: DoCmd.SendObject
- Microsoft Learn: Outlook add-ins overview
Conclusione
Inviare email da Access con VBA richiede oggi una scelta consapevole dell’architettura. SendObject resta adatto a scenari semplici; Outlook classico consente automazione COM più ricca; il nuovo Outlook non deve essere trattato come compatibile con il vecchio Outlook Object Model. Genera documenti e allegati in modo verificabile, usa modalità test, limita gli invii automatici e registra gli esiti. Se il processo è strategico o deve sopravvivere alla migrazione dei client, separa l’invio dalla UI desktop e valuta web add-in, Graph o automazioni cloud gestite.