Jak pobrać dane z kontaktów w MS Outlook

DevNull

Na samym początku tego "Gotowca" chciałbym zwrócić uwagę, że poniższy tekst jest kierowany do początkujących.

Niejednokronie pisząc jakąś aplikację typu książka adresowa czy bardzo podobny program chcieliśmy importować kontakty, a konkretnie dane osobowe tych kontaktów z Microsoft Outlook do naszej aplikacji. Każdy kontakt w Microsoft Outlook posiada pola typu: Imię i Nazwisko, Miasto, Kraj, Kod pocztowy, Telefon (domowy/praca) oraz wiele, wiele innych potrzebnych i niepotrzebnych(moim zdaniem) pól.
Postaram się pokazać jak "wyciągnąć" najpotrzebniejsze dane: Imię i Nazwisko, mail oraz numer telefonu kontaktów z MS Outlook. Każdy wedle woli może "wyciągnąć" dane jakie są mu potrzebne w jego programie, np. książce adresowej itp.
Zaczynamy..

Otwieramy Delphi. Na formę kładziemy:
3x Label
3x ListBox
1x Button

Teraz opiszę ich właściwości, byś ustawił je tak jak ja w swoim programie.

Właściwości każdego ListBoxa ustaw tak jak poniżej:
Width = 120
Height = 160

Rozmieść je na formie tak, by do siebie przylegały. Można oczywiście zastąpić 3 ListBoxy jednym ListView z kolumnami itp., ale ja w moim programie użyłem ListBoxów i na ich przykładzie cały ten art. opiszę.

Następnie umieść nad każdym z ListBoxów Label:
Caption pierwszego ustaw na: Imię i nazwisko
Caption drugiego ustaw na: e-mail
Caption trzeciego ustaw na: Telefon kontaktowy

Ustawienia komponnetów na formie mamy za sobą. Ktoś może powiedzieć, że nie potrzebnie to piszę, ale chcę w całości oddać wygląd mojego programu. Poza tym wszystko będzie estetycznie wyglądało.
Nasz program:

<IMG SRC="http://miasto.interia.pl/w/greetzky62/1.jpg"> 

I tak o to możemy przejść do najważniejszej części tego artykułu czyli samej idei "wyciągania" danych z kontaktów MS Outlook.

Na samym początku do sekcji USES dodajemy: ComObj.
Musimy zdefiniować jedną stałą, którą będzię folder kontaktów wewnątrz MS Outlook. W tym celu po sekcji USES piszemy:

const
folder_kontaktow = $0000000A;

W sekcji var dodajemy:

Outlook, NameSpace, Kontakty, Kontakt : OleVariant;   
i : Integer;

Ok. Zmienne mamy zadeklarowane. Teraz klikamy dwa razy na Buttona. Delphi wygenorowł automatycznie zdarzenie <b>onClick</b>. Musimy teraz utworzyć połączenie (link) między naszą aplikacją a MS Outlookiem. W tym cely piszemy:

Outlook := CreateOleObject('Outlook.Application'); //Utworzenie linku(polaczenia) miedzy nasza app, a MS Outlook
NameSpace := Outlook.GetNameSpace('MAPI'); 

Nastepnie definiujemy kontakty:

Kontakty := NameSpace.GetDefaultFolder(folder_kontaktow); 

Teraz tylko pozostało nam wykonać pętlę, która będzie się wykonywać tyle razy ile znajduje się kontaktów w MS Outlook i umieści je w ListBox`ach.

for i := 1 to Kontakty.Items.Count  do
begin
Kontakt := Kontakty.Items.Item(i);
ListBox1.Items.Add(Kontakt.FullName); //Imie i Nazwisko
ListBox2.Items.Add(Kontakt.Email1Address); //Adres e-mail
ListBox3.Items.Add(Kontakt.BusinessTelephoneNumber); //Numer telefonu
end;
Outlook := UnAssigned; //Zwolnienie zmiennej Outlook

No i to wszystko. Skompiluj teraz program i sprawdź czy działa poprawnie. Jeżeli nie to przeanalizuj swój kod i sprawdź czy nie popełniłeś gdzieś błedu/ów.

Chciałem jeszcze powiedzieć, że sam proces "wyciągania" tak to nazwijmy może trwać małą chwilkę.
Dlaczego? Ponieważ, by utworzyć połączenie między jedną a drugą aplikacją obie muszą być uruchomione. Najprościej rzecz ujmując Delphi uruchamia MS Outlook tworzy z nim link i w tym momencie następuje wymiana danych miedzy aplikacjami.

Każdy kontakt w Microsoft Outlook posiada również inne pola niż te, które zastosowałem w swoim przykładzie. Do takich pól należą m.in. data urodzin, nazwa firmy, miasto, kraj i wiele, wiele innych. Poniżej umieszczam listę nazw tych pól.

Birthday Business2TelephoneNumber BusinessAddress BusinessAddressCity BusinessAddressCountry BusinessAddressPostalCode BusinessAddressPostOfficeBox BusinessAddressState BusinessAddressStreet BusinessFaxNumber BusinessHomePage BusinessTelephoneNumber CompanyAndFullName CompanyMainTelephoneNumber CompanyName ComputerNetworkName Department Email1Address Email1AddressType Email1DisplayName Email2Address Email2AddressType Email2DisplayName Email3Address Email3AddressType Email3DisplayName FirstName FTPSite FullName FullNameAndCompany GovernmentIDNumber Hobby Home2TelephoneNumber HomeAddress HomeAddressCity HomeAddressCountry HomeAddressPostalCode HomeAddressPostOfficeBox HomeAddressState HomeAddressStree HomeFaxNumber HomeTelephoneNumber Initials ISDNNumber JobTitle Language LastName LastNameAndFirstName MailingAddress MailingAddressCity MailingAddressCountry MailingAddressPostalCode MailingAddressPostOfficeBox MailingAddressState MailingAddressStreet MiddleName NickName OfficeLocation OrganizationalIDNumber PersonalHomePage PrimaryTelephoneNumber Profession Suffix Title WebPage

12 komentarzy

I TAK NIE DZIAŁA :P

Wlasnie przetestowalem to z outlookiem 97 uzywajacym serwera Exchange - dziala bez zarzutu!

Przepisałem kropka w kropkę i po uruchomieniu programu wypisuje mi taki oto komunikat błędu "Nieprawidłowy ciąg klasy". Dodam, że mam Windows-a XP i Delphi7, jeżeli to w czymś pomoże.

Pomimo iż ten gotowiec opublikowałem dość dawno, wkradł się jeden błąd. Ostateczna wersja tego gotowca jest bez błędów i działa poprawnie.
Chciałem tylko dodać, ze MS Outlook musi być skonfigurowany.

Nie ma sprawy, a czy to dziala tylko na MS outlook czy na outlook expres też bo nie wiem czy znowu ja coś robie czy to nie zadziala przy outlook expres, poza tym nie wiem czy to mozliwe ale jezeli dobrze zrozumialem to do pobrania tych kontaktow trzeba odpalic tego outlooka, wiec mozna go programmem odpalac ale z parametrem hide ??

azgon: Dziękuję za informację. Masz rację, że nie działa ze względu na to iż do sekcji USES należy dodać: ComObj. Ja natomiast pominąłem to w swoim gotowcu. Jeszcze raz dzięki, że zauważyłeś ten błąd.

No całkiem fajna sprawa ale u mnie jakoś nie za bardzo działa ... Napisałem tak jak mówileś i przy kompilacji zaznacza "CreateOleObject" i pisze ze jest niezdeklarowane ...
Może byś wżucił dosłownego gotowca ???

Materiał, który tutaj przedstawiłem służy wyłącznie celom edukacyjnym. Proszę tego nie traktować jako "lekcyjkę" dla osób piszących wirusiki albo aplikacje SPY.

Fajne - nic tylko zrobic vira ktory pobiera kontakty z ms outlocka i przeslac sie na inne e-maile ;-) - uwaznie lepiej tego uzywajcie i z rozsadkiem ;-) he he he he

hehehehe a nie lepiej listview ?????

Drajwer: oczywiście, że można skorzystać z ListView, ale jak zwróciłeś uwagę to napisałem, że mój przykład przedstawię stosując ListBox`y
Dzięki za ocenę...