Delphi. Trimiterea de e-mailuri folosind Delphi

Dezvoltați un program care va oferi o interfață pentru utilizarea comenzii standard de transfer de mesaje Win2000/XP net send. Permiteți utilizatorului să specifice adresa destinatarului, textul mesajului și numărul de mesaje care urmează să fie trimise. De asemenea, oferă posibilitatea de a seta un blocare pentru primirea mesajelor de la alte computere.

Dezvoltarea formei

Crea proiect nou Delphi. Schimbați titlul formularului (proprietatea Legendă) la Net Sender. Plasați trei componente ale categoriei Etichetă una deasupra celeilalte de-a lungul marginii din stânga a formularului. Standardși setați proprietatea Caption la Adresă IP:, Mesaj: și Cantitate:.

Plasați o componentă Editare categorie lângă fiecare etichetă Standard. Denumiți cel mai înalt ip (proprietatea Name) și atribuiți proprietății Text valoarea 192.168.0.1.; denumește câmpul din mijloc txt și atribuie proprietatea Text unui text implicit al mesajului; Denumiți câmpul cel mai de jos cum și setați proprietatea Text la 1.

Sub componentele enumerate, plasați componenta Caseta de selectare a categoriei Standard. Denumiți-o sigur, setați proprietatea Caption la Dezactivați recepția mesajelor și proprietatea Verificat la True.

În partea de jos a formularului, plasați un buton (componenta categoriei Buton Standard), setându-și proprietatea Caption la Trimitere. Avem nevoie și de un cronometru (categoria componentă Timer Sistem), pentru care proprietatea Interval trebuie setată la 10.

Forma rezultată ar trebui să corespundă cu Fig. 15.1.

Orez. 15.1. Formular pentru programul căruia îi trimite mesaje retea locala

Dezvoltarea codului programului

În primul rând, să scriem propria noastră procedură de bombă, care va citi toate setările și va trimite un mesaj. Declarați această procedură ca membru privat al clasei de formulare:

Avem nevoie și de o variabilă globală i de tipul întreg:

Acum să creăm o implementare a procedurii bombe în secțiunea de implementare:

procedura TForm1.bomb();
dacă cum.Text= "" apoi cum.Text:= "1";
dacă ip.Text = "" atunci ip.Text:= "127.0.0.1";(dacă adresa IP nu este specificată, atunci trimitem la calculator local}
WinExec(PChar("net send " + ip.Text + """ + txt.Text + """), 0);//Trimite mesaj

Această procedură verifică dacă toate câmpurile obligatorii sunt completate. Dacă nu există text de mesaj, atunci setați semnul „!”; dacă nu este specificată o adresă IP, atunci trimitem un mesaj către computerul local cu adresa 127.0.0.1; dacă nu este specificat numărul de mesaje, atunci trimitem un mesaj. Mesajele sunt trimise folosind comanda standard net send, care are următoarea sintaxă:

net trimite mesaj adresa ip.

Acum să ne ocupăm de evenimentul OnTimer:

h: HWND;//stochează ID-ul ferestrei
dacă nu este sigur.Verificat atunci//dacă caseta de selectare nu este bifată
Timer1.Enabled:= False;//dezactivează monitorizarea
dacă este sigur.Verificat atunci//dacă caseta de selectare este bifată
//căutați ferestre de mesaje
h:= FindWindow(nil, „Serviciul de mesaje”);//închide toate ferestrele găsite
dacă h<>

Dacă caseta de selectare Dezactivare primire mesaje este bifată, atunci începem să monitorizăm ferestrele al căror titlu indică faptul că acesta este un mesaj și închidem toate ferestrele găsite. Dacă caseta de selectare nu este bifată, monitorizarea este dezactivată.

Pentru a putea comuta între aceste două moduri, trebuie să creați un handler de evenimente secure.OnClick:

dacă este sigur.Verificat atunci//dacă caseta de selectare este bifată...
Timer1.Enabled:= Adevărat;//...activează monitorizarea

