Programarea cu și

Teoria prtokola SMTP.
Uneori este cel mai simplu mod de a trimite un mesaj
trimiteți-l singur la serverul de e-mail. Trecerea de la MFC și altele






clasele și funcțiile de heap o fac mai ușor atunci când nu
Aceasta necesită flexibilitatea aplicației în termenii unui document multi-document
programare.

În acest articol voi arăta cât de ușor este să folosiți protocolul SMTP,
pentru a trimite un e-mail.

Secvența evenimentelor pentru trimiterea mesajelor SMTP:






- Salutați-vă de serverul SMTP.
- Spuneți serverului SMTP care ar trebui să primească mesajul.
- Spuneți serverului SMTP de la care se află acest mesaj.
- Informați serverul SMTP al mesajului.
- Spuneți la revedere serverului SMTP.

Puteți comunica cu serverul SMTP utilizând comenzi
HELO, MAIL, RCPT, DATE și QUIT. Răspunsurile serverului SMTP sunt
dintr-un răspuns numeric cu trei cifre urmat în conformitate cu
mesajul de răspuns citibil de către om a serverului SMTP. În cazul în care
răspunsul numeric este mai mic de 400, serverul SMTP nu a întâlnit niciunul
probleme în timpul întreținerii cererii. Dacă răspunsul numeric este mai mare de 400,
Serverul SMTP sa confruntat cu probleme, a căror soluție este necesară
face o decizie.

Mai jos este un exemplu de sesiune cu un server SMTP.
Conexiunea începe, cu comanda HELO. Aceasta informează serverul SMTP,
că voi folosi limba SMTP (deși este disponibilă o versiune îmbunătățită mai recentă)
versiune a limbajului serverului SMTP ESMTP). Pentru a activa ESMTP,
Puteți începe cu comanda EHLO în loc de HELO.) Următorul pas este să
pentru a informa serverul SMTP al expeditorului e-mail-ului, apoi destinatarul,
apoi mesajul însuși, apoi închideți conexiunea.

clientul trimite cererea: HELO somehost.somedomain.com
Serverul SMTP răspunde: 250 OK

clientul trimite cererea: MAIL FROM:
Serverul SMTP răspunde: 250 OK

clientul trimite o cerere: RCPT TO:
Serverul SMTP răspunde. 250 OK

clientul trimite o cerere: RCPT TO:
Serverul SMTP răspunde. 550 Nu există un astfel de utilizator aici

clientul trimite o cerere: RCPT TO:
Serverul SMTP răspunde. 250 OK

clientul trimite cererea: DATA
Serverul SMTP răspunde. 354 Începeți intrarea în corespondență; încheie cu .

clientul trimite cererea: Tot ce vreau pentru Crăciun.
clientul trimite o cerere. etc. etc. etc.
clientul trimite o cerere: .
Serverul SMTP răspunde. 250 OK

Toate comenzile sunt însoțite de răspunsuri de la serverul SMTP.
RĂSPUNS LA RFC-821 pentru o explicație detaliată a structurilor de răspuns.

HELO merge de obicei la linie separat. Aceasta identifică expeditorul
și informează serverul SMTP că comenzile viitoare sunt comenzi SMTP,
nu ESMTP. Notați în cuvântul HELO o literă "L"

MAIL DE LA: anunță un nou mesaj de poștă electronică și poate
Folosit în interiorul unui mesaj existent pentru a fi afișat
atașament la scrisoare.

RCPT TO: definește toți destinatarii mesajului.

DATA este trimisă separat la linie. După ce trimiteți echipa
DATA, serverul SMTP va trimite codul de back 354, `enter mail and
completați mesajul "." cu o nouă linie `.
După citirea acestui răspuns inițial,
Puteți începe mesajul real.
Cu toate acestea, nu puteți obține un alt răspuns de la serverul SMTP, până la
Nu ați terminat secțiunea de date cu o perioadă (.) Pe o linie separată.
În secțiunea DATE, utilizați următoarele subrubrici,
pentru a formata mesajul: FROM. LA. CC. CCA. DATE. și SUBJECT.

