Sono diversi i motivi che ti potrebbero indurre le persone a voler inviare email direttamente da Excel. Ad esempio hai dei report in excel o dei fogli excel che si aggiornano su base giornaliera o settimanale e che desideri inviare via email a te stesso o ai tuoi clienti. Esistono diverse tecniche che consentono di schedulare e inviare e-mail da Excel, e alcuni codici VBA pronti all’uso sono descritti in discussioni già aperte nel nostro forum come ad esempio:
Qui di seguito invece vediamo come sfruttare VBA e la libreria Collaboration Data Objects (CDO) per inviare email da excel
CDO è un componente di messaggistica utilizzato in Windows ed è un componente è già incluso nell’installazione VBA in Microsoft Word o Excel ed è pronto per l’uso. L’utilizzo del componente rende estremamente semplice l’invio di e-mail dai programmi Windows con VBA. In questo esempio, utilizzeremo il componente CDO in Microsoft Excel per inviare un’email con i risultati presi da una cella Excel specifica.
Creazione della VBA Macro
Per prima cosa vai nella scheda SVILUPPO di Excel. Se non vedi tale scheda potrai attivarla andando in File –> Opzioni Excel e in Personalizzazione per attivare tale scheda.
All’interno della scheda SVILUPPO clicca su Inserisci nel box Controlli Modulo e seleziona l’icona relativa alla funzione “Pulsante di Comando”:

Disegna il pulsante nel foglio Excel e poi fai doppio click per aprire l’editor VBA:

Dopo che si apre l’editor VBA, dovrai aggiungere la referenza alla libreria CDO. Per far ciò clicca in alto su Strumenti > Riferimenti come mostrato nella figura sotto:

Nella lista vai in basso fino a trovare Microsoft CDO for Windows 2000 Library. Seleziona il relativo box e clicca su OK.

Impostazioni CDO
Ora sei pronto per utilizzare CDO per inviare e-mail da Microsoft Excel. Per fare ciò, è innanzitutto necessario creare gli oggetti di posta e impostare tutti i campi necessari per inviare l’e-mail. Tieni presente che mentre molti campi sono facoltativi, i valori “Da” (from) e “A” (to) sono obbligatori.
Dim CDO_Mail As Object Dim CDO_Config As Object Dim SMTP_Config As Variant Dim strSubject as String Dim strFrom as String Dim strTo as String Dim strCc as String Dim strBcc as String Dim strBody As String strSubject = "Report da foglio Excel" strFrom = "mittente@dominio.it" strTo = "destinatario@gmail.com" strCc = "" strBcc = "" strBody = "Il risultato per questo trimestre è: "
La cosa interessante di questo metodo è che puoi creare qualsiasi stringa per personalizzare il messaggio e-mail e assegnarlo alla variabile strBody. Puoi mettere insieme i componenti del messaggio utilizzando la stringa & e potrai inserire i dati da uno qualsiasi dei fogli di Microsoft Excel direttamente nel messaggio di posta elettronica
Adesso bisogna configurare CDO per utilizzare un qualsiasi server SMTP esterno per l’invio delle email. Ecco il codice con all’interno i parametri da modificare in base al SMTP che si vuole utilizzare. Nel nostro esempio abbiamo usato il server GMAIL per il quale va inserito il server smtp.gmail.com, porta 465, e devi ovviamente inserire come username il tuo indirizzo gmail e come password dovrai assicurarti di avere l’autenticazione a due fattori attivata e successivamente generare l’app password per l’app “Posta” di google. Una volta ottenuta l’app password la devi inserire nel codice:
Set CDO_Mail = CreateObject("CDO.Message")
On Error GoTo Error_Handling
Set CDO_Config = CreateObject("CDO.Configuration")
CDO_Config.Load -1
Set SMTP_Config = CDO_Config.Fields
With SMTP_Config
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "tuaemail@gmail.com"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "app password"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Update
End With
With CDO_Mail
Set .Configuration = CDO_Config
End With
Ora che hai configurato la connessione al server SMTP per l’invio dell’email, bisogna compilare i campi appropriati per l’oggetto CDO_Mail e cliccare sul comando Invia. Ecco il codice da aggiungere a quanto già visto sopra:
CDO_Mail.Subject = strSubject CDO_Mail.From = strFrom CDO_Mail.To = strTo CDO_Mail.TextBody = strBody CDO_Mail.CC = strCc CDO_Mail.BCC = strBcc CDO_Mail.Send Error_Handling: If Err.Description <> "" Then MsgBox Err.Description
Tutto qui. Adesso puoi testare l’intero codice VBA ed eseguirlo.
CODICE COMPLETO:
Private Sub CommandButton1_Click()
Dim CDO_Mail As Object
Dim CDO_Config As Object
Dim SMTP_Config As Variant
Dim strSubject As String
Dim strFrom As String
Dim strTo As String
Dim strCc As String
Dim strBcc As String
Dim strBody As String
strSubject = "Report da foglio Excel"
strFrom = "[TUA EMAIL]"
strTo = "[EMAIL DESTINATARIO]"
strCc = ""
strBcc = ""
strBody = "Body"
Set CDO_Mail = CreateObject("CDO.Message")
On Error GoTo Error_Handling
Set CDO_Config = CreateObject("CDO.Configuration")
CDO_Config.Load -1
Set SMTP_Config = CDO_Config.Fields
With SMTP_Config
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "[TUA EMAIL]"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "[APP PASSWORD]"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Update
End With
With CDO_Mail
Set .Configuration = CDO_Config
End With
CDO_Mail.Subject = strSubject
CDO_Mail.From = strFrom
CDO_Mail.To = strTo
CDO_Mail.TextBody = strBody
CDO_Mail.CC = strCc
CDO_Mail.BCC = strBcc
CDO_Mail.Send
Error_Handling:
If Err.Description <> "" Then MsgBox Err.Description
End Sub
Quando clicchi sul pulsante di Invio, non ci saranno finestre a comparsa o messaggi di avviso di sicurezza che possono verificarsi quando si ricorre all’utilizzo dell’oggetto di posta di Outlook. In questo script ci siamo svincolati totalmente da Outlook.
CDO mette semplicemente insieme l’e-mail e utilizza i dettagli della connessione al server SMTP per inviare il messaggio. Probabilmente è il modo più semplice per incorporare e inviare email tramite script VBA Excel.
NB: Se dutante l’invio dell’email si ottiene un errore del tipo “The transport failed to connect to the server” allora molto probabilmente hai inserito dati non corretti del SMTP o nome utente e password errata. Ricontrolla tutti questi dati e riprova
Tutto questo può essere facilmente automatizzato senza dover cliccare il pulsante di invio. Per fare questa automatizzazione bisogna andare nell’editor VBA e copiare e incollare tutto il codice visto sopra. Poi seleziona l’opzione ThisWorkbook sotto VBAProject

