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:
Meglévő üzeneten belül jelenik meg
a levélhez való csatolás.
RCPT TO:
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
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
// ------------------------------------------------ ------------- int l_lenght = m_body.LineLength (m_body.LineIndex (i)); MySocket.Send (curent_line, l_lenght + 1); törölje curent_line; MySocket.Send (".", 1); MySocket.Send (CRLF, 2); MySocket.Send ("QUIT \ n", 5); törli a gazdagépet; * Kattintson duplán a Quit gombra és írja be a következő szöveget void CServerDlg :: OnCancel () A bezárás helyett. <<ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ
// 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
// 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;
// küldje el a szervert a következő sorból
// törölje az ideiglenes puffert
>
más
// ha a sor üres, akkor elküldi a kiszolgálónak egy sor feedet
// valamint az adatok feladását is meg kell jelölni
// pont é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
// küldés kilépés parancsot a kapcsolatból.
MySocket.Close ();
// zárja le a foglalatot
törölje a címzettet;
törölje;
// ideiglenes változók törlése
>
<
// TODO: Adjon hozzá extra tisztítást itt
MySocket.Close (); // Zárja le a foglalatot
CDialog :: OnCancel (); // Zárja be a programot
>
* 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