QUIT implică faptul că serverul SMTP trebuie să trimită "250 OK" ca răspuns,
apoi închideți canalul de transmisie. Programul tău client nu ar trebui să fie
întrerupeți legătura până când primește un răspuns "250 OK".

RSET (Reset Session) resetează mesajul curent și se șterge
expeditorul total, destinatarul, datele și birourile guvernamentale.

HELP explică utilizarea comenzii în formă ușor de citit de om.

NOOP (fără acțiune) face altceva decât returnarea răspunsului "250 OK".

Interpretarea răspunsurilor
După conectarea la serviciul SMTP (serviciu), așteptați un răspuns "220"
de la serverul SMTP. După aceea, așteptați un răspuns pentru fiecare echipă,
trimis la serverul SMTP. Fiecare răspuns este în format de trei
cifre numerice urmate de un spațiu sau de o cratimă după care
există un mesaj text care poate fi citit de om
din acest cod. Un cod din trei cifre conține toate informațiile necesare
pentru procesarea răspunsului codificat. După cum sa menționat anterior,
codul care este mai mic de 400 indică succesul cererii,
și un cod mai mare de 400 indică faptul că au apărut probleme.

Răspunsurile sunt formate după cum urmează:
XYZ <пробел или дефис> Mesajul tău

X are un răspuns bun, rău sau incomplet și poate avea următoarele valori:

"1": răspuns preliminar pozitiv (nu este folosit deloc)
"2": răspuns pozitiv la finalizare
"3": răspuns provizoriu pozitiv
"4": răspunsul finalizării tranzitului negativ
"5": răspuns negativ la încheierea negativă

O cratimă indică faptul că răspunsul face parte din răspunsul la o interogare cu mai multe linii.
Spațiul indică faptul că răspunsul este răspunsul la ultimul rând al interogării.
Mesajul text este destinat exclusiv scopurilor informaționale,
și poate fi ignorată de agentul dvs. de răspuns.

Creați o aplicație de copiere a corespondenței.
Când creați un nou proiect, alegeți ca acesta să fie MFC AppWizard (exe)
și se va numi smtp. Alegeți această aplicație bazată pe dialog, în
Următoarea fereastră este bifată pentru a confirma utilizarea Windows Socket.
Apoi faceți clic pe Următorul> la oprire. Deschideți fereastra de dialog de editare și obțineți
despre o astfel de opera de arta.

* Faceți dublu clic pe butonul Trimitere poștă și scrieți următorul text

// definește MySocket CSocket; în secțiunea de variabile globale

void CMy1again1Dlg :: OnButton1 ()
<
// TODO: Adăugați aici codul dvs. de notificare de control

caracterul responsabil [1024];
int res_len;
char CRLF [2]; CRLF [0] = 10; CRLF [1] = 13;
// fiecare comandă pentru serverul SMTP ar trebui
// sfârșit și anume rulând succesiv 10 și 13

char * host = caracter nou [m_host.LineLength () + 1];
// aloca spațiu în memorie pentru variabila gazdă
m_host.GetLine (0, gazdă, m_host.LineLength ());
/ / scrieți la tampon Host content HostBox Host
gazdă [m_host.LineLength ()] = 0;
// Gazda trebuie să fie un șir ASCIIZ prin urmare
// atașați la sfârșitul valorii zero

char * destinatar = char nou [m_recipient.LineLength ()];
// aloca spațiu în memorie pentru variabila "WHO"
m_recipient.GetLine (0, destinatar, m_recipient.LineLength ());
// scrieți conținutul EditBox la tamponul "WHOM"
// Destinatar

char * de la = char nou [m_from.LineLength ()];
// alocați un loc în memorie pentru variabila "FROM WHOM"
m_from.GetLine (0, de la, m_from.LineLength ());
// scrieți la tamponul "FROM WHOM" conținutul EditBox
// Din

dacă (! MySocket.Create ()) MessageBox ("eroare de creare socket", "", MB_OK);
// Creați un soclu
dacă (! MySocket.Connect (gazdă, 25)) MessageBox ("eroare conectare la socket", "", MB_OK);
// Încercați să atașați serverul de e-mail introdus în câmpul Gazdă
altfel <
res_len = MySocket.Receive (răspuns, sizeof (responce));
// acceptați răspunsul de la serverul SMTP.
responce [res_len] = 0;
m_log.ReplaceSel (răspuns);
// afișați răspunsul în fereastra jurnalului
>

