Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 177. – emailový klient v Indy

Jan Šindelář 23.3.2005

Často dostávám dopisy od čtenářů, kteří by rádi vytvořili nějakou internetovou aplikaci s využitím komponent balíku Indy, ale nedaří se jim v této rozsáhlé kolekci komponent zorientovat. Proto se budeme tomuto balíku tu a tam věnovat podrobněji a ukážeme si některé základní postupy.

Balík Indy není třeba nijak zvlášť představovat, již několikrát jsme na něj narazili. Dnes je již běžnou součástí instalace Delphi a komponenty je rovněž možno zdarma stáhnout a nainstalovat samostatně. Svým záběrem pokrývá tato kolekce drtivou většinu nejpoužívanějších komunikačních protokolů a na celkem pěti záložkách najdeme vskutku značné množství komponent. I když jsou pojmenovány velmi vhodně, přesto může mít začínající uživatel díky tomuto množství občas problém na první pohled najít správnou komponentu, ale hlavně jejich vzájemné propojení v složitější funkční celek nemusí být snadné.

Začneme příkladem jednoduchým a zkusíme si vytvořit malého emailového klienta. Budeme potřebovat jen tři komponenty. První bude komponenta IdSMTP, která samozřejmě, jak název napovídá, slouží k odeslání pošty. Oproti tomu IdPOP3 slouží k přijetí pošty. Obě najdeme na záložce Indy Clients. Poslední komponentou je IdMessage, která slouží jako objekt pro zprávu jako takovou, tedy pro uložení těla zprávy, všech potřebných parametrů, příloh a podobně a najdeme ji na záložce Indy Misc. Tento objekt je pak vlastně předáván jako parametr zmiňovaným komponentám IdSMTP a IdPOP3, ale to poněkud předbíháme.

Nejprve si připravíme formulář našeho programu. Zde ponechám prostor vaší fantazii, co všechno bude váš program obsahovat, ale samozřejmě by měl každý email mít adresáta, subjekt, pochopitelně tělo zprávy, možnost přidat přílohu v podobě souboru a další. Samozřejmě to nejsou parametry povinné a snad kromě adresáta může být email v podstatě prázdný. Opatřete zkrátka formulář příslušným počtem Editboxů a dalších komponent dle vašich potřeb. Ne každý chce vytvořit emailového klienta, někdo kupříkladu potřebuje pouze do své aplikace integrovat funkci pro odeslání nějakých informací (např. při pádu programu). Pro inspiraci, které parametry může takový email mít, přidejte na formulář zmiňovanou komponentu IdMessage, kterou budeme potřebovat a kde je v Object Inspectoru vidět celá řada možností.

Na formuláři by zřejmě nemělo chybět tlačítko pro odeslání pošty. V jeho obsluze události OnClick pak bude hlavní kód celé naší aplikace. Nejprve je třeba naplnit komponentu IdMessage údaji z editačních komponent na formuláři (záleží na vašem rozvržení a počtu). A poté přichází na řadu IdSMTP. Tuto komponentu tedy přidáme na formulář a buď rovnou v Object Inspectoru a nebo až za běhu programu musíte vyplnit důležité položky jako je zejména adresa SMTP serveru, jehož prostřednictvím poštu hodláme odeslat, a případně i přihlašovací údaje, vyžaduje-li tento server ověření. Teď už máme tedy všechno připraveno, zpráva je naplněna daty, komponenta IdSMTP je rovněž nastavena, takže můžeme přistoupit k samotnému odeslání. Jednoduchým způsobem propojíme zmiňované komponenty a hlavní část kódu tlačítka pro odeslání pak může vypadat nějak takto:

procedure TForm1.Button1Click(Sender: TObject);
begin
{  naplneni komponenty IdMessage1
  napr.:
  IdMessage1.Body.Text := Memo1.Text;
}

{  vlastni odeslani zpravy}
  try
    try
      IdSMTP1.Connect(1000);
      IdSMTP1.Send(IdMessage1);
    except on E:Exception do
      ShowMessage(`Chyba: ` + E.Message);
    end;
  finally
    if IdSMTP1.Connected then IdSMTP1.Disconnect;
  end;

end;

Myslím, že kód je křišťálově jasný a netřeba dalších komentářů. Snad jen číselný parametr funkce Connect může být na první pohled nejasný, ale nejedná se o nic jiného než timeout pro připojení (v milisekundách). No a to je vlastně všechno. Kdepak, nezapomněl jsem na komponentu IdPOP3, ale její použití je úplně ve stejném duchu jako u komponenty IdSMTP. Stačí vyplnit všechny potřebné údaje, tedy zejména POP3 server, jméno a heslo. Zbytek zařídí několik funkcí. Opětovně zde najdeme funkci Connect, dále užitečnou funkci CheckMessages pro zjištění počtu zpráv na serveru a konečně funkci Retrieve, která slouží pro stažení konkrétní zprávy (specifikované pořadovým číslem) opět „do komponenty“ IdMessage. K dispozici je ovšem i řada dalších funkcí, ale tohle experimentování již nechám na vás.

Toto byl tedy velmi jednoduchý příklad zkombinování několika Indy komponent v jeden funkční celek reálné aplikace. Někdy příště si ukážeme něco mírně složitějšího.