Mam pytanie czy istnieje możliwośc z poziomu Delphi (lub innego języka\środowiska :p) wydobyc adresy e-mali z książki adresowaej windows. Jest mi to potrzebne do mojego klienta pocztowego, żeby nie trzeba było przepisywac wszystkich kontaktów z outlook'a.
t4iglo napisał(a)
Mam pytanie czy istnieje możliwośc z poziomu Delphi (lub innego języka\środowiska :p) wydobyc adresy e-mali z książki adresowaej windows. Jest mi to potrzebne do mojego klienta pocztowego, żeby nie trzeba było przepisywac wszystkich kontaktów z outlook'a.
Owszem :) Kiedyś też się nad tym męczyłem.
Gdzieś na stronie jedi jest biblioteka, która to robi, ale nie doszedłem do tego, jak to obsłużyć(pomimo dema!)
Są również komponenty to robiące, ale nie znalazłem żadnego darmowego.
Możnaby też przestudiować Api ze strony Microsoftu, ale to też niewiele mi dało.
Znalazłem jednak inne rozwiązanie. Chodzi o to, żeby importować plik csv. A więc klient musi wyeksportować książkę adresową do pliku csv, a Twój program importuje plik csv, co jest już można powiedzieć, że czystą formalnością.
Odczytuje spis adresów w książce Outlook (pliki WAB i WA~). :)
Ścieżki do plików:
9x - C:\WINDOWS\Dane aplikacji\Microsoft\Address Book
XP - C:\Documents and Settings\UŻYTKOWNIK\Dane aplikacji\Microsoft\Address Book\
Na Formę wrzuć sobie: Button1, Memo1 i Edit1
procedure TForm1.Button1Click(Sender: TObject);
var
Plik: File of Byte;
Buf: Array [1..300000] of Byte;
Readed: Integer;
Poz: Integer;
MailStart,MailEnd: Integer;
MailAdr: String;
FindM: Integer;
i : Integer;
User : String;
Duplicate: Boolean;
begin
Memo1.Clear;
AssignFile(Plik, Edit1.Text);
Try
Reset(Plik);
Except
On EInOutError do ;
end;
BlockRead(Plik, Buf,SizeOf(Buf), Readed);
Poz:=0;
While Poz <= Readed do
Begin
If(Buf[Poz]=Ord('@'))And(Buf[Poz-2]>=48)And(Buf[Poz-2]<=122) then
Begin
MailStart := 0;
MailEnd := 0;
FindM := 0;
Repeat
If(Buf[Poz-FindM]=0) then MailStart := Poz-FindM+2;
FindM := FindM+2;
Until MailStart > 0;
FindM := 0;
Repeat
If(Buf[Poz+FindM]=0) then MailEnd := Poz+FindM-2;
FindM := FindM+2;
Until MailEnd > 0;
MailAdr := '';
For i := MailStart to MailEnd do
If(Buf[i]<>0) then MailAdr := MailAdr + Chr(Buf[i]);
Duplicate := False;
For i := 0 to Memo1.Lines.Count-1 do
If(Memo1.Lines[i] = MailAdr) then Duplicate := True;
If(Duplicate=False) then Memo1.Lines.Add(MailAdr);
end;
Inc(Poz);
end;
end;
Rozumiem że w xp bedzie mozliwe odczytanie tylko kontaktów użytkownika aktualnie zalogowanego (bo do pozostałych folderów user'ów nema dostępu :p)?
t4iglo: Jeśli nie masz praw admina, to jak byś chciał odczytać kontakty kogoś innego niż swoje? :D
Spoko rozumiem, ale z xp słabo obyty jestem :p Dzięki wszystkim za pomoc
Podbijam temat bo mam jeszcze jedno pytanie.
Jak odczytać adres mailowy kórego UŻYWA ta osoba ???? :)
Tak na marginesie chodzi chyba tu tylko o Otlook Express, bo z "duzym" Outlookiem to bedzie grubsza sprawa. Pliki *.PST sa raczej bardziej zamotane, niestety.