.Net estrapolare le informazioni da un file PST tramite C# e VB.Net

Articolo per la gestione dei file di posta elettronica per estrapolare informazioni riguardante le email ricevute.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come tramite tecnologia .Net, ed in particolare con i linguaggi di programmazione VB.Net e C#, rileviamo il contenuto di un file PST.
I file .pst, sono quei file di Microsoft Outlook, e quindi posta elettronica, che contengono una casella email.
Vedremo come estrapolare informazioni relativi all’oggetto, mittente, destinatario, e data ricevuto.
Nel caso che dobbiamo creare un progetto di tipo batch ossia che viene schedulato che ogni sera dal server deve leggere i file pst in una cartella, oppure che vorremmo aggiungere ai nostri programmi la funzionalità di lettura dei file di posta elettronica, questo articolo potrà tornare utile.

Creazione del progetto e stesura del codice


Il progetto che andremo a creare è una “Windows Form” ossia programmi eseguibili che permettono di essere lanciati sul proprio pc tramite il doppio click sul file che ha l’estensione .exe.
Tale tecnica si può usare anche per i progetti di tipo web, con opportune modifiche.
Dopo aver aperto Visual Studio, tramite il linguaggio di proprio interesse, selezioniamo la categoria “Desktop di Windows” da qui il modello “Windows Application”.
Dopo aver creato il progetto, inseriamo nella form un pulsante, che al click andrà a leggere nel file “.pst”.
A questo punto dobbiamo aggiungere il riferimento ad Outlook.
In esplora soluzioni, facciamo click con il taso destro sul nome del progetto e dal menu di scelta rapida selezioniamo la voce di menu “Aggiungi” e poi la sotto voce “Riferimenti”.
Nella finestra che viene aperta, selezioniamo la linguetta “COM” e poi la voce “Microsoft Outlook 16 Object Library” dove il numero indica la versione, il tutto come mostrato qui di seguito.

Figura 1 – L’aggiunta di riferimento a Microsoft Outlook.


Dopo averlo selezionato e fatto click sul pulsante “OK”, passiamo in visualizzazione codice della form.
In alto sopra ad ogni dichiarazione, aggiungiamo lo spazio dei nomi per gestire le classi del riferimento appena aggiunto.
Sopra verrà aggiungiamo lo spazio dei nomi.
Qui la dichiarazione delle suddette operazioni.

VB.Net
Imports Microsoft.Office.Interop
Imports System.IO
C#
using Microsoft.Office.Interop;
using System.IO;


Torniamo in visualizzazione codice e facciamo doppio click sul pulsante in modo di passare in visualizzazione codice.
All’evento del pulsante, scriviamo il codice che permette di scrivere in un file log, ossia di testo, che verrà creato, le informazioni riguardante il mittente, destinatario, oggetto e data di ricezione, il tutto solo per l’email della cartella “Folder”.
Le classi che andremo ad utilizzare sono quelle relative alla gestione dell’applicativo (Application) che tramite il metodo “AddStore” carichiamo il file pst, mentre con la classe “MapiFolder” andiamo a leggere le varie cartelle dell’account.
Con la classe “Items” si vanno a gestire tutti gli elementi contenuti nella cartella, che sono appunto le email, al quale tramite un ciclo con la classe “MailItem” estrapoliamo le informazioni richieste.
Qui di seguito la dichiarazione delle suddette operazioni, per entrambi i linguaggi.

VB.Net
Private Sub BtnLeggiPst_Click(sender As Object, e As EventArgs) Handles BtnLeggiPst.Click
Try
Dim OutApp As Microsoft.Office.Interop.Outlook.Application = New Microsoft.Office.Interop.Outlook.Application()
OutApp.Session.AddStore("D:\Elabora.pst")
Dim CartellaOutlook As Microsoft.Office.Interop.Outlook.MAPIFolder = OutApp.GetNamespace("MAPI").Folders.GetLast()
For Each cartella As Microsoft.Office.Interop.Outlook.MAPIFolder In CartellaOutlook.Folders
Dim nomeCartella As String = cartella.Name
If nomeCartella.ToLower() = "inbox" Then
Dim Elementi As Microsoft.Office.Interop.Outlook.Items = cartella.Items
For Each ElementoEmail As Microsoft.Office.Interop.Outlook.MailItem In Elementi
File.AppendAllText("D:\LogLeggiEmailVB.txt", "Oggetto: " & ElementoEmail.Subject & vbLf & vbCr)
File.AppendAllText("D:\LogLeggiEmailVB.txt", "Inviata DA: " & ElementoEmail.SenderName & " - " + ElementoEmail.SenderEmailAddress & vbLf & vbCr)
File.AppendAllText("D:\LogLeggiEmailVB.txt", "Spedita A: " & ElementoEmail.[To] & vbLf & vbCr)
File.AppendAllText("D:\LogLeggiEmailVB.txt", "Spedita per CCN: " & ElementoEmail.BCC & vbLf & vbCr)
File.AppendAllText("D:\LogLeggiEmailVB.txt", "Ricevuta il : " & ElementoEmail.ReceivedTime.ToString() & vbLf & vbCr)
File.AppendAllText("D:\LogLeggiEmailVB.txt", "*********************************************************" & vbLf & vbCr)
Next
Return
End If
Next
Catch ex As Exception
MessageBox.Show("Errore: " & ex.Message)
End Try
End Sub
C#
private void BtnLeggiPst_Click(object sender, EventArgs e)
{
try
{
Microsoft.Office.Interop.Outlook.Application OutApp = new Microsoft.Office.Interop.Outlook.Application();
OutApp.Session.AddStore("D:\\Elabora.pst");
Microsoft.Office.Interop.Outlook.MAPIFolder CartellaOutlook = OutApp.GetNamespace("MAPI").Folders.GetLast();
foreach (Microsoft.Office.Interop.Outlook.MAPIFolder cartella in CartellaOutlook.Folders)
{
string nomeCartella = cartella.Name;
if (nomeCartella.ToLower() == "inbox")
{
Microsoft.Office.Interop.Outlook.Items Elementi = cartella.Items;
foreach (Microsoft.Office.Interop.Outlook.MailItem ElementoEmail in Elementi)
{
File.AppendAllText("D:\\LogLeggiEmail.txt", "Oggetto: " + ElementoEmail.Subject + "\n\r");
File.AppendAllText("D:\\LogLeggiEmail.txt", "Inviata DA: " + ElementoEmail.SenderName + " - " + ElementoEmail.SenderEmailAddress + "\n\r");
File.AppendAllText("D:\\LogLeggiEmail.txt", "Spedita A: " + ElementoEmail.To + "\n\r");
File.AppendAllText("D:\\LogLeggiEmail.txt", "Spedita per CCN: " + ElementoEmail.BCC + "\n\r");
File.AppendAllText("D:\\LogLeggiEmail.txt", "Ricevuta il : " + ElementoEmail.ReceivedTime.ToString() + "\n\r");
File.AppendAllText("D:\\LogLeggiEmail.txt", "*********************************************************" + "\n\r");
}
return;
}
}
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
}
}

Conclusioni


L’articolo ha voluto fornire informazioni e le basi per lavorare sui file di posta elettronica Microsoft Outlook, quelli con estensione “.pst” al quale possiamo rilevare informazioni utili sull’email che si trovano nella posta in arrivo.
Dati informazioni sui singoli elementi come oggetto, mittenti, destinatari e data di ricezione, ma che possiamo estendere.