Elektronická pošta v TCP/IP časť deviata


Praktický príklad v Delphi I

Doteraz ste sa mohli zoznámiť podrobnejšie s teóriou okolo elektronickej pošty, teraz nasleduje praktický príklad v jazyku Delphi. Rozoberieme ho podrobnejšie. Na skompilovanie projektu budete potrebovať komponent SakEmail.1.10.0.zip. Tento komponent obsahuje rozhranie pre prácu s elektronickou poštou.


Zaslanie správy systémom elektronickej pošty – telo správy

Telo správy môže obsahovať len základné ASCII znaky 'A-Z', 'a-z', '0-9' a '/'. Keďže budeme posielať aj binárne súbory, tieto je potrebné transformovať do vhodného formátu. Na tento účel aplikácia využíva algoritmus base64, ktorý je definovaný v dokumente RFC 2045.

Získanie doručených správ z e-mailovej schránky

Doručené správy sú umiestňované na disku počítača (server), na ktorom má užívateľ zriadenú svoju poštovú schránku (MAILBOX). Na získanie doručených správ z e-mailovej schránky a na ich prenesenie na lokálny osobný počítač použijeme komunikačný protokol POP3. Príkazy protokolu POP3 sa sprístupnia vložením ovládacieho prvku SakPOP, ktorý je súčasťou komponentu SakEmail, do programu. Ďalším ovládacím prvkom, ktorý bude vložený do programu je SakMsgList. Tento bude obsahovať všetky správy získané z e-mailovej schránky užívateľa, pomocou príkazov protokolu POP3. Ak správa obsahuje nejaké binárne súbory, ktoré boli predtým zakódované algoritmom base64; na tieto bude aplikovaný proces spätného dekódovania, čím získame pôvodné binárne súbory. Po prenesení správ zo serveru na osobný počítač budú všetky prenesené správy na serveri buď ponechané, alebo vymazané. Toto závisí od hodnoty subkľúča Delete Messages, ktorý je definovaný v registri Windows pod kľúčom:

HKEY_CURRENT_USER\SOFTWARE\SimpleMail\Mailbox.

Zobrazenie doručených správ

Všetky správy, ktoré budú získané z e-mailovej schránky užívateľa, budú zobrazené v ovládacom prvku TListView. Po kliknutí na príslušnú položku v ListView, sa zobrazí text konkrétnej správy a pripojené súbory. Správy ktoré získate z Vášho poštového servera budú uložené iba v pamäti počítača, t.j. aplikácia vo verzii 1.0 ich nezapisuje na lokálny disk. Po ukončení programu budú emailové správy nenávratne vymazané.

Inicializácia programu

Z praktického hľadiska je potrebné, aby si program pamätal niektoré dôležité údaje, napríklad: adresu SMTP servera, adresu POP3 servera, meno užívateľa, e-mailovú adresu užívateľa programu a pod. Windows umožňuje použiť dve štandardné techniky ukladania stavových informácií:

1. INI súbory (v Delphi trieda TIniFile),
2. systémové registre(v Delphi trieda TRegIniFile).

Pretože aj samotná firma Microsoft doporučuje namiesto INI súborov používať systémové registre aj náš program ich bude používať. Niekoľko základných informácií o registroch: Systémový register je v skratke hierarchicky usporiadaná databáza informácií o počítači a nainštalovanom programovom vybavení. Register Windows je založený na šiestich kľúčoch na najvyššej úrovni (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG, HKEY_DYN_DATA). Každá aplikácia si môže pri inštalácii vytvoriť svoje vlastné kľúče do ktorých bude zapisovať alebo z nich čítať buď reťazce, celé čísla alebo logické hodnoty. Pre prezeranie, editovanie a vytváranie kľúčov existuje vo Windows špeciálny program s názvom Regedit. Tento program nenájdete v menu, ale spustíte ho tak, že kliknite na tlačidlo Start | Run a napíšte príkaz regedit.

Aplikácia Simple Mail 1.0 bude obsahovať nasledovnú štruktúru kľúča SimpleMail:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\SimpleMail]