Copia e incolla il codice in ThisWorkbook. Poi sostituisci la prima riga con Sub Workbook_Open(). Questo farà in modo che la macro si avvierà ogni volta che apri il file

Vai poi in Task Scheduler. Utilizzeremo questo strumento per chiedere a Windows di aprire automaticamente il foglio di calcolo a intervalli regolari, a quel punto verrà avviata la nostra macro e quindi anche l’e-mail.

Seleziona Create Basic Task… dal menu Actions e segui la procedura guidata fino a quando si apre la finestra Action. Qui seleziona Start a program e clicca su Next.

Usa il pulsante Browse per trovare il percorso di Microsoft Excel sul tuo computer. Poi inserisci il percorso del tuo file Excel nel campo Add arguments. Completa il wizard e la schedulazione sarà pronta e attiva.

Buon articolo.
Che ne dici del metodo SendMail di un oggetto Workbook?
ho copiato e sostituito sia strfrom che strto
non ho capito se devo modificare anche “email@website.com”
la risposta è : impossibile inviare il messaggio al server.
codice errore di trasporto: 0x80040217. risposta del server: not aivailable
Perfetto, funziona perfettamente con una piccola modifica: la porta non è la 25 da usare ma la 465.
Purtroppo però dal 30 maggio 2022 non funzionerà più perché Gmail limiterà l’uso delle “App meno sicure” e quindi andrà modificato il tutto.
Come non so ma per 2 mesi si potrà usare.
Io sto utilizzando attivamente CDO e Gmail i tutti i miei progetti Access, tutto ancora regge. Speriamo bene 🙂
Gmail non funziona dal 30 maggio Qualcuno sa come ovviare o qualche provider che consente ancora l’invio?
Oppure se ci sono delle restrizioni da eliminare su Gmail?
Bè io ci sono riuscito perfettamente un attimo fa da un microtest che ho fatto con Excel.
Ho dovuto attivare la “password per App” nel pannello di controllo sicurezza di Google e ci sono riuscito perfino io 🙂
Vai qui e segui le istruzioni:
https://support.google.com/accounts/answer/185833?hl=it
Eventualmente ci sentiamo in privato (vecchio_frac@hotmail.it).
Ciao Vecchio Frac,
io ho lo stesso problema, ho utilizzato fino a poco fa le app meno sicure e riuscivo ad inviare le mail dal foglio excel, adesso non funziona più, Ma non ho capito come hai attivato la “password per App”, io non lo trovo nel pannello di sicurezza di google.
Sbaglio qualcosa?
Il link diretto alla pagina delle “password per app” in Google è https://myaccount.google.com/apppasswords
Per poter accedere a tale funzionalità è necessario abilitare l’autenticazione a due fattori nel proprio account Google.
Ciao a tutti,
molto utile, grazie.
Provo ad evolvere :-).. se avessi bisogno di recuperare indirizzi differenti, corpo mail differente in base a informazioni presenti nel file excel’?
provo a spiegarmi meglio: nel file excel raccolgo delle news (1 per riga), per ognuna ho un titolo (cella dedicata) , un estratto (cella dedicata), un destinatario mail (cella), un mese di riferimento (cella).
Se avessi bisogno di inoltrare le mail mensilmente, componendo in base al destinatario mail con oggetto/corpo differenti?
Grazie