|
|
Outlook felhasználói mappa nevek lekérdezése
|
|
Példaprogram letöltése
18711 bájt
|
Az Outlook programozásával már foglalkoztunk néhány korábbi cikkünkben. Mostani példánkban egy TreeView-be beolvassuk az összes olyan mappa tartalmát, amely email-eket tartalmaz, valamint a mappák neve alatt az email-eket is megjelenítjük.
Az Outlook-ban a mappák a fájlrendszer könyvtáraihoz hasonlóan érhetők el. Egy mappa tartalmazhat további mappákat, valamint a mappa típusától függően email-eket, találkozókat, névjegyeket, stb.
A Form1 OnCreate eseményénél csatlakozunk az Outlook-hoz a CreateOleObject függvénnyel. Az FOutlook egy OleVariant típusú változó. Ahhoz, hogy a mappákhoz hozzáférjünk szükségünk lesz egy NameSpace objektumhoz, amit a GetNameSpace függvénnyel kérdezhetünk le. Ennek egy paramétere van, ami mindig "MAPI" kell, hogy legyen. Szükségünk lesz még a "Törölt elemek" mappa nevére is, majd a későbbiekben meglátjuk, hogy miért.
procedure TForm1.FormCreate(Sender: TObject);
begin
FOutlook:=CreateOleObject('Outlook.Application');
FNameSpace:=FOutlook.GetNameSpace('MAPI');
FDeletedItemsFolder:=FNameSpace.GetDefaultFolder(3).Name;
end;
A mappák beolvasása a Button1 OnClick eseményénél történik meg. Ez az email-ek számától függően hosszabb ideig is eltarthat. A Folders változóba lekérdezzük az alap mappák objektumát. Ebből általában csak egy van, és a "Személyes mappák" névre hallgat. A Folders objektum Item property-je MAPIFolder típusú objektumokat tartalmaz, melyek a tényleges mappák. Ezek a mappák tartalmazzák az Outlook elemeket, amilyen például az email is.
procedure TForm1.Button1Click(Sender: TObject);
…
TreeView1.Items.Clear;
Folders:=FNameSpace.Folders; i:=0;
while i<Folders.Count do begin
MAPIFolder:=Folders.Item[i+1];
ScanFolders(nil, MAPIFolder); inc(i);
end;
TreeView1.Items[0].Expand(false);
end;
Fent már említettük, hogy egy mappa további mappákat is tartalmazhat, tehát nyilvánvaló, hogy rekurzív eljárással tudjuk csak az összes mappa tartalmát beolvasni. Ez az eljárás a ScanFolders. Ennek két paramétere van: a TreeNode a TreeView azon eleme, ami alá a mappa kerül, a MAPIFolder pedig egy Outlook mappa objektum.
Nekünk csak azok a mappák kellenek, melyek email-eket tartalmaznak. Ezt a DefaultItemTpye property-ből tudhatjuk meg. Ha ennek értéke 0, akkor a mappában található elemek emailek, vagyis MailItem osztályú objektumok. Egy gond viszont van, mivel a "Törölt elemek" mappa is alapértelmezetten ilyen elemeket tartalmaz, viszont ebben lehetnek más típusú elemek is. Tehát az eljárás elején rögtön ellenőrizzük, hogy a mappa nem a "Törölt elemek" mappa-e, és alapértelmezetten MailItem objektumokat (0) tartalmaz-e.
procedure TForm1.ScanFolders (TreeNode:TTreeNode; MAPIFolder:OleVariant);
…
if (MAPIFolder.DefaultItemType<>0)
or (MAPIFolder.Name=FDeletedItemsFolder) then Exit;
A FolderName és FolderItems változókban eltároljuk a mappa nevét, és a mappa elemeinek számát, ami tulajdonképpen az emailek száma.
FolderName:=MAPIFolder.Name;
FolderItems:=MAPIFolder.Items.Count;
Ha a TReeNode értéke nil, akkor ez a mappa a TreeView gyökérkönyvtárába kerül, ha pedig nem, akkor a TreeNode elem alá.
if TreeNode=nil
then NewNode:=TreeView1.Items.Add(TreeNode, FolderName)
else NewNode:=TreeView1.Items.AddChild(TreeNode, FolderName);
NewNode.ImageIndex:=0; NewNode.SelectedIndex:=0;
…
Egy ciklussal végigmegyünk a mappa almappáin, és meghívjuk rekurzívan a ScanFolders eljárást. Ezzel elérjük, hogy minden mappát átnézünk, és egy adott mappában található további mappák az emailek fölött fognak megjelenni.
i:=0;
while i<MAPIFolder.Folders.Count do begin
ScanFolders(NewNode, MAPIFolder.Folders.Item[i+1]);
inc(i);
end;
Ha az összes almappát beolvastuk, akkor jöhetnek az emailek. Ezeket egy egyszerű ciklussal lekérdezhetjük. A MAPIFolder osztály Items property-je MailItem objektumokat tartalmaz, de csak abban az esetben, ha a DefaultItemType property értéke 0. Ezt viszont már az eljárás elején ellenőriztük, tehát itt már nem kell megtennünk. A MailItem objektum SenderName property-je a feladó nevét, a Subject a levél tárgyát és a ReceivedTime a dátumot tartalmazza. Ezt a három tulajdonságot jelenítjük meg a TreeView-ben.
t:=1;
while t<=MAPIFolder.Items.Count do begin
mi:=MAPIFolder.Items(t);
MailSender:=mi.SenderName; MailSubject:=mi.Subject;
MailReceived:=mi.ReceivedTime;
NewMailNode:=TreeView1.Items.AddChild(NewNode, MailSender+': '+MailSubject+' ('+MailReceived
+')');
NewMailNode.ImageIndex:=1; NewMailNode.SelectedIndex:=1;
inc(t);
end;
Label1.Caption:='';
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 462. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|