Programozás a és a

Az SMTP prtokola elmélete.
Néha az üzenet elküldésének legegyszerűbb módja
küldje el magának a levélkiszolgálónak. Az MFC és mások megkerülése
a kupacok és funkciók kicsit könnyebbé teszik, ha nem
Ez megköveteli az alkalmazás rugalmasságát több dokumentum esetében
programozás.

Ebben a cikkben megmutatom, milyen egyszerű az SMTP protokoll használata,
e-mailt küldeni.

Az SMTP-üzenetek küldésének eseménysorozata:
- Köszönjük az SMTP szervert.
- Mondja meg az SMTP kiszolgálónak, hogy kinek kell megkapnia az üzenetet.
- Mondja el, hogy az SMTP-kiszolgáló melyik ez az üzenet.
- Tájékoztassa az üzenet SMTP szerverét.
- Búcsúzzon az SMTP szerverre.

A parancsokkal kommunikálhat az SMTP szerverrel
HELO, MAIL, RCPT, DATA, és QUIT. Az SMTP szerver válaszai:
három számjegyből álló numerikus válaszból, amelyet a
az SMTP-kiszolgáló emberi olvasható válaszüzenetét. Ha a
a numerikus válasz kevesebb mint 400, az SMTP szerver nem találkozott
probléma a kérelem karbantartása közben. Ha a numerikus válasz nagyobb, mint 400,
Az SMTP-szerver problémákba ütközött, amelyek megoldásához szükség van
döntsön.

Az alábbiakban egy SMTP-kiszolgálóval folytatott munkamenet példája látható.
A kapcsolat elindul, a HELO paranccsal. Ez tájékoztatja az SMTP szervert,
hogy használni fogom az SMTP nyelvet (bár új, továbbfejlesztett változat áll rendelkezésre
az ESMTP SMTP szerver nyelvének verziója). Az ESMTP aktiválásához,
A HELO helyett az EHLO paranccsal indulhat.) A következő lépés az
hogy tájékoztassa az SMTP-kiszolgálót az e-mail küldőjének, akkor a címzett,
majd maga az üzenet, majd zárja be a kapcsolatot.

az ügyfél elküldi a kérelmet: HELO somehost.somedomain.com
Az SMTP szerver válaszol: 250 OK

az ügyfél elküldi a kérelmet: MAIL FROM:
Az SMTP szerver válaszol: 250 OK

az ügyfél kérést küld: RCPT TO:
Az SMTP-kiszolgáló válaszol. 250 OK

az ügyfél kérést küld: RCPT TO:
Az SMTP-kiszolgáló válaszol. 550 Nincs ilyen felhasználó itt

az ügyfél kérést küld: RCPT TO:
Az SMTP-kiszolgáló válaszol. 250 OK

az ügyfél elküldi a kérelmet: DATA
Az SMTP-kiszolgáló válaszol. 354 Levél indítása; véget ér .

az ügyfél elküldi a kérelmet: minden, amit karácsonyra akarok.
az ügyfél kérést küld. stb stb stb
az ügyfél kérést küld: .
Az SMTP-kiszolgáló válaszol. 250 OK

Az összes parancsot az SMTP szerver válaszai kísérik.
Lépjen be az RFC-821-re a válasz struktúrák részletes magyarázatához.

A HELO általában külön vonalba kerül. Ez azonosítja a feladót
és tájékoztatja az SMTP szervert arról, hogy a közelgő parancsok SMTP parancsok,
nem ESMTP. Megjegyzés a HELO szóban egy betűvel "L"

MAIL FROM: új e-mail üzenetet hirdet, és tud
Meglévő üzeneten belül jelenik meg
a levélhez való csatolás.

RCPT TO: meghatározza az üzenet összes címzettjét.

