Programowanie w języku Delphi » Artykuły

Pobieranie i wyświetlanie maili w formacie .html

  • 2006-07-07 14:22
  • 16 komentarzy
  • 1233 odsłony
  • Oceń ten tekst jako pierwszy
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

Duchu1337 2007-06-21 19:24

kurde wywala mi taki blad

[Error] Unit1.pas(44): Missing operator or semicolon

do tego

IdPOP31.User:= [email protected]';

pomocy ?

Feratoin 2006-07-15 23:05

zmien nazwe Memo1 na Mailtext itd.

Brujah 2006-04-26 18:12

dlaczego na Mailtext mi wyskakuje Undeclared identifier? muszę coś specjalnego dodać w uses?

Brujah 2006-04-26 18:11

dlaczego na Mailtext mi wyskakuje Undeclared identifier? muszę coś specjalnego dodać w uses?

Brujah 2006-04-26 18:11

dlaczego na Mailtext mi wyskakuje Undeclared identifier? muszę coś specjalnego dodać w uses?

wojtek_dodo 2005-11-10 17:50

Nie wiem czemu, ale gdy przyjdzie mi mail na skrzynke (o2) w HTML, to w IdMessage.body.text nie ma nic (\'\')...

misiekf 2005-11-04 17:29

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 &lt; i &rt;

Patyk 2005-11-03 14:56

Takie ikonki masz jak nainstalujesz Indy\'iego na wersję Personal.

Feratoin 2005-11-17 17:35

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 <[email protected]> , zawsze... wiec trzeba to robić na mniejsze... oczywiście możesz sobie to wpisać w <> ale tak chyba jest ciekawiej :)

Ktos 2005-11-02 10:33

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.

Feratoin 2005-11-02 21:54

ach.... u mnie takie sa :) czepiacie sie :P

Adamo 2005-11-02 19:56

od kiedy IdPop i IdMessage takie mają ikonki ? :/

Feratoin 2005-11-02 19:38

Hmm... raczej nie gotowiec :P, dałem tylko przykładowy kod :P co tu jest  do omawiania?

Patyk 2005-11-01 22:34

Bardziej \'rozwalonego\' artykułu jeszcze nie widziałem :|

necrokris 2005-11-01 22:20

Czemu nie widze polskich znakow i czemu tekst \" Oceń tekst:\" i ponizsze sa zielone oO

migajek 2005-11-02 15:00

-> gotowce - wiecej tu kodu niz tekstu ..:]