Când butonul este apăsat Trimite vom numi pur și simplu procedura bombă:

Pentru a ușura viața utilizatorului, ne vom asigura că mesajul este trimis și prin apăsarea unei taste în orice câmp de introducere a textului. Pentru a face acest lucru, trebuie să creați un handler de evenimente OnKeyPress pentru fiecare dintre câmpuri. Codul pentru acest handler este pentru câmpul ip, care poate fi apoi atribuit câmpurilor txt și cum:

dacă cheie= #13 atunci//dacă este apăsată o tastă
bombă;//Trimite mesaj

Cod sursă modul complet

Codul complet al modulului de program pentru trimiterea de mesaje printr-o rețea locală este prezentat în Lista 15.1.

Lista 15.1. Modul de program pentru trimiterea de mesaje printr-o rețea locală

Ferestre, Mesaje, SysUtils, Variante, Clase, Grafică, Controale, Formulare, Dialoguri, StdCtrls, ExtCtrls;

procedura Timer1Timer(Expeditor: TObject);
procedura secureClick(Expeditor: TObject);
procedura ipKeyPress(Sender: TObject; var Key: Char);
procedura txtKeyPress(Sender: TObject; var Key: Char);
procedura howKeyPress(Sender: TObject; var Key: Char);
procedură Button1Click(Expeditor: TObject);


//verificați dacă este gol mesaj text
dacă txt.Text = "" atunci txt.Text:= "!";
//dacă nu este specificată cantitatea, atunci trimitem un mesaj
dacă cum.Text= "" atunci cum.Text:= "1";
dacă ip.Text = "" atunci ip.Text:= "127.0.0.1"; (dacă adresa IP nu este specificată, atunci o trimitem la computerul local)
//trimite numărul specificat de mesaje
pentru i:=1 la StrToInt(how.Text) do
WinExec(PChar("net send " + ip.Text + """ + txt.Text + """), 0); //Trimite mesaj

procedura TForm1.Timer1Timer(Expeditor: TObject);
h: HWND; //stochează ID-ul ferestrei
dacă nu este securizat.Bifat atunci //dacă caseta de selectare nu este bifată
Timer1.Enabled:= False; //dezactivează monitorizarea
dacă este securizat.Bifat atunci //dacă caseta de selectare este bifată
//căutați ferestre de mesaje
h:= FindWindow(nil, „Serviciul de mesaje”); //închide toate ferestrele găsite
dacă h<>0 apoi PostMessage(h, WM_QUIT, 0, 0);

procedura TForm1.secureClick(Expeditor: TObject);
dacă este securizat. Bifat atunci //dacă caseta de selectare este bifată...
Timer1.Enabled:= Adevărat; //...activează monitorizarea

procedura TForm1.ipKeyPress(Sender: TObject; var Key: Char);
dacă tasta = #13 atunci //dacă tasta este apăsată
bombă; //Trimite mesaj

procedura TForm1.Button1Click(Expeditor: TObject);

⊚ Toate fișierele de proiect și fișierul executabil al programului discutat se află pe CD-ul inclus cu cartea în folderul Capitolul 15.

Trimiterea mesajelor

Precum și sistem Windowsîși trimite mesajele către diferite ferestre, este posibil ca aplicația în sine să fie nevoită să facă schimb de mesaje între propriile ferestre și controale. Există mai multe moduri de a trimite mesaje: metoda PerForm() (care funcționează independent de API-ul Windows), precum și funcțiile API Win32 SendMessage() și PostMessage().

Metoda PerForm(), pe care toți descendenții clasei TControl o au:

funcția TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;

Pentru a trimite un mesaj către un formular sau un control, utilizați următoarea sintaxă:

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

Când PerForm() este apelat, controlul nu va reveni la programul apelant până când mesajul nu a fost procesat. Această metodă transmite mesajul fără a trece prin sistemul de mesagerie Windows API.

Funcțiile API SendMessage() și PostMessage() declarate în modul Windows în continuare cale:

funcția SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM;

lParam: LPARAM): LRESULT; stdcall;