[HKEY_CURRENT_USER\Software\SimpleMail\AddressBook]
"City"="65"
"EmailAddress"="169"
"Name"="212"
"Organization"="104"
"Phone"="97"

[HKEY_CURRENT_USER\Software\SimpleMail\AttachedFiles]
"1"=""
"2"=""
"3"=""
"count"="0"
"4"=""
"5"=""

[HKEY_CURRENT_USER\Software\SimpleMail\Mailbox]
"Login"=""
"SavePassword"="0"
"Password"=""
"Delete Messages"="0"

[HKEY_CURRENT_USER\Software\SimpleMail\Message]
"To"=""
"Subject"=""
"Cc"=""
"ReplyTo"=""
"PriorityMessage"="2"

[HKEY_CURRENT_USER\Software\SimpleMail\Path]
"Location File"=""

[HKEY_CURRENT_USER\Software\SimpleMail\Pop3]
"HostPop3"=""
"PortPop3"=""

[HKEY_CURRENT_USER\Software\SimpleMail\Smtp]
"HostSmtp"=""
"PortSmtp"=""

[HKEY_CURRENT_USER\Software\SimpleMail\Temp]
"Getmsg"="0"
"TestCancel"="1"
"Name"=""
"Organization"="-"
"EmailAddress"=""
"Phone"="-"
"City"="-"
"ButtonOK"="1"
"InsertItem"="0"
"Save Editor"=""
"SelectedEmailAddress"=""
"TestSelectedEmailAddress"="0"
"TestClose"="0"

[HKEY_CURRENT_USER\Software\SimpleMail\User]
"UserName"=""
"UserAddress"=""

Subkľúč Temp obsahuje dočasné informácie aplikácie. Aplikácia používa tieto položky pre dočasné uschovanie niektorých svojich parametrov (hodnôt premenných, rôznych stavov a pod. ).

Subkľuče Smtp a Pop3 obsahujú adresy poštového servera, ktorý umožňuje komunikovať pomocou protokolov SMTP a POP3. Položky PortSmtp a PortPop3 definujú komunikačné porty týchto protokolov. Obvykle pre Smtp je to port 25, pre POP3 port 110. Subkľuč User obsahuje informácie o užívateľovi programu. Položka UserName definuje plne meno užívateľa (meno musí byť zadné bez interpunkčných znamienok), položka UserAddress obsahuje e-mailovú adresu užívateľa.

Subkľúč Mailbox obsahuje údaje o poštovej schránke. Položka Login definuje prihlasovacie meno užívateľa, Password – prihlasovacie heslo užívateľa a SavePassword obsahuje údaj o tom či sa má heslo zapamätávať. POZOR! Ak použijete voľbu SavePassword, vystavujete sa riziku, že niekto môže získať vaše heslo. Heslo sa zatiaľ ukladá len ako postupnosť zadaných znakov, t.j. bez šifrovania. Delete Messages obsahuje hodnotu 1 ak správy majú zostať v poštovej schránke, inak obsahuje hodnotu nula. Hodnota 0 znamená, že po získaní správ z poštovej schránky, budú tieto na zadanom poštovom servery vymazané.

Subkľúč AddressBook obsahuje informácie o šírke stĺpcov položiek Name, Organization, EmailAddress, Phone, City.

Subkľúč AttachedFiles slúži na uloženie informácií o pripojených súboroch, konkrétne ide o ich počet (count) a kompletnú cestu na lokálnom počítači.

Subkľúč Path obsahuje cestu k projektu aplikácie. Pri spustení projektu z iného disku treba túto cestu zmeniť.

Evidovanie e-mailových adries

U aplikácií tohto typu sa bežne vyskytuje mechanizmus na zapamätávanie emailových adries. Aplikácia bude na záznam adries používať súbor AddressBook.txt, ktorý sa nachádza v adresári aplikácie, v podadresári Address. Súbor bude mať nasledovnú štruktúru:

Counted record: 1
Chip
Vogel Burda Communications
chip@chip.cz
-
Cech Republic
%

