Delphi - Outlook programozása Delphi-ből

Office 12. rész

forráskód letöltése
Az Office cikksorozatban eddig a Word és az Excel alkalmazások programozásával foglalkoztunk. Most rátérünk a Microsoft Outlook programozásának ismertetésére, amiből megtudhatjuk majd, hogy hogyan kérdezhetjük le és hogyan küldhetünk e-mail-eket, hogyan érhetjük el és módosíthatjuk a címlistát, valamint hogyan kezelhetjük a határidőnaplót. Azt nem árt tisztázni már az elején, hogy ehhez is szükségünk lesz egy Type Library-ra. Aki figyelmesen végigolvasta az Office programozásáról szóló cikksorozatot annak a Type Libary generálása már nem okozhat gondot. Ha ez megtörtént, akkor neki is kezdhetünk az Outlook programozásának.

Mivel a kapcsolat létesítése itt is ugyanúgy történik, mint a Word és az Excel esetében, ezért kezdhetjük mindjárt egy "komolyabb" program készítésével. A feladat az lesz, hogy lekérdezzük a "Beérkezett üzenetek" mappában lévő leveleink listáját, és a kiválasztott üzenet szövegét megjelenítjük egy TRichEdit komponensben.

A csatlakozás az Outlook-hoz a már feltehetőleg jól ismert módon történik:
var
  Foutlook: OleVariant;
…
procedure TForm1.Connect;
begin
  FOutlook:=CreateOleObject('Outlook.Application');
end;
Innentől aztán bonyolódik a helyzet! Elsődleges feladatunk az, hogy a "Beérkezett üzenetek" mappában lévő leveleinket beolvassuk, és megjelenítsük azokat egy ListView komponensben. Ezt mindjárt a program indításakor elvégezhetjük, ezért a Form1 OnCreate eseményét használjuk fel erre a célra:

Meghívjuk a Connect metódust, ami elvégzi a csatlakozást (lásd fent).

Szükségünk lesz egy NameSpace objektumra, amit a GetNameSpace függvénnyel kérdezhetünk le. Ennek a függvénynek egy sztring paramétere van, ami minden esetben "MAPI" kell, hogy legyen!
  FNamespace:=FOutlook.GetNameSpace('MAPI');
A NameSpace objektum GetDefaultFolder függvénye segítségével megkaphatjuk a beérkezett leveleinket tartalmazó mappa objektumát. A függvény paramétere azt a mappát azonosítja, amit el szeretnénk érni. A mappa azonosítóját egy OlDefaultFolders típusú konstanssal lehet megadni, melynek értékei a következők lehetnek: olFolderCalendar (9), olFolderContacts (10), olFolderDeletedItems (3), olFolderDrafts (16), olFolderInbox (6), olFolderJournal (11), olFolderNotes (12), olFolderOutbox (4), olFolderSentMail (5), vagy olFolderTasks (13).
  FFolder:=FNamespace.GetDefaultFolder(olFolderInbox);
Az FFolder objektum Items property-je egy TStringList osztályhoz hasonlóan tartalmazza a mappa tartalmát. Az Items.Count property megadja, hogy a lista hány elemet tartalmaz. Az Items(index) függvénnyel megkaphatjuk az index sorszámú elemet. Nincs más dolgunk, mint végighaladni a listán, és az FMailItem változóba lekérdezni az i. sorszámú levelünk objektumát. Ezután ebből kiolvasható minden szükséges adat, amit meg is jelenítünk egy ListView komponensben:
  for i:=1 to FFolder.Items.Count do begin
    FMailItem:=FFolder.Items(i);
    li:=ListView1.Items.Add;
    li.Caption:=FMailItem.SenderName;
    li.SubItems.Add(FMailItem.Subject);
    li.SubItems.Add(FMailItem.ReceivedTime);
  end;
end;
A következő feladat az, hogy a ListView-ben kiválasztott üzenet szövegét megjelenítsük egy RichEdit komponensben. Ezt a funkciót a ListView OnSelectItem eseményénél valósítjuk meg.
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
var
  FNamespace, FFolder, FMailItem: OleVariant;
begin
Először is ellenőrizzük, hogy van-e kiválasztott elem a ListView-ben. Ezt egyszerűen az Assigned függvény segítségével tehetjük meg.
  if Assigned(ListView1.Selected) then begin
Itt egy ismerős rész következik, a NameSpace és a FFolder objektum lekérdezése:
    FNamespace:=FOutlook.GetNamespace('MAPI');
    FFolder:=FNamespace.GetDefaultFolder(olFolderInbox);
A következő rész szintén az előző eljárásból lehet ismerős, de itt egy kicsit más formában alkalmazzuk. A kiválasztott ListItem Index property-jét fogjuk felhasználni az üzenet azonosítására, vagyis ezt adjuk meg az Items függvénynél index-nek úgy, hogy még 1-et hozzáadunk. Azért kell 1-et hozzáadni, mert míg a ListView-nél 0-tól, addig a MailItem objektumban 1-től vannak sorszámozva az elemek. Az így megkapott MailItem objektum body property-jéből kiolvasható az üzenet szövege.
Ha nincs kiválasztott eleme a ListView-nek, akkor töröljük a RichEdit tartalmát.
    FMailItem:=FFolder.Items(ListView1.Selected.Index+1);
    RichEdit1.Text:=FMailItem.Body;
  end else RichEdit1.Clear;
end;

Office cikksorozat