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.

 

Come Inviare Email da Excel con Script VBA

9 pensieri su “Come Inviare Email da Excel con Script VBA

  • 08/09/2018 alle 12:39
    Permalink

    Buon articolo.
    Che ne dici del metodo SendMail di un oggetto Workbook?

    Rispondi
  • 14/03/2022 alle 22:58
    Permalink

    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

    Rispondi
  • 29/03/2022 alle 23:15
    Permalink

    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.

    Rispondi
    • 04/10/2022 alle 16:43
      Permalink

      Io sto utilizzando attivamente CDO e Gmail i tutti i miei progetti Access, tutto ancora regge. Speriamo bene 🙂

      Rispondi
      • 09/10/2022 alle 10:55
        Permalink

        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?

        Rispondi
        • 09/10/2022 alle 12:53
          Permalink

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

          Rispondi
          • 12/11/2022 alle 11:24
            Permalink

            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?

          • 12/11/2022 alle 11:36
            Permalink

            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.

  • 17/10/2023 alle 11:17
    Permalink

    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

    Rispondi

Rispondi a Matteo Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.