domenica 18 novembre 2007

Automazione Office Outlook - Utilizzo del Late Binding - Esempio di invio Mail

Ne avevo bisogno per lavoro, ho provato a cercare in giro ma non sono riuscito a trovare esempi di utilizzo del Late Binding per l'invio di posta utilizzando l'automazione di Office Outlook.
Pazienza :)) me lo sono fatto da me.

L'automazione di Office su C# e VB.NET è possibile sostanzialmente con le tecniche:

  1. Early Binding
  2. Late Binding

L'Early Binding prevede la definizione e l'utilizzo degli oggetti di Office all'interno del programma, l'uso dei membri di Office è fatto direttamente all'interno degli statements, l'associazione degli oggetti è fatta durante la fase di compilazione.

Microsoft.Office.Interop.Outlook.Application oApp; // definizione oggetto di tipo Outlook.Application
oApp = new Microsoft.Office.Interop.Outlook.Application(); // creazione nuovo oggetto
// Definizione di oggetto di tipo MailItem
Microsoft.Office.Interop.Outlook.MailItem mItem = (Microsoft.Office.Interop.Outlook.MailItem) oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

// Assegnazione valori
mItem.To = myemail@myserver.com;
...
mitem.Send(); //invio email

L'early Binding è relativamente semplice da utilizzare una volta imparato il "trucco" è più veloce del Late Binding ma ha il grosso svantaggio che l'associazione tra la nostra interfaccia e Office prevede che chi utilizza il programma sia in possesso della stessa versione di Office di chi ha scritto il programma.
Per ovviare a questo fondamentale inconveniente di solito "il programmatore" fa uso della versione più bassa di Office in circolazione, infatti con questa tattica è di solito le versioni successive di Office "funzionano" con l'Early Binding.

Il Late Binding invece è più complesso perchè prevede la definizione e l'utilizzo di Office solo come server, nel programma si "lanciano" dei comandi al server (Outlook) e con questi comandi si possono impostare/leggere delle proprietà o eseguire dei metodi.
L'ho detto che si utilizzano solo o quasi la classe object e la Reflection per dare i comandi?, ora si può ben capire che diventa tutto molto, molto più complicato.
In compenso però si è svincolati dal legame alla versione di Office, infatti l'associazione è realizzata durante l'esecuzione del programma.
L'apertura del collegamento con il server è fatta generando un'istanza di Otlook:

objClassType = Type.GetTypeFromProgID("Outlook.Application");
objApplication = Activator.CreateInstance(objClassType);

Si prosegue definendo un oggetto di tipo MailItem, allo sesso modo dell'Early ma .. con una sintassi alquanto più complicata.

// Definizione di oggetto di tipo MailItem
objMailItem = (( Microsoft.Office.Interop.Outlook.MailItem) InvokeMethod(objApplication, "CreateItem", Microsoft.Office.Interop.Outlook.OlItemType.olMailItem));
Per ovviare in modo parziale alla complicazione ho provveduto con un Metodo ad hoc.

// Definizione interfaccia per Esecuzione metodo
private object InvokeMethod(object obj, string sProperty, object[] oParam)
{
     return obj.GetType().InvokeMember(sProperty, BindingFlags.InvokeMethod, null, obj, oParam
);
}

L'assegnazione delle proprietà avviene sempre in modo indiretto tramite InvokeMember mediante l'utilizzo di del metodo "SetProperty"
// Assegnazione valori
SetProperty(objMailItem, "To", m.To);
..

Allo stesso modo dei metodi ho provveduto alla definizione del metodo SetProperty

private void SetProperty(object obj, string sProperty, object oValue)
{
    object[] oParam = new object[1];
    oParam[0] = oValue;
    obj.GetType().InvokeMember(sProperty, BindingFlags.SetProperty, null, obj, oParam);
}

Alla fine si può inviare la mail
// Invio mail
object ob = InvokeMethod(objMailItem, "Send" , null );

Riferimenti
Progetto di esempio realizzato con C#
Progetto di esempio realizzato con VB.NET
Reflection
Definizione Binding

Nessun commento: