Delphi. Laiškų siuntimas naudojant Delphi

Sukurkite programą, kuri suteiks sąsają standartinei Win2000/XP pranešimų perdavimo komandai net send. Leiskite vartotojui nurodyti gavėjo adresą, žinutės tekstą ir siunčiamų žinučių skaičių. Taip pat suteikite galimybę blokuoti pranešimų gavimą iš kitų kompiuterių.

Formos vystymas

Sukurti naujas projektas Delphi. Pakeiskite formos pavadinimą (antraštės ypatybę) į „Net Sender“. Padėkite tris etiketės kategorijos komponentus vieną virš kito kairiajame formos krašte. Standartinis ir nustatykite jų antraštės ypatybes į IP Address:, Message: ir Quantity:.

Prie kiekvienos etiketės įdėkite elementą Redaguoti kategoriją Standartinis. Pavadinkite viršutinį IP adresą (ypatybė Name) ir ypatybei Text priskirkite reikšmę 192.168.0.1.; pavadinkite vidurinį lauką txt ir priskirkite ypatybę Tekstas kuriam nors numatytam pranešimo tekstui; Pavadinkite apatinį lauką kaip ir nustatykite ypatybę Tekstas į 1.

Po išvardytais komponentais įdėkite Kategorijos žymės langelio komponentą Standartinis. Pavadinkite jį saugiu, ypatybę Antraštė nustatykite į Išjungti pranešimų priėmimą, o ypatybę Patikrinta – į True.

Pačiame formos apačioje įdėkite mygtuką (mygtuko kategorijos komponentas Standartinis), nustatydami antraštės ypatybę į Siųsti. Mums taip pat reikia laikmačio (komponento laikmačio kategorija Sistema), kuriai intervalo ypatybė turėtų būti nustatyta į 10.

Gauta forma turi atitikti Fig. 15.1.

Ryžiai. 15.1. Forma, skirta programai siųsti pranešimus vietinis tinklas

Programos kodo kūrimas

Pirmiausia parašykime savo bombos procedūrą, kuri perskaitys visus nustatymus ir atsiųs žinutę. Paskelbkite šią procedūrą kaip privatų formos klasės narį:

Mums taip pat reikia visuotinio kintamojo i tipo sveikasis skaičius:

Dabar sukurkime bombos procedūros įgyvendinimą įgyvendinimo skyriuje:

procedūra TForm1.bomb();
jeigu how.Text= "" tada kaip.Text:= "1";
jei ip.Text = "", tada ip.Text:= "127.0.0.1";(jei IP adresas nenurodytas, siunčiame į vietinis kompiuteris}
WinExec(PChar("neto siuntimas " + ip.tekstas + """ + txt.tekstas + """), 0);//Siųsti žinutę

Ši procedūra patikrina, ar užpildyti visi privalomi laukai. Jei pranešimo teksto nėra, nustatykite ženklą „! jei IP adresas nenurodytas, siunčiame pranešimą į vietinį kompiuterį adresu 127.0.0.1; jei pranešimų skaičius nenurodytas, tada siunčiame vieną žinutę. Pranešimai siunčiami naudojant standartinę komandą net send, kurios sintaksė yra tokia:

net siųsti IP adreso žinutę.

Dabar tvarkykime „OnTimer“ įvykį:

h: HWND;//saugomas lango ID
jei nesaugu.Patikrinta tada//jei žymės langelis nepažymėtas
Timer1.Enabled:= False;//išjungti stebėjimą
jei saugus.Patikrinta tada//jei žymimasis laukelis pažymėtas
//ieškokite pranešimų dėžučių
h:= FindWindow(nil, "Message Service");//uždaryti visus rastus langus
jei h<>

Jei pažymėtas žymės langelis Išjungti pranešimų gavimą, pradedame stebėti langus, kurių pavadinimas rodo, kad tai yra pranešimas, ir uždarome visus rastus langus. Jei žymimasis laukelis nepažymėtas, stebėjimas išjungtas.

Kad galėtumėte perjungti šiuos du režimus, turite sukurti saugią.OnClick įvykių tvarkyklę:

jei saugus.Patikrinta tada//jei žymimasis laukelis pažymėtas...
Timer1.Enabled:= Tiesa;//...įjungti stebėjimą

Paspaudus mygtuką Siųsti mes tiesiog vadinsime bombos procedūrą:

Siekdami palengvinti vartotojo gyvenimą, pasirūpinsime, kad žinutė būtų siunčiama ir paspaudus klavišą bet kuriame teksto įvesties lauke. Norėdami tai padaryti, kiekvienam laukui turite sukurti OnKeyPress įvykių tvarkyklę. Šios tvarkyklės kodas skirtas ip laukui, kurį vėliau galima priskirti txt ir kaip laukams:

jei raktas= #13 tada//jei paspaudžiamas klavišas
bomba;//Siųsti žinutę

Visas modulio šaltinio kodas

Visas programos modulio, skirto pranešimų siuntimui vietiniu tinklu, kodas pateiktas 15.1 sąraše.

Sąrašas 15.1. Programos modulis žinutėms siųsti vietiniu tinklu

Windows, Žinutės, SysUtils, Variantai, Klasės, Grafika, Valdikliai, Formos, Dialogai, StdCtrls, ExtCtrls;

procedūra Laikmatis1Laikmatis(Siuntėjas: TObject);
procedūra safeClick(Siuntėjas: TObject);
procedūra ipKeyPress(Siuntėjas: TObject; var Key: Char);
procedūra txtKeyPress(Siuntėjas: TObject; var Key: Char);
procedūra howKeyPress(Siuntėjas: TObject; var Key: Char);
procedūra Button1Click(Siuntėjas: TObject);


//patikrinkite, ar jis tuščias žinutė
jei txt.Text = "" tada txt.Text:= "!";
//jei kiekis nenurodytas, tada siunčiame vieną žinutę
if how.Text= "" then how.Text:= "1";
jei ip.Text = "", tada ip.Text:= "127.0.0.1"; (jei IP adresas nenurodytas, siunčiame jį į vietinį kompiuterį)
//išsiųsti nurodytą skaičių pranešimų
i:=1 į StrToInt(how.Text) padaryti
WinExec(PChar("neto siuntimas " + ip.tekstas + """ + txt.tekstas + """), 0); //Siųsti žinutę

procedūra TForm1.Timer1Timer(Siuntėjas: TObject);
h: HWND; //saugomas lango ID
jei nėra saugu.Pažymėta tada //jei žymės langelis nepažymėtas
Timer1.Enabled:= False; //išjungti stebėjimą
jei saugus.Pažymėta tada //jei žymimasis laukelis pažymėtas
//ieškokite pranešimų dėžučių
h:= FindWindow(nil, "Message Service"); //uždaryti visus rastus langus
jei h<>0, tada PostMessage(h, WM_QUIT, 0, 0);

procedūra TForm1.secureClick(Siuntėjas: TObject);
jei saugu. Pažymėta tada //jei žymimasis laukelis pažymėtas...
Timer1.Enabled:= Tiesa; //...įjungti stebėjimą

procedūra TForm1.ipKeyPress(Siuntėjas: TObject; var Key: Char);
jei klavišas = #13, tada //jei klavišas paspaustas
bomba; //Siųsti žinutę

procedūra TForm1.Button1Click(Siuntėjas: TOobjektas);

⊚ Visi projekto failai ir aptariamos programos vykdomasis failas yra kompaktiniame diske, kuris yra kartu su knyga, 15 skyriaus aplanke.

Siunčia žinutes

Taip pat kaip Windows sistema siunčia pranešimus į įvairius langus, pačiai programai taip pat gali tekti keistis pranešimais tarp savo langų ir valdiklių. Yra keletas pranešimų siuntimo būdų: PerForm() metodas (kuris veikia nepriklausomai nuo Windows API), taip pat Win32 API funkcijos SendMessage() ir PostMessage().

Metodas PerForm(), kurį visi TControl klasės palikuonys turi:

funkcija TControl.Perform(Pranešimas: Cardinal; WParam, LParam: Longint): Longint;

Norėdami išsiųsti pranešimą į formą arba valdiklį, naudokite šią sintaksę:

RetVal:= ControlName.PerForm(MessageID, wParam, lParam);

Kai iškviečiama PerForm(), valdymas negrįš į iškvietimo programą, kol pranešimas nebus apdorotas. Šis metodas perduoda pranešimą neperžengdamas „Windows API“ pranešimų sistemos.

API funkcijos SendMessage() ir PostMessage() deklaruojamos modulyje „Windows“ toliau būdas:

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM;

lParam: LPARAM): LRESULT; stdcall;

function PostMessage(hWnd: HWND; Msg: UINT;

wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;

hWnd – pranešimo gavėjo lango rankena; Msg – žinutės identifikatorius; wParam ir lParam – papildomi duomenys.

Funkcija SendMessage(), kaip ir metodas PerForm(), siunčia pranešimą tiesiai į lango procedūrą ir laukia, kol jis bus apdorotas, o funkcija PostMessage() įdeda pranešimą į pranešimų eilę ir grąžina valdymą programai, kuri iškvietė tai nelaukiant apdorojimo rezultatų.

Funkcija SendMessage() grąžina reikšmę, gautą apdorojant pranešimą. Funkcija PostMessage() – grąžina reikšmę, nurodančią, ar pranešimas buvo sėkmingai paskelbtas pranešimų eilėje.

Vartotojo pranešimai

Kuriant programas, gali būti situacija, kai programa turi nusiųsti specialų pranešimą arba sau, arba kitai programai, kad galėtų atlikti kokį nors veiksmą. Vartotojo sukurtų pranešimų atveju „Windows“ pasilieka reikšmes nuo WM_USER iki $7FFF.

Priskirto pranešimo pavyzdys:

TestMsg = WM_USER + 100; // pranešimo ID

TForm1 = klasė (TForm)

// pranešimų apdorojimo metodas:

procedura MyMessage(var Msg: TMessage); pranešimas TestMsg;

procedura TForm1.MyMessage(var Msg: TMessage);

ShowMessage("TestMsg pranešimas veikia");

Pranešimas.Rezultatas:= 1; // grąžino rezultatą

Pranešimo siuntimo į formą pavyzdžiai:

jei Form1.PerForm(TestMsg, 0, 0) = 1 tada

jei SendMessage(Form1.Handle, TestMsg, 0, 0) = 1, tada

ShowMessage("Pranešimas sėkmingai apdorotas");

if PostMessage(Form1.Handle, TestMsg, 0, 0) then

ShowMessage("Pranešimas buvo patalpintas į pranešimų eilę");

Delphi Renginiai

Įvykis yra kažkas, kas įvyksta programai veikiant. Delphi kalbos požiūriu įvykis yra procedūrinio tipo savybė, o jo reikšmė – rodyklė į kokį nors metodą. Vertės priskyrimas tokiai ypatybei reiškia metodo, kuris bus vykdomas įvykus įvykiui, adresą. Tokie metodai vadinami įvykių tvarkytojais.

Naudodami įvykius galite pridėti naujų funkcijų prie esamos klasės nekuriant palikuonių klasės.

Įvykio ypatybės bando prasidėti žodžiu „Įjungta“, po kurio nurodomas įvykio pavadinimas.

Ryšys tarp pranešimų ir įvykių

„Delphi“ suteikia sąsają, leidžiančią bendrauti su „Windows“ pranešimais, bent jau kai kuriais iš jų. Daugelis VCL komponentų įvykių yra tiesiogiai susiję su pranešimais Windows tipas WM_XXX.

Pranešimų apdorojimo seka Delphi
Visose Delphi klasėse yra įmontuotas pranešimų tvarkymo mechanizmas, vadinamas pranešimų tvarkytuvais. Klasė gauna pranešimą ir iškviečia vieną iš nustatytų metodų rinkinio, priklausomai nuo gauto pranešimo. Jei atitinkamas metodas neapibrėžtas, tada iškviečiamas numatytasis tvarkytuvas. Išsamiau, šis mechanizmas veikia taip.

Gavus pranešimą, VCL pranešimų sistema atlieka daug parengiamojo darbo, kad jį apdorotų.

Kaip minėta pirmiau, pranešimas iš pradžių apdorojamas metodu TApplication.ProcessMessage, kuris parenka jį iš eilės pagrindiniame pranešimų cikle. Tuo pačiu metu jis patikrina lauko FOnMessage turinį (iš tikrųjų patikrina, ar yra įvykio OnMessage tvarkytojas) ir, jei jis nėra tuščias, iškviečia šio įvykio tvarkyklę, o jei laukas yra tuščias (Nil), tada iškviečia API funkciją DispatchMessage(Msg). Tai neįvyksta siunčiant žinutę.

Jei OnMessage įvykių tvarkytojas neapibrėžtas, gautam pranešimui apdoroti iškviečiama funkcija DispatchMessage API, kuri perduoda pranešimą pagrindinio lango procedūrai.

Panagrinėkime pranešimų apdorojimo ciklą po to, kai jis patenka į pagrindinį komponento langą. Pranešimo apdorojimo seka parodyta paveikslėlyje:

Matyti, kad pranešimas perduodamas į MainWndProc, tada į WndProc, tada į Dispatch, tada į DefaultHandler.

„Delphi“ suteikia pagrindinį nevirtualų metodą MainWndProc(Varto pranešimas: TMessage) kiekvienam komponento langui. Jame yra išimčių tvarkymo blokas, perduodantis pranešimų struktūrą iš Windows į virtualų metodą, apibrėžtą WindowProc ypatybėje. Tačiau šis metodas apdoroja visas išimtis, atsirandančias apdorojant pranešimą, iškviesdamas programos HandleException metodą. Nuo šio momento galite numatyti specialų pranešimo apdorojimą, jei to reikalauja jūsų programos logika. Paprastai šiuo metu apdorojimas yra modifikuojamas, kad būtų išvengta standartinio VCL apdorojimo.

Pagal numatytuosius nustatymus objekto WindowProc ypatybės reikšmė inicijuojama pagal WndProc virtualaus metodo adresą. Toliau, jei nėra registruotų TWindowHook tipo pranešimų gaudyklių, WndProc iškviečia virtualų metodą TObject.Dispatch, kuris, naudodamas gaunamo pranešimo struktūros lauką Msg, nustato, ar pranešimas yra šio objekto pranešimų tvarkyklių sąraše. Jei objektas neapdoroja pranešimo, išnagrinėjamas protėvių pranešimų tvarkytojų sąrašas. Jei galiausiai randamas toks metodas, jis iškviečiamas; kitu atveju iškviečiamas virtualus metodas DefaultHandler.

Galiausiai pranešimas pasiekia atitinkamą apdorojimo procedūrą, kurioje atliekamas jam skirtas apdorojimas. Naudojant raktažodį Paveldėjęs jis toliau siunčiamas perdirbti pas protėvius. Tada pranešimas taip pat siunčiamas į DefaultHandler metodą, kuris apdoroja galutinį pranešimą ir perduoda jį DefWindowProc (DefMDIProc) procedūrai standartiniam Windows apdorojimui.

Laiškų apdorojimas naudojant Delphi komponentus
Taigi, Trumpas aprašymas Pranešimų apdorojimo seka yra tokia. Visi pranešimai iš pradžių perduodami metodu, kurio adresas nurodytas WindowProc ypatybėje. Pagal numatytuosius nustatymus tai yra WndProc metodas. Po to jie yra atskiriami ir siunčiami pagal jų pačių pranešimų metodus. Pabaigoje jie vėl susilieja naudojant DefaultHandler metodą, jei jie nebuvo apdoroti anksčiau arba tvarkytuvėse iškviečiamas paveldėtas tvarkytojas (Paveldėtas). Todėl, Delphi komponentai Yra šios pranešimų apdorojimo parinktys:
a) Prieš bet kuriam pranešimo tvarkytojui pamatant pranešimą. Tokiu atveju turite pakeisti metodo adresą ypatybėje WindowProc arba pakeisti TControl.WndProc metodą.
WindowProc ypatybė deklaruojama taip:

Toure TWndMethod= Procedūra(Varto pranešimas: TMessage) Objekto;
Nuosavybė WindowProc: TWndMethod;

Tiesą sakant, naudodami WindowProc ypatybę, galite sukurti TWndMethod tipo metodą ir laikinai pakeisti pradinį metodą sukurtu, tačiau kadangi metodo adresas ypatybėje WindowProc nėra saugomas, pirmiausia turite išsaugoti originalų WndProc metodą, kad vėliau būtų galima jį atkurti.

OldWndProc: TWndMethod;
procedura NewWndProc(var Pranešimas: TMessage);
procedura TForm1.NewWndProc(var Message: TMessage);
var Ch: char;
pradėti
jei pranešimas.Msg= WM_MOUSEMOVE tada pradėkite
Edit1.Text:=’x=’+inttostr(pranešimas.LParamLo)+’, y=’+inttostr(pranešimas.LParamHi);
galas
else WndProc(Message);
galas;

procedūra TForm1.FormCreate(Siuntėjas: TObject);
pradėti
OldWndProc:=WindowProc;
galas;

procedūra TForm1.CheckBox1Click(Siuntėjas: TObject);
pradėti
Jei CheckBox1.Checked tada WindowProc:= NewWndProc
else WindowProc:= OldWndProc;
galas;

b) Atitinkamo pranešimo metodo viduje.
Pateikime kitą panašų pavyzdį.
WMPAINT perpiešimui naudoja komponentams išsiųstą pranešimą.

TForml klasėje paskelbsime šį metodą, kad jį nepaisytume, ir pristatysime nepaisyto pranešimo metodo įgyvendinimą:

Ture TForml = Klasė (TForm)
… // Visos kitos būtinos deklaracijos
Apsaugotas
Procedūra WMPaint(Var Msg: TWMPaint); Pranešimas WM_PAINT; Galas;
Procedūra TForml.WMPaint(Var Msg: TWMPaint); Pradėkite
Jei CheckBox1.Checked tada ShowMessage('O6pa6ot pranešimas!');
Paveldėtas;
Galas;

Kai nepaisoma konkrečių pranešimų tvarkyklių, visada naudinga paskambinti paveldėtam, kad būtų atliktas pagrindinis pranešimų apdorojimas, kurio reikalauja Windows.

c) Po kiekvieno iš metodų, atitinkančių pranešimą, jį mato.

Tokiu atveju būtina nepaisyti DefaultHandler.

procedūra DefaultHandler(var Message); nepaisyti;
procedura TForm1.DefaultHandler(var Message);
var i:integer;
pradėti
jei Cardinal(Message)=WM_defh tada
i:= nuo 0 iki 10 pradėkite
pyptelėjimas;
miegas (100);
galas
Kitas
paveldėtas;
galas;

procedūra TForm1.Button5Click(Siuntėjas: TObject);
pradėti
SendMessage(Handle,WM_defh,0,0);
galas;

Ryšys tarp pranešimų ir įvykių
Daugelis VCL Delphi įvykių yra tiesiogiai susiję su Windows pranešimais. Delphi pagalbos sistema pateikia šių atitikčių sąrašą. Jie pateikti 1 lentelėje.

1 lentelė

VCL renginys„Windows“ pranešimasVCL renginys„Windows“ pranešimas
ĮjungtiWM_ACTIVATEOnKeyPressWM_CHAR
PaspaudusWM_LBUTTONDOWNOnKeyUpWM_KEYUP
OnCreateWM_CREATEOnPaintWM_PAINT
OnDblClickWM_LBUTTONDBLCLKOnResizeWM_SIZE
OnKeyDownWM_KEYDOWNĮjungimo laikmatisWM_TIMER

Neturėtumėte kurti pranešimų tvarkyklių, jei tam yra iš anksto nustatytas įvykis. Tokiais atvejais prasminga naudoti įvykių tvarkymą, nes jis turi mažiau apribojimų.

kažkur taip

IdTCPClient1.Host:= "127.0.0.1"; IdTCPClient1.Connect;// prijungtas IdTCPClient1.Socket.WriteLn("komanda"); // išsiųsta komanda komanda ir eilutės tiekimas // Palaukite atsakymo ir uždarykite ryšį txtResults.Lines.Append(IdTCPClient1.Socket.ReadLn); IdTCPClient1.Atjungti;

šiuo atveju komanda yra tik tekstas su eilutės tiekimu. Taip daug lengviau gauti komandą iš kitos pusės (tik ReadLn). Bendru atveju reikia sugalvoti (arba naudoti paruoštą) protokolą.

virš jo buvo klientas. O dabar serveris. Su serveriu viskas yra šiek tiek sudėtingiau. Akivaizdu, kad normalu, kai serveris aptarnauja ne vieną klientą, o daugelį. Ir tam yra keletas „schemų“.

    Klasika – vienas klientas – vienas siūlas. Schema yra lengvai koduojama ir intuityvi. Jis gerai lygiagretus per branduolius. Trūkumas yra tas, kad paprastai labai sunku sukurti daug gijų, o tai riboja klientų skaičių. 32 bitų programoms viršutinė riba yra maždaug 1500 (pusantro tūkstančio) gijų vienam procesui. Tačiau šiuo atveju pridėtinės jų keitimo išlaidos gali „suvalgyti“ visą procentą. Tai schema, naudojama indy.

    Antrasis klasikinis yra visi klientai vienoje gijoje. Šią schemą dažnai yra sudėtingiau koduoti, tačiau taikant tinkamą metodą ji leidžia išlaikyti 20–30 000 „lėtų vartotojų“ praktiškai neapkraunant branduolio. Didelis šios schemos pranašumas yra tai, kad galite apsieiti be mutexų ir kitų sinchronizavimo primityvų. Šią schemą naudoja NodeJS ir standartinės klasės darbui su tinklu Qt.

    Mišrus. Tokiu atveju sukuriamos kelios gijos, kurių kiekviena aptarnauja tam tikrą klientų skaičių. Sunkiausia koduoti, tačiau leidžia maksimaliai išnaudoti techninės įrangos išteklius.

Kaip tai daroma Indijoje. Indy tcp serveris sukuria atskirą giją (TThread) kiekvienam ryšiui ir tolesnis darbas su joje vaikštančiu klientu. Indy tai puikiai paslepia, palikdama vartotojui tik IdTCPServer.onExecute metodą. Tačiau, kaip minėjau aukščiau, šis metodas yra paleistas atskiroje gijoje ir yra individualus kiekvienam klientui. Tai reiškia:

  • šiuo metodu galite skambinti miegoti ir lauks tik vienas klientas. Visi kiti veiks (bet jei mygtuko paspaudimo tvarkyklėje iškviečiate miego režimą, rezultatas yra žinomas)
    • Geriau prieiti prie globalių kintamųjų tik per sinchronizacijos primityvus.
    • Turite atidžiai ir teisingai pasiekti gui elementus. Geriau to nedaryti tiesiogiai (kai kurie komponentai leidžia juos pasiekti iš kitų gijų, tačiau turite atidžiai perskaityti dokumentus).
    • Prie kitų klientų reikia prisijungti per blokavimą (nes jei dvi gijos nori rašyti tam pačiam vartotojui, nieko gero nebus).

Pažiūrėkime į labai paprastą pavyzdį. Į bet kokią kliento užklausą atsakome natūra ir nutraukiame ryšį (toks kaip aido serveris).

Procedūra TForm1.IdTCPServer1Execute(AContext: TIdContext); var strText: String; begin //Gaukite eilutę iš kliento strText:= AContext.Connection.Socket.ReadLn; //Atsakyti AContext.Connection.Socket.WriteLn(strText); //Uždarykite ryšį su vartotoju AContext.Connection.Disconnect; galas;

AContext yra specialus objektas, kuriame yra viskas reikalinga informacija apie klientą. Pačiame idTcpServer yra šių kontekstų sąrašas ir jį galima pasiekti. Panagrinėkime sudėtingesnę transliaciją. Tai yra, siųskite visiems vieną žinutę

Var Klientai: TList; i:integer; begin // kvailas įrodymas :) jei ne Assigned(IdTCPServer1.Contexts) then exit; // gauti klientų sąrašą ir jį užrakinti Clients:=IdTCPServer1.Contexts.LockList; try for i:= 0 to Clients.Count-1 do try //LBuffer yra TBytes tipo ir jame yra paruoštų duomenų siuntimui //bet galima naudoti ir WriteLn. TIdContext(Clients[i]).Connection.IOHandler.Write(LBuffer); išskyrus // čia reikia pridėti logikos. Klientas gali atsijungti proceso pabaigoje; pagaliau // svarbu! sąrašas turi būti atrakintas, kitaip kiti metodai negalės eiti toliau Contexts.LockList IdTCPServer1.Contexts.UnlockList; galas; galas;

indie yra „BytesToString()“ ir „ToBytes()“, skirtus eilutę ir TIdBaitus konvertuoti vienas į kitą.

Sąrašas užrakintas, kad kiti negalėtų jo keisti. Priešingu atveju pats ciklas tampa daug sudėtingesnis. Ir, svarbiausia, nepamirškite atrakinti!

Liko paskutinis klausimas. Kaip išsiųsti pranešimą konkrečiam klientui. Norėdami tai padaryti, turite išmokti atpažinti ryšį. Tai galima padaryti keliais būdais – pažiūrėkite į IP/prievadą. Bet yra geriau. IdContext (tiksliau, jo protėvis idTask) turi TObject tipo duomenų savybę. Į jį galite įrašyti savo objektą ir saugoti visus reikiamus duomenis. Įprastas naudojimo atvejis būtų toks. Kai klientas ką tik prisijungė, šis laukas yra tuščias. Kai jis praeina vardo-slaptažodžio patikrinimą, sukuriame objektą (savo), išsaugome pavadinimą ir įrašome jį į ypatybę Data. Ir tada, kai reikia peržiūrėti prijungtus klientus, mes tiesiog jį perskaitome. Žinoma, jei vartotojų yra tūkstančiai, kiekvieną kartą peržiūrėti visus vartotojus bus brangu. Tačiau kaip tai padaryti optimaliau – kito didelio straipsnio tema.