funcția PostMessage(hWnd: HWND; Msg: UINT;

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

hWnd – mânerul ferestrei destinatarului mesajului; Msg – identificatorul mesajului; wParam și lParam – date suplimentare.

Funcția SendMessage(), ca și metoda PerForm(), trimite un mesaj direct către procedura ferestrei și așteaptă ca acesta să fie procesat, în timp ce funcția PostMessage() plasează mesajul într-o coadă de mesaje și returnează controlul programului care a apelat fără a aștepta rezultatele procesării.

Funcția SendMessage() returnează valoarea obținută ca urmare a procesării mesajului. Funcția PostMessage() - returnează o valoare care indică dacă mesajul a fost postat cu succes în coada de mesaje.

Mesajele utilizatorului

La dezvoltarea aplicațiilor, poate exista o situație în care o aplicație trebuie să trimită un mesaj special fie către ea însăși, fie către o altă aplicație pentru a efectua o acțiune. Pentru mesajele create de utilizator, Windows rezervă valori de la WM_USER la $7FFF.

Exemplu de mesaj personalizat:

TestMsg = WM_USER + 100; // ID mesaj

TForm1 = clasa (TForm)

// metoda de procesare a mesajelor:

procedura MyMessage(var Msg: TMessage); mesaj TestMsg;

procedura TForm1.MyMessage(var Msg: TMessage);

ShowMessage(„Mesajul TestMsg rulează”);

Msg.Result:= 1; // a returnat rezultatul

Exemple de trimitere a unui mesaj către formular:

dacă Form1.PerForm(TestMsg, 0, 0) = 1 atunci

dacă SendMessage(Form1.Handle, TestMsg, 0, 0) = 1 atunci

ShowMessage("Mesajul procesat cu succes");

dacă PostMessage(Form1.Handle, TestMsg, 0, 0) atunci

ShowMessage("Mesajul a fost plasat în coada de mesaje");

Evenimente Delphi

Un eveniment este ceva care se întâmplă în timp ce un program rulează. Din punctul de vedere al limbajului Delphi, un eveniment este o proprietate de tip procedural, iar valoarea lui este un pointer către o anumită metodă. Atribuirea unei valori unei astfel de proprietăți înseamnă specificarea adresei metodei care va fi executată la producerea evenimentului. Astfel de metode se numesc handlere de evenimente.

Utilizarea evenimentelor vă permite să adăugați funcționalități noi la o clasă existentă fără a crea o clasă descendentă.

Proprietățile evenimentului încearcă să înceapă cu cuvântul „Activat” urmat de numele evenimentului.

Relația dintre mesaje și evenimente

Delphi oferă o interfață pentru interacțiunea cu mesajele Windows, cel puțin unele dintre ele. Multe evenimente ale componentelor VCL sunt direct legate de mesaje tip Windows WM_XXX.

Secvența de procesare a mesajelor în Delphi
Toate clasele Delphi au încorporat un mecanism de gestionare a mesajelor numit handler de mesaje. O clasă primește un mesaj și apelează una dintr-un set de metode definite în funcție de mesajul primit. Dacă metoda corespunzătoare nu este definită, atunci handlerul implicit este apelat. Mai detaliat, acest mecanism funcționează după cum urmează.

Odată ce un mesaj este primit, sistemul de mesaje VCL face multă muncă preliminară pentru a-l procesa.

După cum sa menționat mai sus, mesajul este inițial procesat de metoda TApplication.ProcessMessage, care îl selectează din coada din bucla principală a mesajelor. În același timp, verifică conținutul câmpului FOnMessage (de fapt, verifică prezența unui handler pentru evenimentul OnMessage) și, dacă nu este gol, apelează handlerul pentru acest eveniment, iar dacă câmpul este gol (Nil), apoi apelează funcția API DispatchMessage(Msg). Acest lucru nu se întâmplă atunci când trimiteți un mesaj.

Dacă handlerul de evenimente OnMessage nu este definit, funcția API DispatchMessage este apelată pentru a procesa mesajul primit, care transmite mesajul către procedura ferestrei principale.

Să luăm în considerare ciclul de procesare a mesajelor după ce acesta ajunge în fereastra principală a componentei. Secvența de procesare a mesajelor este prezentată în figura următoare:

Se poate observa că mesajul este transmis către MainWndProc, apoi către WndProc, apoi către Dispatch, apoi către DefaultHandler.

Delphi oferă o metodă principală non-virtuală MainWndProc(Var Message: TMessage) pentru fiecare fereastră de componentă. Conține un bloc de gestionare a excepțiilor, care transmite structura mesajului de la Windows către o metodă virtuală definită în proprietatea WindowProc. Cu toate acestea, această metodă tratează orice excepții care apar în timpul procesării mesajelor prin apelarea metodei HandleException a aplicației. Din acest moment, puteți asigura o procesare specială a mesajului, dacă este necesar de logica programului dumneavoastră. De obicei, în acest moment, procesarea este modificată pentru a preveni procesarea VCL standard.

În mod implicit, valoarea proprietății WindowProc a unui obiect este inițializată la adresa metodei virtuale WndProc. În continuare, dacă nu există interceptori de mesaje înregistrate de tip TWindowHook, WndProc apelează metoda virtuală TObject.Dispatch, care, folosind câmpul Msg al structurii mesajului primit, determină dacă mesajul se află în lista de gestionare a mesajelor pentru acest obiect. Dacă obiectul nu procesează mesajul, este examinată lista de gestionare a mesajelor strămoși. Dacă o astfel de metodă este găsită în cele din urmă, aceasta este apelată; în caz contrar, metoda virtuală DefaultHandler este apelată.

În cele din urmă, mesajul ajunge la procedura de procesare corespunzătoare, unde se efectuează prelucrarea destinată acestuia. Prin utilizarea cuvânt cheie Moștenit, este trimis în continuare spre procesare în strămoși. Apoi, mesajul merge și la metoda DefaultHandler, care procesează mesajul final și îl transmite procedurii DefWindowProc (DefMDIProc) pentru procesarea standard Windows.

Procesarea mesajelor cu componente Delphi
Prin urmare, scurta descriere Secvența de procesare a mesajelor este următoarea. Toate mesajele trec inițial prin metoda a cărei adresă este specificată în proprietatea WindowProc. În mod implicit, aceasta este metoda WndProc. După care sunt separate și trimise după propriile metode de mesaje. La sfârșit, ele converg din nou în metoda DefaultHandler, dacă nu au fost procesate mai devreme sau handler-ul moștenit (Inherited) este apelat în handlere. Prin urmare, Componentele Delphi Există următoarele opțiuni pentru procesarea mesajelor:
a) Înainte ca orice handler de mesaje să vadă mesajul. În acest caz, fie trebuie să înlocuiți adresa metodei în proprietatea WindowProc, fie să înlocuiți metoda TControl.WndProc.
Proprietatea WindowProc este declarată după cum urmează:

Toure TWndMethod= Procedură(Mesaj Var: TMessage) De Obiect;
Proprietate WindowProc: TWndMethod;

De fapt, folosind proprietatea WindowProc, puteți crea o metodă de tip TWndMethod și înlocuiți temporar metoda originală cu cea creată, însă, deoarece adresa metodei din proprietatea WindowProc nu este stocată, trebuie mai întâi să salvați adresa metoda originală WndProc, astfel încât să poată fi restaurată ulterior.

OldWndProc: TWndMethod;
procedura NewWndProc(var Mesaj: TMessage);
procedura TForm1.NewWndProc(var Mesaj: TMessage);
var Ch: char;
ÎNCEPE
if message.Msg= WM_MOUSEMOVE atunci începe
Edit1.Text:=’x=’+inttostr(message.LParamLo)+’, y=’+inttostr(message.LParamHi);
Sfârşit
else WndProc(Mesaj);
Sfârşit;

procedura TForm1.FormCreate(Sender: TObject);
ÎNCEPE
OldWndProc:=WindowProc;
Sfârşit;

procedura TForm1.CheckBox1Click(Expeditor: TObject);
ÎNCEPE
Dacă CheckBox1.Checked, atunci WindowProc:= NewWndProc
else WindowProc:= OldWndProc;
Sfârşit;

b) În interiorul metodei mesajului corespunzătoare.
Să dăm un alt exemplu asemănător.
Utilizează mesajul trimis către componente pentru a redesena WMPAINT.

În clasa TForml, vom declara această metodă în scopul de a o suprascrie și vom prezenta implementarea metodei mesajului suprascris:

Ture TForml=Class(TForm)
… // Toate celelalte declarații necesare
Protejat
Procedura WMPaint(Var Msg: TWMPaint); Mesaj WM_PAINT; Sfârşit;
Procedura TForml.WMPaint(Var Msg: TWMPaint); ÎNCEPE
If CheckBox1.Checked Then ShowMessage(‘O6pa6ot message!’);
Mostenit;
Sfârşit;

Când suprascrieți anumiți handler de mesaje, este întotdeauna o idee bună să apelați Inherited pentru a efectua procesarea de bază a mesajelor pe care o necesită Windows.

c) După fiecare dintre metodele corespunzătoare mesajului îl vede.

În acest caz, este necesar să se suprascrie DefaultHandler.

procedura DefaultHandler(var Message); trece peste;
procedura TForm1.DefaultHandler(var Message);
var i:intger;
ÎNCEPE
dacă Cardinal(Message)=WM_defh atunci
pentru i:= 0 până la 10 începe
bip;
somn (100);
Sfârşit
altfel
mostenit;
Sfârşit;

procedura TForm1.Button5Click(Expeditor: TObject);
ÎNCEPE
SendMessage(Handle,WM_defh,0,0);
Sfârşit;

Relația dintre mesaje și evenimente
Multe evenimente VCL Delphi sunt direct legate de mesajele Windows. Sistemul de ajutor Delphi listează aceste potriviri. Ele sunt prezentate în Tabelul 1.

tabelul 1

Eveniment VCLmesaj WindowsEveniment VCLmesaj Windows
OnActivateWM_ACTIVATEOnKeyPressWM_CHAR
OnClickWM_LBUTTONDOWNOnKeyUpWM_KEYUP
OnCreateWM_CREATEOnPaintWM_PAINT
OnDblClickWM_LBUTTONDBLCLKOnResizeWM_SIZE
OnKeyDownWM_KEYDOWNOnTimerWM_TIMER

Nu ar trebui să creați handlere de mesaje dacă există un eveniment predefinit pentru acesta. În astfel de cazuri, este logic să folosiți gestionarea evenimentelor, deoarece are mai puține restricții.

undeva ca asta

IdTCPClient1.Host:= "127.0.0.1"; IdTCPClient1.Connect;// conectat IdTCPClient1.Socket.WriteLn("comanda"); // a trimis comanda de comandă și fluxul de linie // Așteptați răspunsul și închideți conexiunea txtResults.Lines.Append(IdTCPClient1.Socket.ReadLn); IdTCPClient1.Deconectare;

în acest caz, comanda este doar text cu un avans de linie. Acest lucru face mult mai ușor să primiți comanda din cealaltă parte (doar ReadLn). În cazul general, trebuie să veniți cu (sau să utilizați un protocol gata făcut).

deasupra era un client. Și acum serverul. Cu serverul, totul este puțin mai complicat. Este clar că este normal ca un server să servească nu doar un client, ci mai mulți. Și există mai multe „scheme” pentru aceasta.

    Clasic - un client - un fir. Schema este ușor de codificat și intuitivă. Este bine paralelizat între nuclee. Dezavantajul este că de obicei este foarte dificil să creezi multe fire, iar acest lucru limitează numărul de clienți. Pentru programele pe 32 de biți, limita superioară este undeva în jur de 1500 (o mie și jumătate) de fire per proces. Dar, în acest caz, costurile generale de schimbare a acestora pot „mânca” întregul procent. Aceasta este schema folosită în indy.

    Al doilea clasic este toți clienții pe un fir. Această schemă este adesea mai complexă de codat, dar cu abordarea corectă vă permite să păstrați 20-30k de „utilizatori lenți” fără încărcare practic pe kernel. Un avantaj puternic al acestei scheme este că vă puteți descurca fără mutexuri și alte primitive de sincronizare. Această schemă este folosită de NodeJS și de clasele standard pentru lucrul cu rețeaua în Qt.

    Amestecat. În acest caz, sunt create mai multe fire, fiecare dintre ele deservește un anumit număr de clienți. Cel mai dificil de codificat, dar vă permite să utilizați la maximum resursele hardware.

Cum se face în Indy. Serverul Indy tcp creează un fir separat (TThread) pentru fiecare conexiune și munca in continuare cu clientul mergând în ea. Indy ascunde acest lucru frumos, lăsând utilizatorului doar să implementeze metoda IdTCPServer.onExecute. Dar, așa cum am spus mai sus, această metodă este lansată într-un thread separat și este personală pentru fiecare client. Aceasta înseamnă următoarele:

  • în această metodă poți apela sleep și doar un client va aștepta. Toate celelalte vor funcționa (dar dacă apelați somn în gestionarea de clic pe buton, atunci rezultatul este cunoscut)
    • Este mai bine să accesați variabilele globale numai prin primitive de sincronizare.
    • Trebuie să accesați elementele gui cu atenție și corect. Este mai bine să nu o faceți direct (unele componente permit accesul la ele din alte fire, dar trebuie să citiți cu atenție documentele).
    • Trebuie să accesați alți clienți prin blocare (pentru că dacă două fire vor să scrie aceluiași utilizator, nu va ieși nimic bun din asta).

Să ne uităm la un exemplu foarte simplu. Răspundem la orice solicitare a clientului în natură și închidem conexiunea (un fel de server echo).

Procedura TForm1.IdTCPServer1Execute(AContext: TIdContext); var strText: șir; begin //Primește un șir de la client strText:= AContext.Connection.Socket.ReadLn; //Răspunde AContext.Connection.Socket.WriteLn(strText); //Închide conexiunea cu utilizatorul AContext.Connection.Disconnect; Sfârşit;

AContext este un obiect special care conține toate informatie necesara despre client. Însuși idTcpServer conține o listă a acestor contexte și poate fi accesat. Să luăm în considerare o emisiune mai complexă. Adică trimiteți un mesaj tuturor

Var Clienti: TList; i:întreg; începe // probă :) dacă nu este atribuit (IdTCPServer1.Contexts) atunci ieși; // obțineți o listă de clienți și blocați-o Clients:=IdTCPServer1.Contexts.LockList; try for i:= 0 to Clients.Count-1 do try //LBuffer este de tip TBytes și conține date pregătite pentru trimitere //dar poate fi folosit și WriteLn. TIdContext(Clients[i]).Connection.IOHandler.Write(LBuffer); cu excepția // trebuie să adăugați logică aici. Clientul se poate deconecta la sfârșitul procesului; in sfarsit // important! lista trebuie deblocată, altfel alte metode nu vor putea merge mai departe Contexts.LockList IdTCPServer1.Contexts.UnlockList; Sfârşit; Sfârşit;

indie conține BytesToString() și ToBytes() pentru conversia String și TIdBytes unul în celălalt.

Lista este blocată, astfel încât alții să nu o poată modifica. În caz contrar, ciclul în sine devine mult mai complicat. Și cel mai important, nu uitați să deblocați!

