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.
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.
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ť.
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.
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.