23306 Letture

Esportare la posta elettronica da Outlook ad Access

In molti contesti lavorativi può risultare necessario esportare le e-mail gestite con Microsoft Outlook all'interno di un database Access. La procedura passo-passo integrata nel client di posta Outlook è semplice ed efficace ma ha un grosso limite: non è possibile aggiungere dati ad un database creato in precedenza. Se si desidera esportare frequentemente i dati nel medesimo database, è possibile applicare una soluzione basata sull'uso di codice VBA (Visual Basic for Applications).
Per esportare l'archivio di posta usando la procedura offerta da Outlook, è sufficiente fare riferimento all'apposito "wizard", accessibile facendo riferiemento alla funzione Importa/Esporta del menù File. Si dovrà semplicemente scegliere l'esportazione dei dati in formato Access, selezionare la cartella desiderata e premere il pulsante "Avanti".

Utilizzando del codice VBA, l'utente ha la possibilità di automatizzare l'intera procedura di esportazione da Outlook verso una base dati Access: premendo la combinazione di tasti ALT+F11 da Microsoft Outlook si avrà accesso all'Editor Visual Basic (VBE). Dal menù Inserisci, va selezionata la voce "Modulo" quindi si può procedere all'inserimento del seguente codice:


Sub EsportaPosta()
    Dim ns As Outlook.NameSpace
    Dim objFolder As Outlook.MAPIFolder
    Set ns = GetNamespace("MAPI")
    Set objFolder = ns.PickFolder
    Dim adoConn As ADODB.Connection
    Dim adoRS As ADODB.Recordset
    Dim intCounter As Integer
    Set adoConn = CreateObject("ADODB.Connection")
    Set adoRS = CreateObject("ADODB.Recordset")
    adoConn.Open "DSN=DatiOutlook;"
    adoRS.Open "SELECT * FROM email", adoConn, adOpenDynamic, adLockOptimistic
    For intCounter = objFolder.Items.Count To 1 Step -1
        With objFolder.Items(intCounter)
            if .Class = olMail Then
            adoRS.AddNew adoRS("Subject") = .Subject
            adoRS("Body") = .Body
            adoRS("FromName") = .SenderName
            adoRS("ToName") = .To
            adoRS("FromAddress") = .SenderEmailAddress
            adoRS("FromType") = .SenderEmailType
            adoRS("CCName") = .CC
            adoRS("BCCName") = .BCC
            adoRS("Importance") = .Importance
            adoRS("Sensitivity") = .Sensitivity
            adoRS.Update
            End If
        End With
    Next
    adoRS.Close
    Set adoRS = Nothing
    Set adoConn = Nothing
    Set ns = Nothing
    Set objFolder = Nothing
End Sub

Prima di eseguire la macro appena creata, è indispensabile - in questo caso - creare il database Access sul quale si andrà a memorizzare i dati esportati da Outlook. E' possibile, a tal proposito, servirsi di quello che può essere creato sfruttando la procedura passo-passo integrata in Outlook. Si può comunque impiegare, come base dati per la memorizzazione delle e-mail esportate da Outlook, anche un database già esistente: è sufficiente creare una tabella denominata "email" con i vari campi richiesti (Subject, Body, FromName, ToName, FromAddress,...). Tutti i campi sono di tipo testo tranne "Body" che deve essere necessariamente impostato come campo "memo".
I nomi dei campi ricalcano quelli impiegati dal wizard di Outlook purtuttavia possono essere liberamente modificati.
Il codice utilizza una connessione DSN (driver ODBC) per "dialogare" con la base dati Access. E' comunque possibile utilizzare altre stringhe di connessione. Se si usa una connessione DSN, è necessario accedere alla finestra "Strumenti di amministrazione" di Windows quindi fare doppio clic sull'icona "Origine dati (ODBC)". Nella finestra "DNS utente" è necessario selezionare "MS Access Database" quindi cliccare su "Aggiungi". Nella schermata successiva, va scelto "Microsoft Access Driver (*.mdb)" quindi cliccare sul pulsante "Fine".
Nella finestra "Configurazione ODBC per Microsoft Access", attribuire al DSN il nome "DatiOutlook". Cliccando il pulsante "Seleziona", si dovrà indicare il database Access da utilizzare.


