C# - Microsoft Outlook alkalmazás címlistájának lekérdezése parancsállománnyal

forráskód letöltése
Az minden bizonnyal ismert, hogy a Microsoft Outlook alkalmazás elérhető programjainkból, és a megfelelő metódusokkal lekérdezhetők az egyes tárolókban megtalálható levelek, vagy a Címjegyzék elemei. Az operációs rendszerben találhatunk egy COM komponenst, melynek segítségével egy parancsállományból is elvégezhetjük ezeket a műveleteket. Cikkünkben bemutatjuk, hogyan tehetjük ezt meg.
Címlista elemeinek lekérdezése
A mellékelt projekt mappájában elhelyeztünk egy parancsállományt GetList.js néven, melyben a lekérdezés műveletét - az Outlook Címjegyzékében megtalálható nevek és a kapcsolódó e-mail címek XML állományba történő mentése - megvalósítottuk.
A megvalósításhoz az MSXML COM komponens 2.0 verzióját használjuk fel, mely a parancsállományból is elérhető. Vizsgáljuk meg, hogy milyen lépéseket kell tennünk a listázás érdekében. A művelet úgy indul, hogy az alkalmazás MENTÉS feliratú gombjának segítségével meghívjuk a Process osztály Start metódusát, mely lefuttatja a parancsállományt.
A parancsállományban először létre kell hoznunk egy objektum-példányt a Microsoft Outlook alkalmazásból, majd le kell kérdeznünk a MAPI nevű névterét, melyben a Címlista elemei elérhetőek.
var oa = new ActiveXObject("Outlook.Application"); 
var mapi = oa.getNameSpace("MAPI");
A névtér egy kollekciójának tartalmát egy objektumba mentjük, melynek elemein egy ciklussal végigmegyünk.
var lists = mapi.AddressLists;
A következő lépésben meghívjuk a parancsállományban implementált belső metódusunkat, mely létrehoz egy, az XML tárolására alkalmas objektumot. A metódus a paraméterként megadott néven hozza létre az állomány gyökércsomópontját.
var xml = CreateDocument("AddressLists");
var root = xml.documentElement;
Ezt a gyökérobjektumot kérdezhetjük le a documentElement property kiolvasásával. Erre azért van szükség, hogy a neveket és e-mail címeket tartalmazó csomópont-objektumokat legyen mire felfűzni.
A ciklusban lekérdezzük a címlistákat, majd a címlisták minden bejegyzését, melyeket egy-egy AddressEntry objektum reprezentál.
for(var i=1;i<=lists.Count;i++)
{
  var aList = lists.Item(i);
  var entries= aList.AddressEntries;
A bejegyzések mindegyike több információt tartalmaz, melyek közül minket most a név- és elektronikus levélcím–információ érdekel.
  for(var j=1;j<=entries.Count;j++)
  {
Minden bejegyzéshez létrehozunk egy AddressEntry csomópontot az XML-ben az AppendChild metódussal.
    var entry = AppendChild(xml,root,"AddressEntry",null);
    var aEntry = entries.item(j);
A kapott információkat pedig felfűzzük erre a csomópontra.
    AppendChild(xml,entry,"Name", aEntry.Name);
    AppendChild(xml,entry,"Address",aEntry.Address);
  }
}
A művelet végén elmentjük az XML állományt AddressBook.xml néven, az objektum Save metódusával.
var xmlName = "./AddressBook.xml";
xml.save(xmlName);
Most vizsgáljuk meg a két segédmetódust.
CreateDocument metódus
Az XML-t reprezentáló objektumot létrehozó CreateDocument metódusban példányosítjuk a MSXML2.DOMDocument objektumot.
function CreateDocument(rootName)
{
  var xml = null;
  try
  {
    xml = new ActiveXObject("Msxml2.DOMDocument");
  }
...
Majd a megfelelő property beállítása után létrehozunk egy XML csomópont-objektumot a paraméterként megadott névvel.
var root = xml.createElement(rootName);
A létrejött elemet az XML dokumentumhoz adjuk, felfűzzük a legelső elemként.
xml.appendChild(root);
AppendChild metódus
A metódus négy paraméterrel rendelkezik. Az első paraméterben átadjuk az XML objektumot, míg a másodikban a gyökérelemet reprezentáló objektumot. A harmadik paraméter tartalmazza a létrehozandó alcsomópont nevét, és a negyedik paraméterben adhatunk értéket a csomópontnak.
A metódusban első lépésként létrehozunk egy csomópontot.
function AppendChild(xml, parent, name, value)
{
  var item  = xml.createElement(name);
Ha a negyedik paraméter nem NULL, akkor a csomópont TEXT property-jében megadjuk az értéket is.
  if(value != null)
  {
    item.text = value;
  }
A csomópontot a kapott szülőelemre fűzzük fel.
  parent.appendChild(item);
  return item;
}
A generált XML állomány tartalmát a BETÖLTÉS gombbal jeleníthetjük meg a DataGrid kontrolban úgy, hogy egy DataSet objektum segítségével beolvassuk az a memóriába, majd adatforrásként átadjuk az adathalmazt a kontrolnak.