Wednesday, July 4, 2007

Importare contatti da Outlook 2003

. Wednesday, July 4, 2007

L'esempio fa uso di un assembly PIA( Primary Interop Assemblies ) Microsoft.Office.Interop.Outlook. Si tratta di un wrappper che ci permette di scrivere applicazioni in .NET e di comunicare con codice unmanaged dei componenti COM di Microsoft Office.
Supponiamo di voler mostrare in una datagrid i seguenti contatti:

Nel caso sulla vostra macchina è installato Office 2003 basterà referenziare l'assembly dalla tab COM:

A questo punto possiamo aggiungere le using:


using System.Reflection;
using Outlook = Microsoft.Office.Interop.Outlook;

Il metodo di estrazione e bind dei contatti:

//Istanziando la classe viene creato il processo di Outlook
Outlook.Application outlook = new Outlook.Application();
Outlook.NameSpace oNS
= outlook.GetNamespace( "mapi");
DataRow row;
DataTable dt
= new DataTable();
dt.Columns.Add(
new DataColumn( "Nome", typeof( string)));
dt.Columns.Add(
new DataColumn( "Posizione", typeof( string)));
dt.Columns.Add(
new DataColumn( "Società", typeof( string)));
dt.Columns.Add(
new DataColumn( "Reparto", typeof( string)));
dt.Columns.Add(
new DataColumn( "Abitazione", typeof( string)));
try
{
oNS.Logon( Missing.Value, Missing.Value,
true, true);
Outlook.MAPIFolder oContacts
= oNS.GetDefaultFolder( Outlook.OlDefaultFolders.olFolderContacts);
Outlook.Items oItems
= oContacts.Items;
Outlook.ContactItem oCi
= null;

oCi
= (Outlook.ContactItem)oItems.GetFirst();
while ( oCi != null)
{
row
= dt.NewRow();
row[
"Nome"] = oCi.FirstName;
row[
"Posizione"] = oCi.JobTitle;
row[
"Società"] = oCi.CompanyName;
row[
"Reparto"] = oCi.Department;
row[
"Abitazione"] = oCi.MailingAddressStreet;
dt.Rows.Add( row);

oCi
= ( Outlook.ContactItem)oItems.GetNext();
}

// Log off
oNS.Logoff();
oNS
= null;
// Release objects
oCi = null;
oItems
= null;
oContacts
= null;
//Bind datagrid
dgContacts.DataSource = dt;
}
catch( Exception exc)
{
//TODO: log error
string error = exc.Message;
}
finally
{
if( outlook != null)
{
outlook.Quit();
outlook
= null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
}
Tra le cose importanti da sottolinare:
1)se si sostituisce il while con il codice:

foreach( Outlook.ContactItem oCi in oContacts.Items)
{
row
= dt.NewRow();
row[
"Nome"] = oCi.FirstName;
row[
"Posizione"] = oCi.JobTitle;
row[
"Società"] = oCi.CompanyName;
row[
"Reparto"] = oCi.Department;
row[
"Abitazione"] = oCi.MailingAddressStreet;
dt.Rows.Add( row);
}

accade una cosa strana le risorse non vengono rilasciate, di conseguenza il processo di Outlook non viene chiuso,
2)non tutte le property possono essere lette. Questo per ragioni di sicurezza, infatti se per esempio cercate di leggere la property Email1Address compare un avviso:
"Un programma sta tentando di accedere agli indirizzi di posta elettronica memorizzati in Outlook. Consentire l'operazione? Se l'operazione non è prevista potrebbe trattarsi di un virus, pertanto scegliere No"(A program is trying to access email addresses you have stored in outlook. Do you want to allow this?)
Quest'ultimo è uno dei meccanismi di Outlook per evitare che codice non autorizzato possa essere eseguito. E' presente in tutte le versioni a partire da Outlook 2000 con SP3 ed ovviamente non si può disattivare.
Esistono delle library di terze parti per ovviare come per esempio Outlook Redemption, oppure se la posta è gestita da Exchange si può vedere Outlook E-MAil Security Update.

0 commenti:

Post a Comment