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


webb.gif


Następnie wrzucamy na Formę następujące komponenty:

  • idPOP3 [zakładka Indy Clients]idpop3.gif
  • idMessage [Indy Misc]idmessage.gif
  • 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:


form1.gif

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:&nbsp;&nbsp;&nbsp;'+'<b>'+date+'</b><br>');
      Mailtext.Lines.Add('Od:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+'<b><font color="red">'+a+'</font>'+' | '+'['+'<a href="'+em+'"'+'>'+em+'</a>'+']'+'</b><br>');
      Mailtext.Lines.Add('Temat:&nbsp;'+'<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:&nbsp;&nbsp;&nbsp;'+'<b>'+date+'</b><br>');
      Mailtext.Lines.Add('Od:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+'<b><font color="red">'+a+'</font>'+' | '+'['+'<a href="'+em+'"'+'>'+em+'</a>'+']'+'</b><br>');
      Mailtext.Lines.Add('Temat:&nbsp;'+'<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.

16 komentarzy

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 ..:]