Az adatokat külön küldjük el a vonalra. Miután elküldte a csapatot
DATA, az SMTP szerver 354-es kódot küld vissza, `írja be az e-mailt és a
töltse ki az üzenetet "." új sorral ".
Miután elolvasta ezt a kezdeti választ,
Elindíthatja az aktuális üzenetet.
Azonban nem kaphat másik választ az SMTP szerverről, amíg nem
Ön nem fejezte be az adatszakaszt egy időtartammal (.) Külön sorban.
Az ADAT részen belül használja a következő alfejezeteket,
formázza az üzenetet: FROM. TO. CC. BCC. DATE. és TÁRGY.

A QUIT azt jelenti, hogy az SMTP-kiszolgáló válaszként "250 OK" -t küld,
majd zárja be az átviteli csatornát. Ügyfélprogramja nem
szakítsa meg a kapcsolatot, amíg "250 OK" választ nem kap.

Az RSET (Reset Session) újra beállítja az aktuális üzenetet, és törli
teljes feladó, címzett, adatok és kormányzati asztalok.

A HELP megmagyarázza a parancs használatát emberileg olvasható formában.

A NOOP (No Action) nem más, mint a "250 OK" válasz visszaküldése.

Válaszok értelmezése
Miután csatlakozott az SMTP szolgáltatáshoz (szolgáltatás), várjon "220" választ
az SMTP szerverről. Ezután válaszoljon minden csapatra,
elküldeni az SMTP szerverre. Minden válasz három formátumú
numerikus számjegyek, amelyeket utána egy szóköz vagy egy kötőjel követ
van egy megfelelő, emberi olvasható szöveges üzenet
e kódot. A háromjegyű kód tartalmazza az összes szükséges információt
a kódolt válaszfeldolgozáshoz. Mint korábban említettük,
a kód kevesebb, mint 400 jelzi a kérés sikerét,
és a 400-nál nagyobb kód azt jelzi, hogy problémák merültek fel.

A válaszok formátuma a következő:
XYZ <пробел или дефис> Az üzeneted

X-nek jó, rossz vagy hiányos reakciója van, és a következő értékekkel rendelkezhet:

"1": pozitív előzetes válasz (egyáltalán nem használják)
"2": pozitív válasz
"3": pozitív időközi válasz
"4": tranzitív negatív válasz
'5': állandó negatív befejezési válasz

Egy kötőjel azt jelzi, hogy a válasz a többsoros lekérdezésre adott válasz része.
A szóköz azt jelzi, hogy a válasz a lekérdezés utolsó sorára adott válasz.
A szöveges üzenet csak tájékoztató jellegű,
és a válaszkezelője figyelmen kívül hagyhatja.

Készítsen levéltörő alkalmazást.
Új projekt létrehozásakor válassza ki, hogy ez lesz az MFC AppWizard (exe)
és ez lesz smtp. Válassza ezt a párbeszédalapú alkalmazást, a következő helyen:
A következő ablak kinyomtatva megerősíti a Windows Socket használatát.
Ezután kattintson a Next> gombra. Nyissa meg a szerkesztés párbeszédpanelt, és nyissa meg
egy ilyen műalkotásról.

* Kattintson duplán a Levél küldése gombra és írja be a következő szöveget

// határozza meg a MySocket CSocket; a globális változók szakaszában

void CMy1again1Dlg :: OnButton1 ()
<
// TODO: Adja hozzá az ellenőrző értesítési kezelő kódját itt

char válasz [1024];
int res_len;
char CRLF [2]; CRLF [0] = 10; CRLF [1] = 13;
// minden parancs az SMTP szerver számára
// end azaz egymás után futó 10 és 13

char * host = új karakter [m_host.LineLength () + 1];
// kiosztja a memóriában a helyet a gazdagép számára
m_host.GetLine (0, host, m_host.LineLength ());
// írja a puffer Host tartalom HostBox Host
fogadó [m_host.LineLength ()] = 0;
// A gazda tehát ASCIIZ karakterláncnak kell lennie
// add hozzá a nulla végéhez

char * címzett = új karakter [m_recipient.LineLength ()];
// kiosztja a memóriában a "WHO" változót
m_recipient.GetLine (0, címzett, m_recipient.LineLength ());
írja be a EditBox tartalmát a "WHOM" pufferhez
// címzett

char * from = új karakter [m_from.LineLength ()];
// hozzárendel egy helyet a memóriában a "FROM WHOM" változótól
m_from.GetLine (0, m_from.LineLength ());
írja a pufferhez "WHO" a EditBox tartalmát
// From

ha (! MySocket.Create ()) MessageBox ("hiba létrehozása foglalat", "", MB_OK);
// Hozzon létre egy foglalatot
ha (! MySocket.Connect (host, 25)) MessageBox ("hiba csatlakozik a foglalathoz", "", MB_OK);
// Megpróbál csatolni a levélkiszolgálóhoz a Host mezőbe
más <
res_len = MySocket.Receive (válasz, sizeof (válasz));
// fogadja el az SMTP szerver válaszát.
válasz [res_len] = 0;
m_log.ReplaceSel (válasz);
// megjeleníti a választ a napló ablakban
>

MySocket.Send ("HELO", 5);
MySocket.Send (host, m_host.LineLength ());
MySocket.Send (CRLF, 2);
// küldje el a "HELO someposthost.somedomain" parancsot "
res_len = MySocket.Receive (válasz, sizeof (válasz));
// fogadja el az SMTP szerver válaszát.
válasz [res_len] = 0;
m_log.ReplaceSel (válasz);
// megjeleníti a választ a napló ablakban

MySocket.Send ("MAIL FROM: <",12);
MySocket.Send (innen: m_from.LineLength ());
MySocket.Send (">", 1);
MySocket.Send (CRLF, 2);
küldje el a "MAIL FROM: "
res_len = MySocket.Receive (válasz, sizeof (válasz));
// fogadja el az SMTP szerver válaszát.
válasz [res_len] = 0;
m_log.ReplaceSel (válasz);
// megjeleníti a választ a napló ablakban

MySocket.Send ("RCPT TO: <",10);
MySocket.Send (címzett, m_recipient.LineLength ());
MySocket.Send (">", 1);
MySocket.Send (CRLF, 2);
// küldje el a "RCPT TO: "
res_len = MySocket.Receive (válasz, sizeof (válasz));
// fogadja el az SMTP szerver válaszát.
válasz [res_len] = 0;
m_log.ReplaceSel (válasz);
// megjeleníti a választ a napló ablakban

MySocket.Send ("DATA \ n", 5);
küldje el a "DATA" parancsot "
res_len = MySocket.Receive (válasz, sizeof (válasz));
// fogadja el az SMTP szerver válaszát.
válasz [res_len] = 0;
m_log.ReplaceSel (válasz);
// megjeleníti a választ a napló ablakban

// ------------------------------------------------ -------------
// Itt jön a blokk, amely elküldi az üzenet testét.
int y = m_body.GetLineCount ();
// adja meg a beírt szöveg sorainak számát
az (int i = 0; i

int l_lenght = m_body.LineLength (m_body.LineIndex (i));
// számítsuk ki az adott sorban lévő jelzések számát
// és ha a karakterlánc nem üres akkor
ha (l_lenght! = 0)<
char * curent_line = új karakter [l_lenght + 1];
// hozzon létre egy ideiglenes puffert
m_body.GetLine (i, curent_line, l_lenght);
írja az ideiglenes pufferre a következő sort
curent_line [l_lenght] = 10;

MySocket.Send (curent_line, l_lenght + 1);
// küldje el a szervert a következő sorból

törölje curent_line;
// törölje az ideiglenes puffert
>
más
// ha a sor üres, akkor elküldi a kiszolgálónak egy sor feedet

MySocket.Send (".", 1); MySocket.Send (CRLF, 2);
// valamint az adatok feladását is meg kell jelölni
// pont és új sorral.
res_len = MySocket.Receive (válasz, sizeof (válasz));
// fogadja el az SMTP szerver válaszát.
válasz [res_len] = 0;
m_log.ReplaceSel (válasz);
// megjeleníti a választ a napló ablakban

MySocket.Send ("QUIT \ n", 5);
// küldés kilépés parancsot a kapcsolatból.
MySocket.Close ();
// zárja le a foglalatot

törli a gazdagépet;
törölje a címzettet;
törölje;
// ideiglenes változók törlése
>

* Kattintson duplán a Quit gombra és írja be a következő szöveget

void CServerDlg :: OnCancel ()
<
// TODO: Adjon hozzá extra tisztítást itt
MySocket.Close (); // Zárja le a foglalatot
CDialog :: OnCancel (); // Zárja be a programot
>

A bezárás helyett.
* Ez minden, csak itt vannak a megvalósítás fogalmai
kliens SMTP-kiszolgáló. Ezután válassza ki, hogy megfelel-e Önnek vagy sem.
Ügyeljen arra, hogy az itt használt összes funkció leírásait nézze meg.

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

Kapcsolódó cikkek