Pobieranie i wyświetlanie maili w formacie .html
Feratoin
Witam! Jako, że jest to mój pierwszy artykuł na tej stronie, proszę o wyrozumiałość :).
Codziennie gdy odbierasz pocztę, pobierasz przynajmniej kilka maili w formie .HTML. Dlatego ten artykuł będzie dotyczył stworzenia klienta e-mail, który bez problemowo będzie wyświetlał hypertext a formie jakiej powinien :). Zaczynamy!
Program będzie oparty o popularne komponenty InDY, ja użyłem InDY10, dlatego aby nie było żadnych nie jasności i Ty również zainstaluj 10 :)
Po instalacji otwieramy Delphiego musimy jeszcze doinstalować WebBrowsera, z menu wybieramy Component/Install ActiveX Control, szukamy Microsoft Internet Controls zaznaczamy i klikamy Install
Następnie wrzucamy na Formę następujące komponenty:
- idPOP3 [zakładka Indy Clients]
- idMessage [Indy Misc]
- Memo [Standard]
- WebBrowser [ActiveX]
- StatusBar - dodatkowe urozmaicenie - będzie pokazywał czynności i wyświetli liczbę wiadomości [Win32]
- SpeedButton [Additional]
Wszystko wygląda jakoś tak:
Teraz czas na programowanie. Najpierw na StatusBar1/Panels kliknijmy prawym i Add Item. Pojawi się nam nakładka na panel w, której będziemy mogli wyświetlić przebieg zdarzeń [Text].
Następnie doubleclick na SpeedButton1 przechodzimy do edycji kodu i wpisujemy taką procedurę:
procedure TForm1.SpeedButton13Click(Sender: TObject);
var
Ile:Word;
I:Word;
a,t,date,em:string;
begin
Mailtext.Clear;
IdPOP31.Host:= pop3.wp.pl // przykladowo
IdPOP31.Username:= uzytkownik;
IdPOP31.Password:= haslo;
IdPOP31.Connect;
Ile := IdPOP31.CheckMessages;
Mailtext.Lines.Add('<html>'); // teraz dodajemy style :)
Mailtext.Lines.Add('<head>');
Mailtext.Lines.Add('<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">');
Mailtext.Lines.Add('<style>');
Mailtext.Lines.Add('BODY { FONT-WEIGHT: normal; FONT-SIZE: 70%; COLOR: #000000; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none; BACKGROUND-COLOR: #FFFFFF;margin:0px; }');
Mailtext.Lines.Add('} A:link { COLOR: #003966; FONT-WEIGHT: BOLD; TEXT-DECORATION: none; FONT-SIZE: 90%; } A:active { COLOR: #003966; FONT-WEIGHT: BOLD; TEXT-DECORATION: none; FONT-SIZE: 90%; } ');
Mailtext.Lines.Add('A:visited { COLOR: #003966; FONT-WEIGHT: BOLD; TEXT-DECORATION: none; FONT-SIZE: 90%; } A:hover { TEXT-DECORATION: none; FONT-WEIGHT: BOLD; FONT-SIZE: 90%; COLOR: #C40204; } ');
Mailtext.Lines.add('.textbox { border-left : 1px solid #b6b6b6; border-right : 1px solid #b6b6b6; border-top : 1px solid #b6b6b6; border-bottom : 1px solid #b6b6b6;');
Mailtext.Lines.Add('background-color : #ffffff; font-size : 10px; font-family : Verdana, Arial, Helvetica, sans-serif; color : #000; }');
Mailtext.Lines.Add('</style>');
Mailtext.Lines.Add('</head>');
Mailtext.Lines.Add('<body>');
StatusBar1.Panels[0].Text := ' Liczba wiadomosci w skrzynce: ' + IntToStr(Ile);
StatusBar1.Panels[0].Text := ' Pobieram...'; // dla urozmaicenia StatusBar
// zaczynamy wyswietlac maile
For I:=1 to Ile do
begin
Mailtext.Lines.Add('<br>_____________________________________<br><br>');
IdPOP31.Retrieve(i,IdMessage1);
a := IdMessage1.From.User;
em := idmessage1.from.address;
t := idmessage1.Subject;
date := datetostr(idmessage1.Date);
Mailtext.Lines.Add('Data: '+'<b>'+date+'</b><br>');
Mailtext.Lines.Add('Od: '+'<b><font color="red">'+a+'</font>'+' | '+'['+'<a href="'+em+'"'+'>'+em+'</a>'+']'+'</b><br>');
Mailtext.Lines.Add('Temat: '+'<b>'+t+'</b>');
Mailtext.Lines.Add('<br>_____________________________________<br><br>');
Mailtext.Text:=Mailtext.Text + IDMessage1.Body.Text;
IdMessage1.Clear;
end;
IdPOP31.Disconnect;
StatusBar1.Panels[0].Text := ' Zakończono';
StatusBar1.Panels[0].Text := ' Liczba wiadomości w skrzynce: ' + IntToStr(Ile); // pokaz w StatusBarze liczbe wiadomosci
if Ile = 0 then
Mailtext.Lines.Add('Brak wiadomości w skrzynce!');
Mailtext.Lines.SaveToFile('sciezka do pliku');
WebBrowser1.Navigate('ta sama sciezka do pliku'); // załaduj do WebBrowsera plik .html z mailami
finally
end;
end;
W tej linijce:
Mailtext.Lines.Add('Data: '+'<b>'+date+'</b><br>');
Mailtext.Lines.Add('Od: '+'<b><font color="red">'+a+'</font>'+' | '+'['+'<a href="'+em+'"'+'>'+em+'</a>'+']'+'</b><br>');
Mailtext.Lines.Add('Temat: '+'<b>'+t+'</b>');
Mamy ustawiamy sposób wyświetlania, informacje o nadawcy musimy rozbić na:
a := IdMessage1.From.User;
em := idmessage1.from.address;
t := idmessage1.Subject;
date := datetostr(idmessage1.Date);
Ponieważ dodając opcję idMessage1.From; zostanie nam wyświetlona informacja w takiej formie:
nazwa uzytkownika <nazwa@serwer.pl>
WebBrowser potraktuje to jako znacznik html (nie wiem czemu:)) i w ogole go nie wyswietli, zostanie pominiety.
Polecam do tego konfiguracje INI lub w rejestrze... niezdbedne informacje jak np. sciezka do pliku .html moga nam sie pogubic :)
Co do samego wyswietlanie... style sa tutaj zrobione troche pogmatwanie, mysle za kazdy sobie je jakos ciekawie przerobi :)
Wyswietlanie w moim progu wyglada mniej-wiecej tak:
http://lan.wseia.edu.pl/~bartlomiej19030/CHMOD/pliki/screen.gif
Pozdrawiam :P Myslę, że art się na coś przyda.
kurde wywala mi taki blad
[Error] Unit1.pas(44): Missing operator or semicolon
do tego
IdPOP31.User:= 'mojmail@interia.eu';
pomocy ?
zmien nazwe Memo1 na Mailtext itd.
dlaczego na Mailtext mi wyskakuje Undeclared identifier? muszę coś specjalnego dodać w uses?
dlaczego na Mailtext mi wyskakuje Undeclared identifier? muszę coś specjalnego dodać w uses?
dlaczego na Mailtext mi wyskakuje Undeclared identifier? muszę coś specjalnego dodać w uses?
Nie wiem czemu, ale gdy przyjdzie mi mail na skrzynke (o2) w HTML, to w IdMessage.body.text nie ma nic ('')...
Zamiast
Mailtext.Lines.Add('');
Mailtext.Lines.Add('');
Mailtext.Lines.Add(''); ... itd. itp.
można dać
With Mailtext.Lines Do
Add('');
Add('');
end;
I kodzik nie wystraszy ludzi ;)
A jeżeli chcesz pokazać w WebBrowserze znaki <> wpisz zamiast nich < i &rt;
Takie ikonki masz jak nainstalujesz Indy'iego na wersję Personal.
ok.. jest maly blad w tej linijce:
if idMessage1.body.text = '' then
Mailtext.Lines.Add('Brak wiadomości w skrzynce!');
powinno byc
if Ile = 0 then
Mailtext.Lines.Add('Brak wiadomości w skrzynce!'); ;)
misiekf: dodanie tych znaczników w Ascii nic nie da... ponieważ nie wiem czy testowałeś dając linijkę:
idPOP31.From; dostaniemy:
Nazwa adres@domena.pl , zawsze... wiec trzeba to robić na mniejsze... oczywiście możesz sobie to wpisać w <> ale tak chyba jest ciekawiej :)
Się porozwalało :/ Bo Coyote potraktował niektóre rzeczy nie tak jak powinien.
To o instalacji WebBrowser mogłeś sobie darować, te komponenty nazywają się Indy, a nie InDY, kilka literówek i ortografów.
I moim zdaniem do Gotowców.
ach.... u mnie takie sa :) czepiacie sie :P
od kiedy IdPop i IdMessage takie mają ikonki ? :/
Hmm... raczej nie gotowiec :P, dałem tylko przykładowy kod :P co tu jest do omawiania?
Bardziej 'rozwalonego' artykułu jeszcze nie widziałem :|
Czemu nie widze polskich znakow i czemu tekst " Oceń tekst:" i ponizsze sa zielone oO
-> gotowce - wiecej tu kodu niz tekstu ..:]