A mai rămas o ultimă întrebare. Cum se trimite un mesaj unui anumit client. Pentru a face acest lucru, trebuie să învățați să identificați conexiunea. Acest lucru se poate face în mai multe moduri - uitați-vă la IP/port. Dar există mai bine. IdContext (mai precis, strămoșul său idTask) are o proprietate Data de tip TObject. Puteți să vă scrieți obiectul în el și să stocați acolo toate datele necesare. Un caz de utilizare tipic ar fi următorul. Când clientul tocmai sa conectat, acest câmp este gol. Când trece de verificarea nume-parolă, creăm un obiect (al nostru), salvăm numele acolo și îl scriem în proprietatea Data. Și apoi, când trebuie să parcurgeți clienții conectați, îl citim pur și simplu. Desigur, dacă există mii de utilizatori, va fi costisitor să vezi toți utilizatorii de fiecare dată. Dar cum să faci asta mai optim este subiectul unui alt articol mare.

Trimiterea și primirea e-mailurilor este destul de simplă folosind Delphi. Pentru a trimite mail, avem nevoie de componenta idSMTP din pagina Clienti Indy a paletei de componente Delphi.

Această componentă implementează tot ce este necesar pentru a trimite E-mail prin protocolul SMTP (Simple Mail Transfer Protocol), folosind portul 25, prin care sunt trimise comenzile și textul scrisorii. Pașii pentru trimiterea e-mailului sunt următorii:

1) conexiune la serverul SMTP pe portul 25;
2) pregătirea corpului scrisorii, identificarea expeditorului și destinatarului scrisorii;
3) trimiterea unei scrisori către serverul SMTP;

După ce ați plasat componenta idSMTP pe formular, să o configuram. Portul poate fi configurat în inspectorul de obiecte setând proprietatea Port la 25 sau puteți face același lucru în codul programului:

IdSMTP1.Port:=25;

Conexiune la server

Pentru a vă conecta la serverul SMTP care va trimite e-mailul nostru, trebuie să specificați URL-ul acestuia; pentru serverul mail.ru acest lucru se face după cum urmează:

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

Conexiunea la server se face folosind metoda Connect:


procedura Connect(const ATimeout: Integer); trece peste;

unde ATimeout este un parametru opțional care specifică timpul maxim în milisecunde pentru așteptarea unui răspuns de la serverul SMTP, după care încercarea de a stabili o conexiune este încheiată.

De exemplu,

IdSMTP1.Connect(5000);

Dacă este necesară autorizarea la conectarea la server, atunci valoarea proprietății AuthenticationType trebuie setată la atLogin, în timp ce în inspectorul de obiecte trebuie să definiți și proprietățile Username (nume utilizator. De exemplu, Username). cutie poștală [email protected]- delphi) și Password (parola căsuței poștale) sau procedați la fel în mod programatic:

IdSMTP1.AuthenticationType:=atLogin;
IdSMTP1.Nume utilizator:=′delphi′;
IdSMTP1.Parola:='ceva';

IdSMTP1.AuthenticationType:=atNone;

După utilizarea metodei Connect, trebuie să analizați proprietatea logică Connected, care, dacă conexiunea este reușită, este setată la True. După aceasta, puteți trimite un mesaj folosind metoda Trimitere:

if Connected=True, atunci IdSMTP1.Send(Msg);

Structura literei

Metoda Send trimite corpul mesajului, care este o structură de tip TIdMessage;

Structura mesajului este implementată în Delphi de o componentă separată TIdMessage situată pe paleta de componente Indy Misc și arată astfel

TidMessage Structura TIdMessage este definită după cum urmează:

Cred că totul este clar cu subiectul mesajului. Proprietate

Numele conturilor electronice cărora le este adresată scrisoarea sunt determinate în mod specific. Numele trebuie specificate folosind un separator de forma ",", adică separate prin virgulă. De exemplu:

De exemplu,

De exemplu,

Proprietatea Text conține informații din ambele proprietăți. Corpul mesajului este un obiect de tip TStrings:

unde Collection este un obiect al clasei TIdMessageParts, care este o colecție de aplicații către e-mail.
constant AFileName de tip TFileName - este un șir de text obișnuit care indică calea corectă către fișier, de exemplu „C:file.zip”, valoarea implicită este „”.

Astfel, continuând exemplul nostru cu o linie like

Acțiune