Laiškų siuntimas ir gavimas naudojant Delphi yra gana paprastas. Norint siųsti laiškus, mums reikia idSMTP komponento iš „Indy Clients“ puslapio „Delphi“ komponentų paletėje.

Šis komponentas įgyvendina viską, ko reikia siuntimui El. paštas per SMTP protokolą (Simple Mail Transfer Protocol), naudojant 25 prievadą, per kurį siunčiamos komandos ir raidžių tekstas. El. laiškų siuntimo veiksmai yra tokie:

1) prisijungimas prie SMTP serverio per 25 prievadą;
2) laiško teksto parengimas, identifikuojant laiško siuntėją ir gavėją;
3) laiško siuntimas į SMTP serverį;

Įdėję idSMTP komponentą formoje, sukonfigūruokime jį. Prievadą galima sukonfigūruoti objektų tikrintuve, nustatant prievado ypatybę į 25, arba tą patį galite padaryti programos kode:

IdSMTP1.Portas:=25;

Prisijungimas prie serverio

Norėdami prisijungti prie SMTP serverio, kuris siųs mūsų paštą, turite nurodyti jo URL; mail.ru serveriui tai daroma taip:

IdSMTP1.Host:= ′smtp.mail.ru′;

Ryšys su serveriu atliekamas naudojant prisijungimo metodą:


procedura Connect(const Atimeout: Integer); nepaisyti;

kur ATimeout yra pasirenkamas parametras, nurodantis maksimalų laiką milisekundėmis, per kurį reikia laukti atsakymo iš SMTP serverio, po kurio bandymas užmegzti ryšį nutraukiamas.

Pavyzdžiui,

IdSMTP1.Prisijungti(5000);

Jei jungiantis prie serverio reikalingas autorizavimas, tada AuthenticationType ypatybės reikšmė turi būti nustatyta į atLogin, o objektų tikrintuve taip pat reikia apibrėžti Vartotojo vardo ypatybes (vartotojo vardą. Pavyzdžiui, Vartotojo vardas pašto dėžutę [apsaugotas el. paštas]- delphi) ir Slaptažodis (pašto dėžutės slaptažodis) arba atlikite tą patį programiškai:

IdSMTP1.AuthenticationType:=atLogin;
IdSMTP1.Vartotojo vardas:=′delphi′;
IdSMTP1.Password:='something';

IdSMTP1.AuthenticationType:=atNėra;

Panaudojus Connect metodą, reikia išanalizuoti loginę ypatybę Connected, kuri, jei ryšys sėkmingas, nustatoma į True. Po to galite išsiųsti pranešimą naudodami siuntimo metodą:

if Connected=True then IdSMTP1.Send(Msg);

Laiško struktūra

Siųsti metodas siunčia pranešimo turinį, kuris yra TIdMessage tipo struktūra;

Pranešimo struktūra Delphi įdiegta atskiru TIdMessage komponentu, esančiu Indy Misc komponentų paletėje ir atrodo taip

TidMessage TIdMessage struktūra apibrėžiama taip:

Manau, kad su pranešimo tema viskas aišku. Nuosavybė

Specialiai nustatomi elektroninių sąskaitų, kurioms adresuojamas laiškas, pavadinimai. Vardai turi būti nurodyti naudojant "," formos skyriklį, ty atskirti kableliu. Pavyzdžiui:

Pavyzdžiui,

Pavyzdžiui,

Ypatybėje Tekstas yra informacija iš abiejų ypatybių. Pranešimo turinys yra TStrings tipo objektas:

kur Kolekcija yra TIdMessageParts klasės, kuri yra programų rinkinys, objektas paštu.
konstanta TFileName tipo AFileName – tai įprasta teksto eilutė, nurodanti teisingą kelią į failą, pvz., "C:file.zip", numatytoji reikšmė yra ′′.

Taigi, tęsdami mūsų pavyzdį tokia eilute kaip

Dalintis