Dopo aver creato il DSN, si potrà eseguire la macro da Outlook accedendo al menù Strumenti, Macro. A questo punto, si deve selezionare la macro "EsportaPosta" e premere il pulsante Esegui.


  1. Avatar
    zoolivia
    12/04/2013 12.59.55
    Salve a tutti. io ho risolto andando all'articolo originale e seguendo le istruzioni passo passo. attenzione al codice VBA che naturalmente e' in inglese. inoltre e' da tenere presente questo suggerimento:

    "Good stuff, but a couple of steps are missing. In the VB editor, using the menu option Tools...References, "Microsoft Outlook xx.0 Object Library", and "Microsoft ActiveX Data Objects 2.x library must be checked (the x's, which are version numbers, will vary depending on which version of Outlook and Windows you have installed."
    questo e' il link:
    http://www.techrepublic.com/blog/howdoi/how-do-i-export-e-mail-messages-to-access-using-vba/119" onclick="window.open(this.href);return false;
  2. Avatar
    appassionato
    06/08/2012 13.16.06
    Provate con questo codice abilitando le librerie ADO nel VBE (ALT+F11) :
    Sub ExportMailByFolder()
    'Export specified fields from each mail
    'item in selected folder.
    Dim ns As Outlook.NameSpace
    Dim objFolder As Outlook.MAPIFolder
    Set ns = GetNamespace("MAPI")
    Set objFolder = ns.PickFolder
    Dim adoConn As ADODB.Connection
    Dim adoRS As ADODB.Recordset
    Dim intCounter As Integer
    Set adoConn = CreateObject("ADODB.Connection")
    Set adoRS = CreateObject("ADODB.Recordset")
    'DSN and target file must exist.
    adoConn.Open "DSN=OutlookData;"
    adoRS.Open "SELECT * FROM email", adoConn, adOpenDynamic, adLockOptimistic
    For intCounter = objFolder.Items.Count To 1 Step -1
    With objFolder.Items(intCounter)
    'Copy property value to corresponding fields
    'in target file.
    If .Class = olMail Then
    adoRS.AddNew
    adoRS("Subject") = .Subject
    adoRS("Body") = .Body
    adoRS("FromName") = .SenderName
    adoRS("ToName") = .To
    adoRS("FromAddress") = .SenderEmailAddress
    adoRS("FromType") = .SenderEmailType
    adoRS("CCName") = .CC
    adoRS("BCCName") = .BCC
    adoRS("Importance") = .Importance
    adoRS("Sensitivity") = .Sensitivity
    adoRS.Update
    End If
    End With
    Next
    adoRS.Close
    Set adoRS = Nothing
    Set adoConn = Nothing
    Set ns = Nothing
    Set objFolder = Nothing
    End Sub
  3. Avatar
    Pietro_M
    07/05/2010 20.51.20
    Ho trovato che ci sono due istruzioni nella stessa riga.
    Queste due istruzioni devono essere riportate come segue:
    adoRS.AddNew
    adoRS("Subject") = .Subject
    il resto funziona perfettamente !
  4. Avatar
    VitoFox
    18/01/2010 12.52.22
    Ciao io ho avuto il tuo stesso problema. Devi fare in modo di aggiornare gli oggetti della libreria. Dalla finestra di VBE dalla voce STRUMENTI seleziona RIFERIMENTI e seleziona la libreria di ADO. Io ho risolto in questo modo ma adesso mi dà errore su questa riga: "adoRS.AddNew adoRS("Subject") = .Subject". Speriamo di riuscire a risolvere. Ciao
  5. Avatar
    Wolfnet
    06/03/2009 16.14.26
    salve,
    sono particolarmente interessato a questa macro per motivi professionali.
    ho seguito step to step le tue indicazioni con office 2003 in XP pro SP2, e quando eseguo la macro mi da il seguente errore:

    "errore di compilazione:"
    "tipo definito dall'utente non definito"

    ed il debug si ferma alla linea: "Dim adoConn As ADODB.Connection"
    se la remo si ferma alla successiva e quindi mi sono fermato.

    puoi darmi una mano in quanto sono praticamente ignorante in VB?
    grazie
Esportare la posta elettronica da Outlook ad Access - IlSoftware.it