Prvý riadok súboru vždy obsahuje informáciu o počte zaznamenaných emailových adries. Ďalej nasledujú záznamy v tomto poradí: Meno, organizácia, emailová adresa, telefón a mesto. Pokiaľ niektorý záznam nie je zadaný, program doplní na toto miesto znak "-". Jednotlivé záznamy v tomto súbore sú od seba oddelené znakom "%". Súbor je limitovaný na 500 záznamov emailových adries.

Popis zdrojového kódu

Zdrojový kód sa skladá z nasledujúcich častí: Projekt1, AddItem, AddressBook, MailBox, New_Txt_Message, Preferences, SendMessage, Window_AboutBox, SakEmail, sak_util. V nasledujúcom texte sa dozviete viac. Začneme tým najjednoduchším súborom - Window_AboutBox.

Unit Window_AboutBox.pas
AboutBox je okno ktoré má za cieľ iba informovať užívateľa o názve, autorovi, verzii programu, prípadne o použitých moduloch. Unit obsahuje dve procedúry. Procedúra Start_Window_AboutBox zobrazí okno na obrazovku, procedúra TAboutBox.Panel1Click zatvorí okno ak kliknete mimo text, ktorý sa v oknenachádza.

Unit Preferences.pas
procedure TPreferences2.FormCreate(Sender: TObject);
begin

// Inicializácia kľúča
IniFile := TRegIniFile.Create ('SOFTWARE\SimpleMail');

// Na čítanie icon pre tlačidlá Apply a Cancel, tieto icony
// sa nachádzajú v súbore Bitmap.res
IconApply.Glyph.Handle:=LoadBitmap(HInstance,'002OK');
IconCancel.Glyph.Handle:=LoadBitmap(HInstance,'001CANCEL');

// Čítanie nastavení z registra Windows
LoadPreferences;
end;

Procedura LoadPreferences načíta pri otvorení okna údaje zaznamenané v registroch; Procedure SavePreferences zase uloží údaje do registra Windows.

procedure TPreferences2.ApplyClick(Sender: TObject);
begin

// Inicializácia kľúča
IniFile := TRegIniFile.Create ('SOFTWARE\SimpleMail');

// Uloženie nastavení do registra Windows
SavePreferences;

// Zapíše do registra Windows - do kľúča ‘Temp' subkľúča
// 'TestCancel' hodnotu '0', ktorá vyjadruje, že bolo stlačené
// tlačidlo Apply.

IniFile.WriteString('Temp','TestCancel', '0');
IniFile.Destroy;

// Zatvorenie okna
Close;
end;

Procedúry RadioButton1Click(Sender: TObject); až RadioButton5Click(Sender: TObject); sa používajú pri výbere priority posielanej správy. Procedúra CancelClick(Sender: TObject); zatvorí okno, ale pretím ešte zapíše do registra Windows - do kľúča ‘Temp' subkľúča 'TestCancel' hodnotu '1', ktorá vyjadruje, že bolo stlačené tlačidlo Cancel.

Unit New_Txt_Message.pas
Procedúra Add1Click (Sender: TObject); umožňuje do záložky Attached Files v okne Create Text Message pridať súbor k posielanej správe, procedúra Delete1Click (Sender: TObject); sa používa na vymazanie konkrétneho súboru z boxu Attached Files a procedúra Clear1Click (Sender: TObject); vymaže celý box. Procedúra SendMsg1Click (Sender: TObject); sa používa na odoslanie napísanej správy na poštový server.

procedure TCreateTxt1.SendMsg1Click(Sender: TObject);
var
i : integer;
test1, route : string;

begin

// Otvorenie kľuča SimpleMail
IniFile := TRegIniFile.Create ('SOFTWARE\SimpleMail');

// Test na vyplnenie údajov Subject a To, ak niektorý z
// údajov nie je vyplnený zobrazísa chybové hlásenie.
if (EditTo.Text='') or (EditSubject.Text='') then
begin
MessageBeep(MB_ICONEXCLAMATION);
MessageDlg('Field To: or Subject: is empty.',mtError,[mbOk], 0);
end
else
begin

// Inak sa zadané údaje zapíšu do registra Windows
IniFile.WriteString ('Message','To',EditTo.Text);
IniFile.WriteString ('Message','Subject',EditSubject.Text);
IniFile.WriteString ('Message','Cc',EditCc.Text);
IniFile.WriteString ('Message','ReplyTo',EditReplyTo.Text);
IniFile.WriteString ('AttachedFiles','count',IntToStr(ListBoxAttachedFiles.Items.count));

route := IniFile.ReadString('Path','Location File', route);
MemoTextMsg.Lines.SaveToFile(route+'\Temp\working.tmp');

// Test na pripojené súbory AttachedFiles
if ListBoxAttachedFiles.Items.count<>0 then
begin
for i:= 0 to ListBoxAttachedFiles.Items.count-1 do
begin
IniFile.WriteString ('AttachedFiles',IntToStr(i+1),ListBoxAttachedFiles.Items[i]);
end;
end;

// Ak sú potrebné údaje zadané, zobrazí sa okno
// Send Message na odoslanie správy
with TSend1.Create(Application) do
try
ShowModal;
finally
Free;
end;

test1:=IniFile.ReadString ('Temp','TestClose',test1);
// Ak sa programu podarí bezchybne odoslať
// správu okno Create Text Message sa
// automaticky uzatvorí
if test1='1' then
begin
IniFile.WriteString ('Temp','TestClose','0');
close;
end;
end;
end;

Procedúra Options2Click (Sender: TObject); zobrazí okno Preferences, v ktorom sa nastavujú dôležité parametre aplikácie. Procedúra Address1Click (Sender: TObject); zobrazí okno Address Book pre vkladanie, editovanie a mazanie záznamov o poštových adresách. Procedúra Clear2Click (Sender: TObject); sa používa na vymazanie Memo boxu. Memo Box obsahuje samotný text správy. Procedúra LoadFileClick (Sender: TObject); a Procedúra SaveFileClick (Sender: TObject); umožňuje otvoriť, prípadne uložiť súbor s textom správy.

Unit AddressBook.pas
procedure TAddressBook2.FormCreate(Sender: TObject);
var
i1, i2, i3 : integer;
route, s1, s2 : string;

begin

// Načítanie icon pre okno Address Book
IconAdd.Glyph.Handle:=LoadBitmap(HInstance,'005ADD');
IconEdit.Glyph.Handle:=LoadBitmap(HInstance,'004EDIT');
IconDelete.Glyph.Handle:=LoadBitmap(HInstance,'003TRASH');
IconApply.Glyph.Handle:=LoadBitmap(HInstance,'002OK');
IconCancel.Glyph.Handle:=LoadBitmap(HInstance,'001CANCEL');

// Načítanie Listview1.Columns.Width z registra Windows
IniFile := TRegIniFile.Create ('SOFTWARE\SimpleMail');
s1:=IniFile.ReadString('AddressBook','Name', s1);
Listview1.Columns[0].Width:=StrToInt(s1);
s1:=IniFile.ReadString('AddressBook','Organization', s1);
Listview1.Columns[1].Width:=StrToInt(s1);
s1:=IniFile.ReadString('AddressBook','EmailAddress', s1);
Listview1.Columns[2].Width:=StrToInt(s1);
s1:=IniFile.ReadString('AddressBook','Phone', s1);
Listview1.Columns[3].Width:=StrToInt(s1);
s1:=IniFile.ReadString('AddressBook','City', s1);
Listview1.Columns[4].Width:=StrToInt(s1);

// Cesta k súboru v ktorom budú uložené emailové adresy
route := IniFile.ReadString('Path','Location File', route);
route:=route+'\Address\AddressBook.txt';

// Vytvorenie StringListu, t.j. miesta v pamäti pre emailové adresy
StackAddressBook:=TStringList.Create;
StackAddressBook.LoadFromFile(route);

// Zistenie počtu správ zo súboru AddressBook.txt
s1:=StackAddressBook.Strings[0];
s2:=Copy(s1,17,Length(s1)-16);
i1:=StrToInt(s2);

// Prenes správy z pamäti do komponenty Listview
Listview1.SortType:=(stNone);
i3:=1;
for i2:=0 to i1-1 do
begin
ListView1.Items.Add.Caption:=StackAddressBook.Strings[i3];
ListView1.Items[Listview1.Items.Count-1].SubItems.Append(StackAddressBook.Strings[i3+1]);
ListView1.Items[Listview1.Items.Count-1].SubItems.Append(StackAddressBook.Strings[i3+2]);
ListView1.Items[Listview1.Items.Count-1].SubItems.Append(StackAddressBook.Strings[i3+3]);
ListView1.Items[Listview1.Items.Count-1].SubItems.Append(StackAddressBook.Strings[i3+4]);
i3:=i3+6;
end;

// Zobraz počet správ
StatusBar1.Panels[1].Text:='Counted record: '+IntToStr(Listview1.Items.Count);
IniFile.Destroy;
end;

Procedúra ApplyClick (Sender: TObject); zaznamená všetky emailové adresy do súboru AddressBook.txt, tiež uloží do registra Windows hodnoty Listview1.Columns.Width a zatvorí okno. Procedúra DeleteClick (Sender: TObject); vymaže aktuálnu položku, v prípade že kliknete na toto tlačidlo a nie je vybraná žiadna emailová adresa – zobrazí sa chybové hlásenie. Procedúra AddClick (Sender: TObject); zobrazí okno AddItem na vloženie nového záznamu. Procedúra ListView1DblClick (Sender: TObject); prenesie emailovú adresu do poľa To: a zatvorí okno. Procedúra ListView1Click (Sender: TObject); aktuálnu adresu zobrazí v stavovom riadku aplikácie. Procedúra EditClick (Sender: TObject); otvorí okno AddItem a umožní editovanie aktuálneho záznamu.

Unit AddItem.pas
procedure TAddItem2.FormCreate(Sender: TObject);
var
test : string;
begin

// Načítanie icon pre okno AddItem
IconOk.Glyph.Handle:=LoadBitmap(HInstance,'002OK');
IconCancel.Glyph.Handle:=LoadBitmap(HInstance,'001CANCEL');

// Test – či ide o prepísanie adresy Edit alebo vloženie novej adresy Add
IniFile := TRegIniFile.Create ('SOFTWARE\SimpleMail');
test:=IniFile.ReadString('Temp','InsertItem', test);

if test='1' then // Ak ide Edit, načítanie vybranej adresy z registra
begin
IniFile.WriteString('Temp','InsertItem', '0');
Edit1.Text:=IniFile.ReadString ('Temp','Name', Edit1.Text);
Edit2.Text:=IniFile.ReadString ('Temp','Organization', Edit2.Text);
Edit3.Text:=IniFile.ReadString ('Temp','EmailAddress', Edit3.Text);
Edit4.Text:=IniFile.ReadString ('Temp','Phone', Edit4.Text);
Edit5.Text:=IniFile.ReadString ('Temp','City', Edit5.Text);
end;
IniFile.Destroy;
end;

Procedure OkClick(Sender: TObject); zapíše vyplnené údaje do registrov a zatvorí okno. Procedure CancelClick(Sender: TObject); zatvorí okno a do kľúča 'Temp' subkľuča 'ButtonOK' zapíše hodnotu '0', ktorá znamená, že bolo stlačené tlačidlo Cancel a teda editovaná alebo pridávaná emailová adresa sa nebude zaznamenávať.

Unit SendMessage;
procedúra SakSMTP1SendProgress (Sender: TObject; Percent: Word); zobrazuje koľko percent daného súboru je už odoslaného na poštový server. Procedúra SakSMTP1BeforeSend (Sender: TObject); sa aktivuje po poslaní správy a nastaví SendProgress na nulu. Procedúra SakSMTP1EncodeStart (Sender: TObject; FileName: String; BytesCount: Integer); sa aktivuje pred prevodom správy do formátu Base64 a nastaví EncodeProgress na nulu. Procedúra SakSMTP1EncodeProgress (Sender: TObject; Percent: Word); zobrazuje koľko percent daného súboru je už transformovaného do formátu base64. Procedúra SakSMTP1EncodeEnd (Sender: TObject); sa spustí po ukončení kódovania súboru a nastaví EncodeProgress na nulu. Procedúra CancelSend1Click (Sender: TObject); umožní prerušiť aktuálne posielanie súboru na server a zatvorí okno. Procedúra SakSMTP1Error(Sender: TObject; Error: Integer; Msg: String); zobrazí chybové hlásenie ak vznikne chyba v súvislosti s SMTP serverom.

procedure TSend1.ConnectClick(Sender: TObject);
var
position, i : integer;
route, count, s1 : string;

begin
Timer1.Enabled:=false;
IniFile := TRegIniFile.Create ('SOFTWARE\SimpleMail');
StatusBar1.SimpleText:='Connecting: Ok';
StatusBar1.SimpleText:='Wait a moment, please - contact your post server';

// Načítanie parametrov z registra Windows
s1:=IniFile.ReadString ('Smtp','HostSmtp',s1);
SakSMTP1.Host := s1;
s1:=IniFile.ReadString ('Smtp','PortSmtp',s1);
SakSMTP1.Port := s1;
s1:=IniFile.ReadString ('User','UserName',s1);
SakMsg1.UserName := s1;
s1:=IniFile.ReadString ('User','UserAddress',s1);
SakMsg1.From := s1;
s1:=IniFile.ReadString ('Message','To',s1);
SakMsg1.SendTo := s1;
s1:=IniFile.ReadString ('Message','Subject',s1);
SakMsg1.Subject := s1;
s1:=IniFile.ReadString ('Message','Cc',s1);
SakMsg1.CC := s1;
s1:=IniFile.ReadString ('Message','ReplyTo',s1);
SakMsg1.ReplyTo := s1;

route := IniFile.ReadString('Path','Location File', route);
SakMsg1.Text.LoadFromFile(route+'\Temp\working.tmp');
SakMsg1.AttachedFiles.clear;

// Načítanie priority správy
s1 := IniFile.ReadString ('Message','PriorityMessage', s1);
position:=Strtoint(s1);

case position of
0 : SakMsg1.Priority := prHighest;
1 : SakMsg1.Priority := prHigh;
2 : SakMsg1.Priority := prNormal;
3 : SakMsg1.Priority := prLow;
4 : SakMsg1.Priority := prLowest;
end;

// Počet pripojených súborov
count:=IniFile.ReadString('AttachedFiles','count',count);

if StrToInt(count)<>0 then
begin
for i:= 0 to StrToInt(count)-1 do
begin
s1:=IniFile.ReadString ('AttachedFiles',IntToStr(i+1),s1);
SakMsg1.AttachedFiles.add(s1);
end;
end;

SakSMTP1.connect;

// Ak sa nie je možné spojiť so serverom vypíše sa chyba
if SakSMTP1.SMTPError then
begin
StatusBar1.SimpleText:='Connecting: Fail';
SakMsg1.AttachedFiles.Clear;
MessageBeep(mb_IconExclamation);
MessageDlg('A network error occurred:'+#13#10+
'unable to connect to server (TCP Error: No route to host)'+#13#10+
'The server may by down or unreachable.'+#13#10#13#10+
'Try connecting again later.',mtWarning, [mbOk], 0);
end;

// Ak je spojenie Ok pošle sa vytvorená správa na Váš poštový server
if not SakSMTP1.SMTPError then
begin
StatusBar1.SimpleText:='Connecting: Ok';
SakSMTP1.SendMessage(SakMsg1);
Gauge2.Progress:=0;
SakSMTP1.quit;
Gauge2.Progress:=0;
IniFile.WriteString ('Temp','TestClose','1');
end;
close;
end;

Unit MailBox
Procedúra FormCreate (Sender: TObject); vypíše do stavového riadku aktuálny dátum a zakáže položku menu – Stop. Procedúra SakPOP1AfterRetrieve (Sender: TObject); zobrazí do stavového riadku číslo správy, ktorá sa prenáša na lokálny počítač. Procedúra SakPOP1RetrieveProgress (Sender: TObject; Percent: Word); zobrazuje koľko percent daného súboru je už prijatého z poštového servera.

Procedúra SakPOP1BeforeRetrieve (sender: TObject; id: Word); sa aktivuje po prijatí správy a nastaví RetrieveProgress na nulu.

Procedúra SakPOP1DecodeProgress (Sender: TObject; Percent: Word); zobrazuje koľko percent daného súboru je už transformovaného z formátu base64 späť do binárneho tvaru.

Procedúra SakPOP1DecodeStart (Sender: TObject; FileName: String; BytesCount: Integer); sa aktivuje pred prevodom správy z formátu Base64 a nastaví EncodeProgress na nulu. Procedúra SakPOP1DecodeEnd (Sender: TObject); sa spustí po ukončení dekódovania súboru a nastaví EncodeProgress na nulu. Procedúra SakPOP1Error (Sender: TObject; Error: Integer; Msg: String); zobrazí chybové hlásenie ak vznikne chyba v súvislosti s POP3 serverom.

Procedúra About1Click (Sender: TObject); zavolá procedúru na zobrazenie okna About. Procedúra Options1Click (Sender: TObject); zobrazí okno Preferences, procedúra NewMsg (Sender: TObject); zobrazí okno Create Text Message

Procedúra ListView2Click (Sender: TObject); zobrazí obsah konkrétnej správy a pripojené súbory. Procedúra DeleteMsg1Click (Sender: TObject); sa používa na vymazanie správ. Procedúra Stop1Click (Sender: TObject); umožňuje prerušiť prijímanie správ zo servera.

Procedúra showCurrentMsg; zobrazí aktuálnu správu. Procedúra ButtonSave2Click (Sender: TObject); umožňuje uložiť súbor(y), ktorý je pripojený k správe na lokálny disk počítača.

procedure TMail.GetMsg1Click(Sender: TObject);
var passwd0,login0 : string;
testsavepassword, testcancel : string;
Hwnd : THandle;
begin
// Zistí Hwnd (číslo) okna aplikácie
Hwnd := FindWindow ('TMail', 'Simple mail');

// Pošle správu wm_HideMenu na zákaz položiek menu
PostMessage (Hwnd, wm_HideMenu,0,0);

// Načítanie mena (login) a hesla (password) z registra Windows
IniFile := TRegIniFile.Create ('SOFTWARE\SimpleMail');
passwd0:=IniFile.ReadString ('Mailbox','Password', passwd0);
login0:=IniFile.ReadString ('Mailbox','Login', login0);

// Ak nie je heslo (password) alebo prihlasovacie meno (login)
// zadané zobrazí sa okno Preferences na zadanie chýbajúcich
// údajov
if (passwd0='') or (login0='') then
begin

with TPreferences2.Create(Application) do
try
// Nastavenie na záložku MailBox v okne Preferences
PageControl1.SelectNextPage(True);
PageControl1.SelectNextPage(True);
IniFile.WriteString ('Temp','Getmsg', '1');
ShowModal;
finally
IniFile.WriteString ('Temp','Getmsg', '0');
login:=IniFile.ReadString ('Mailbox','Login', login);
password:=IniFile.ReadString ('Mailbox','Password', password);
testsavepassword:=IniFile.ReadString ('Mailbox','SavePassword', testsavepassword);

if testsavepassword='0' then IniFile.WriteString ('Mailbox','Password', '');
Free;

// Nastavenie komponenty SakPOP
SakPOP1.Host := IniFile.ReadString ('Pop3','HostPop3', SakPOP1.Host);
SakPOP1.UserId := login;
SakPOP1.Passwd := password;
end;
end
else
begin
SakPOP1.Host := IniFile.ReadString ('Pop3','HostPop3', SakPOP1.Host);
SakPOP1.UserId := IniFile.ReadString ('Mailbox','Login', SakPOP1.UserId);
SakPOP1.Passwd := IniFile.ReadString ('Mailbox','Password', SakPOP1.Passwd);
end;

testcancel:=IniFile.ReadString ('Temp','TestCancel', testcancel);

if testcancel='1' then exit else
begin
StatusBar1.Panels[0].Text := 'Wait a moment, please - contact your post server';

SakPOP1.connect;

// Ak nie je možné vytvoriť spojenie vypíše sa chyba
if SakPOP1.POPError then
begin
StatusBar1.Panels[0].Text := 'Connecting: Fail';
MessageBox(Mail.Handle, 'Connect failed. Maybe the server is down or not responding.','Error',MB_OK or MB_ICONERROR);
StatusBar1.Panels[0].text := '';
PostMessage (Hwnd, wm_EnableMenu,0,0);
exit;
end;

// Ak je chybne zadane heslo alebo prihlasovacie meno vypíše sa chyba
if not SakPOP1.login then
begin
StatusBar1.Panels[0].Text := 'Connecting: Fail';
MessageBox(Mail.Handle, 'Unauthorized access...','Error',MB_OK or MB_ICONERROR);
PostMessage (Hwnd, wm_EnableMenu,0,0);
exit;
end;

Stop1.Enabled:=True;
StatusBar1.Panels[0].Text := 'Connecting: Ok '+'-> You have ' +
intToStr( SakPOP1.Init) + ' new msg(s) of ' +
intToStr( SakPOP1.MsgsCount);

// Prenesenie všetkých správ z poštového servera
sakPOP1.retrieveAllMessages( SakMsgList1);

Gauge3.Progress := 0;

// Ukončenie spojenia s POP3 serverom
SakPOP1.quit;
Stop1.Enabled:=False;

// Pošle správu wm_EnableMenu na sprístupnenie položiek menu
PostMessage (Hwnd, wm_EnableMenu,0,0);

// Zobrazenie správ prečítaných zo servera
if SakMsgList1.count > 0 then
begin
GetMsg1.Visible:=False;
currentMsg := 0;
showCurrentMsg;
end;
StatusBar1.Panels[0].text := 'Done. ' + intToStr( SakMsgList1.count) + ' msgs retrieved.';
end;
end;

Program Projekt1
Projekt obsahuje ešte kód na kontrolu násobného spustenia aplikácie. Kód zabezpečí, že bude možné spustiť iba jednu kópiu aplikácie. API funkcia FindWindow vyžaduje dva parametre: názov triedy okna a titulok okna, ktoré hľadáte. Výsledkom funkcie FindWindow je handle okna alebo nula, pokiaľ nie je nájdené žiadne okno. S týmto kódom môžete spustiť novú kópiu aplikácie iba v prípade, že neexistuje jej predchádzajúca inštancia. Pokiaľ už jedna kópia aplikácie beží, nestane sa nič. Iba v prípade že sa aplikácia nachádza v minimalizovanej podobe vykoná sa príkaz Application.Restore. Pokiaľ tento program spustíte v Delphi. Bude okno s daným titulkom už existovať. Takto sa aplikácia nespustí ani raz. Spustí sa až vtedy ak zmeníte riadok kódu napr. takto: Hwnd := FindWindow ('TMail', 'Simple');.

...
var Hwnd: THandle;

begin
Hwnd := FindWindow ('TMail', 'Simple mail');
if Hwnd = 0 then
begin
Application.Initialize;
Application.CreateForm(TMail, Mail);
Application.Title := 'Simple mail';
Application.Run;
end
else
begin
if (not IsWindowVisible (Hwnd)) then
PostMessage (Hwnd, wm_User,0,0);
SetForegroundWindow (Hwnd);
end;
...


(c) 2004 Ing. Peter Gašparovič - www.pgasparovic.com

Literatúra

[1]  Feiber, W.: Encyklopedie počítačových sítí. Praha, Computer Press, 1996.
[2]  Břehovský, P.: Praktický úvod TCP/IP. České Budějovice, KOPP, 1994.
[3]  Mrázek, L.: První kroky INTERNETEM aneb Je to na WWW!. České Budějovice, KOPP, 1995.
[4]  Šmrha, P. - Rudolf, V.: Internetworking pomocí TCP/IP. České Budějovice, KOPP, 1995.
[5]  Hejna, L.: Lokální počítačové síte. Praha, GRADA, 1994.
[6]  Falk, B.: Průvodce světem Internetu. Praha, Computer Press, 1995.
[7]  Lhotka, L.: SERVER v INTERNETU. České Budějovice, KOPP, 1997.
[8]  Peterka, J.: Co je čím ... v počítačových sítích. COMPUTERWORLD, 1994, č. 4, 7, 9, 17, 21, 35, 44.