SMTP - popis pouziti protokolu

Protokol SMTP byl vytvoren nekdy kolem roku 1980 a popsan v RFC 821 (http://www.ietf.org/rfc/rfc821.txt) - obsahoval prikazy HELO, MAIL, RPCT, DATA, SEND, SOML,SAML,RSET, VRFY, EXPN, HELP, NOOP, QUIT, TURN. Toto RFC bylo nahrazeno RFC 2821 (http://www.ietf.org/rfc/rfc2821.txt) v roce 2001 (ovsem specifikace SMTP protokolu popsane zde se urcite pouzivala jiz mnohem drive nez v roce 2001). Prikazy teto upravene specifikace jsou: HELO, MAIL, RCPT, DATA, RSET, VRFY, EXPN, HELP, NOOP, QUIT. Format hlavicek a dat (zadavanych po prikazu DATA) je popsan v RFC 822 (http://www.ietf.org/rfc/rfc822.txt), respektive RFC 2822 (http://www.ietf.org/rfc/rfc2822.txt).

Dalsim vyznamnym dokumentem je RFC 1869 (http://www.ietf.org/rfc/rfc1869.txt), ktery popisuje rozsireni SMTP protokolu. Tento dokument popisuje standartni cestu, jak rozsirit SMTP protokol o nove prikazy, nebo pridat dodatecne parametry ke stavajicim prikazum. Chce-li klient pouzivat toto rozsireni, ohlasi se mail serveru EHLO (namisto puvodniho HELO). Mail server bude toto rozsireni podporuje a odpovi stavem 250 a vetsinou i seznamem podporovanych rozsireni, nebo ne a pote odpovi stavem 5xx ukazka pripojeni se na server s podporou ESMTP.

vysvetleni jednotlivych prikazu:

EHLO / HELO fqdn (plne domenove jmeno) / tzv. address literal (vice bod 4.1.3 v RFC 2821) : prvni prikaz SMTP relace, v niz se klient identifikuje serveru a server jako odpoved vraci informace o podporovanych rozsirenich
MAIL FROM: <emailAddress>: emailova adresa odesilatele, vetsina SMTP serveru akceptuje adresu i bez <>. Musi se v kazdem mailu objevit aspon jednou.
RCPT TO: <emailAddress>: emailova adresa kam se mail posila, vetsina SMTP serveru akceptuje adresu i bez <>. Muze byt pouzito vicekrat.
DATA Zahajuje vkladani obsahu mailu. Text muze byt jako prosty text, binarni data jsou vkladana v nejakem kodovani. Ukoncuje se enter . enter
QUIT Ukoncuje SMTP relaci
RSET prerusi aktualni transakci a vrati relaci do stavu po HELO/EHLO
NOOP nema vliv na zadne predchozi prikazy, server pouze odpovi 250 OK
VRFY emailAddress: overi, zda emailova adresa je pro dany SMTP prijatelna = server je ochoten ji dorucit
EXPN emailAddress: zjisti zda cilova adresa je mailing list, zrejme se moc nepouziva, napr. u mne na POSTFIXu neni tento prikaz implementovan

SMTP prikazy jsou serverem zpracovany jako case-insensitive

zelenou znacime vstup od klienta
cervenou oznacujeme odpoved serveru
telnet agent.zlutazimnice.cz 25
ehlo test.domena.cz
250-agent.zlutazimnice.cz
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250 8BITMIME

ukazka odeslani mailu pres smtp server bez autentifikace

gentoo ~ # telnet agent.zlutazimnice.cz 25
Trying 81.95.102.223...
Connected to agent.zlutazimnice.cz.
Escape character is '^]'.
220 agent.zlutazimnice.cz ESMTP Postfix
ehlo test.domena.cz
250-agent.zlutazimnice.cz
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
mail from:<test@test.cz>
250 Ok
rcpt to:<kacerr@zlutazimnice.cz>
250 Ok
data
354 End data with .
From: test@test.cz
To: kacerr@zlutazimnice.cz
Subject: Testovaci mail
toto jsou nejaka data, ktera by mela odpovidat mime formatu. je mozne sem narvat prilohy a podobne veci, ale to uz by asi byla z telnetu velka frajerina.
.
250 Ok: queued as 119976EF07

Ted se zamerim na jedno konkretni rozsireni SMTP protokolu. A to konkretne o Autentizacni sluzbu (Authentication service extension). Je popsana v RFC 2554 (http://www.ietf.org/rfc/rfc2554.txt). Server, ktery podporuje toto rozsireni nam jako jednu z odpovedi na EHLO vrati napr. toto: 250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
Cili seznam pouzitelnych autentizacnich mechanismu na tomto serveru. Umozni nam tedy pomoci nejakeho uzivatelskeho jmena a hesla overit identitu uzivatele, ktery se pokousi pres tento server odeslat zpravu a jeste pomoci rozsireni prikazu MAIL FROM o klicove slovo AUTH umozni autorizovat jednotlive odesilane zpravy. Komunikace mezi serverem a klientem probiha jako serie vyzev serveru a odpovedi klienta. Vse je kodovano base64 kodovanim.

odeslani mailu pres smtp server a autentizaci uzivatele muze vypadat napriklad takto:
gentoo ~ # telnet agent.zlutazimnice.cz 25
Trying 81.95.102.223...
Connected to agent.zlutazimnice.cz.
Escape character is '^]'.
220 agent.zlutazimnice.cz ESMTP Postfix
ehlo test.domena.cz
250-agent.zlutazimnice.cz
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
auth login
- toto je base64 encoded vyzva = Username:
334 VXNlcm5hbWU6
- base64 odpoved: testaccount@zlutazimnice.cz
dGVzdGFjY291bnRAemx1dGF6aW1uaWNlLmN6
- base64 vyzva = Password:
334 UGFzc3dvcmQ6
- base64 odpoved: testovoheslo
dGVzdG92b2hlc2xv
235 Authentication successful
mail from:<testaccount@zlutazimnice.cz>
250 Ok
rcpt to:<kacerr@yellowfeverultimate.org>
250 Ok
data
354 End data with .
From: testaccount@zlutazimnice.cz
To: kacerr@yellowfeverultimate
Subject: Testovaci mail

a tady zase je nejaky obsah zpravy .... ale tu uz jsme tu meli ...
ukoncuje se to enter . enter

.
250 Ok: queued as 0E86E6EEA7

pozn: mail lze poslat i bez From:, To: a Subject: hlavicek, pak ale mail prijde na spravnou adresu specifikovanou v RCPT TO:, ale bez subjektu a v postovnim klientu se objevi, ze byl poslan undisclosed-recipients:.

Base64 encode/decode funkce muzete nalezt zde: http://makcoder.sourceforge.net/demo/base64.php