MySocket.Send ("HELO", 5);
MySocket.Send (gazdă, m_host.LineLength ());
MySocket.Send (CRLF, 2);
// trimiteți comanda "HELO someposthost.somedomain "
res_len = MySocket.Receive (răspuns, sizeof (responce));
// acceptați răspunsul de la serverul SMTP.
responce [res_len] = 0;
m_log.ReplaceSel (răspuns);
// afișați răspunsul în fereastra jurnalului

MySocket.Send ("MAIL FROM: <",12);
MySocket.Send (de la, m_from.LineLength ());
MySocket.Send (">", 1);
MySocket.Send (CRLF, 2);
// trimiteți comanda "MAIL FROM: "
res_len = MySocket.Receive (răspuns, sizeof (responce));
// acceptați răspunsul de la serverul SMTP.
responce [res_len] = 0;
m_log.ReplaceSel (răspuns);
// afișați răspunsul în fereastra jurnalului

MySocket.Send ("RCPT TO: <",10);
MySocket.Send (destinatar, m_recipient.LineLength ());
MySocket.Send (">", 1);
MySocket.Send (CRLF, 2);
// trimiteți comanda "RCPT TO: "
res_len = MySocket.Receive (răspuns, sizeof (responce));
// acceptați răspunsul de la serverul SMTP.
responce [res_len] = 0;
m_log.ReplaceSel (răspuns);
// afișați răspunsul în fereastra jurnalului

MySocket.Send ("DATA \ n", 5);
// trimiteți comanda "DATA" "
res_len = MySocket.Receive (răspuns, sizeof (responce));
// acceptați răspunsul de la serverul SMTP.
responce [res_len] = 0;
m_log.ReplaceSel (răspuns);
// afișați răspunsul în fereastra jurnalului

// ------------------------------------------------ -------------
// vine blocul care trimite corpul mesajului.
int y = m_body.GetLineCount ();
// luați numărul de linii ale textului introdus
pentru (int i = 0; i

int l_lenght = m_body.LinieLength (m_body.LineIndex (i));
// calcula numărul de sigilii din linia curentă
// și dacă șirul nu este gol atunci
dacă (l_lenght! = 0)<
char * curent_line = noul char [l_lenght + 1];
// creați un buffer temporar
m_body.GetLine (i, curent_line, lungime);
/ / scrieți la tamponul temporar următoarea linie
curent_line [l_ungime] = 10;

MySocket.Send (curent_line, lungime + 1);
// trimiteți serverul următorul rând

șterge curent_line;
// ștergeți buffer-ul temporar
>
altfel
// dacă linia este goală, trimitem serverului un feed de linie

MySocket.Send (".", 1); MySocket.Send (CRLF, 2);
// ar trebui să fie desemnat și sfârșitul dat al datelor
// point and cu o linie nouă.
res_len = MySocket.Receive (răspuns, sizeof (responce));
// acceptați răspunsul de la serverul SMTP.
responce [res_len] = 0;
m_log.ReplaceSel (răspuns);
// afișați răspunsul în fereastra jurnalului

MySocket.Send ("QUIT \ n", 5);
// trimiteți comanda de ieșire din conexiune.
MySocket.Close ();
// închideți soclul

ștergeți gazda;
șterge destinatarul;
șterge din;
// ștergeți variabilele temporare
>

* Faceți dublu clic pe butonul Quit și scrieți următorul text

void CServerDlg :: OnCancel ()
<
// TODO: adăugați o curățare suplimentară aici
MySocket.Close (); // Închideți soclul
CDialog :: OnCancel (); // Închideți programul
>

În loc de închisoare.
* Asta e tot, doar aici sunt conceptele de implementare
client SMTP server. Apoi, alegeți dacă vă convine sau nu.
Asigurați-vă că vă uitați la descrierile pentru toate funcțiile utilizate aici.

<<ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ







Articole similare

Trimiteți-le prietenilor: