Slovenská technická univerzita
Fakulta elektrotechniky a informatiky
Katedra telekomunikácií
Ilkovičova 3, 812 19 Bratislava

SMTP
Simple Mail Transfer Protocol

Autor: Anton Březina
Predmet: Komunikačné protokoly
Ročník: 4
Školský rok: 2001/02

Úvod.

Protokol SMTP (Simple Mail Transfer Protocol), ako napovedá anglický názov slúži na prenos mailových objektov, ktoré sú zložené z obálky a obsahu (envelope a content). Obsah sa ďalej skladá zo záhlavia a samotnej správy Jeho hlavnou úlohou je odovzdanie správy do mailboxu. SMTP protokol je novšia verzia staršieho protokolu MTP (Mail Transfer Protocol), ktorý sa ukázal ako zbytočne komplikovaný a bol výrazne zjednodušený.

Popisom protokolu SMTP sa zaoberá dokument RFC 2821.

Formát správy elektronickej pošty.

Sráva elektronickej pošty sa delí na dve základné časti.

Prvá časť je záhlavie tvorené riadkami, ktoré sa nazývajú hlavičky. Hlavička začína kľúčovým slovom nasledovaným dvojbodkou a mezerou (napríklad: From:, To:, Subject: atď.). Za mezerou nasledujú hodnoty s významom, ktorý im určuje kľúčové slovo za ktorým sú uvedené. Dokument RFC 822 definuje veľa rôznych položiek pre hlavičky správ, ale nepredpisuje povinné poradie jednotlivých hlavičiek.

Každá správa od niekoho pochádza. Na určenie autora správy slúži položka FROM, napríklad From: miso@elf.stuba.sk

Doporučenie RFC 822 pamätá aj na to, že autor správy nemusí byť totožný s jej odosielateľom, napríklad sekretárka odosiela správy pôvodne napísané šéfom. Na určenie odosielateľa slúži položka SENDER.

Ďalšou položkou je REPLY-TO, ktorá určuje komu má byť zaslaná odpoveď. Napríklad pri elektronických konferenciách je dosť podstatný roziel, keď sa pošle odpoveď na adresu elektronickej konferencie ( dostanú ju všetci jej účastníci ), alebo sa pošle priamo autorovi.

Ešte ďalšiu možnosť poskytuje položka RETURN-PATH, ktorá určuje kam má byť vrátená správa v prípade, že sa nedá doručiť.

Položka TO zas určuje adresáta správy.

Ďalej je možné poslať aj tzv. kópie na vedomie (Carbon Copy),
a aj tzv. slepé kópie (Blind Carbon Copy) o ktorej sa hlavný adresát správy nedozvie, na rozdiel od príjemcov bežných kópií o ktorých sa dozvie z hlavičky svojho listu.
Na určenie adresátov kópií na vedomie slúži položka CC a na určenie adresátov slepých kópií slúži zase položka BCC.

Ďalšou položkou môže byť položka DATE, určujúca dátum a čas odoslania a položka SUBJECT, popisujúca predmet správy.

V každej správe je ešte niekoľko položiek RECEIVED, ktorú pripisuje na začiatok správy každý mailový server, ktorým správa prechádza. Takže ak čítame položky RECEIVED odspodu hore tak zistíme cez ktoré mailové servery správa cestovala. To sa používa pre potreby ladenia.

Príklad záhlavia správy:

Received:from mh.pvt.cz (mh.pvt.cz [194.149.105.36]) by bu.pvtnet.cz (8.8.5/8.7.3) with SMTP id PAA23028; Wed, 16 Apr 1997 15:10:14 +0200 (MET DST)
Received: from ncc.ripe.net by mh.pvt.cz with SMTP id AA08008(5.67b/IDA-1.5 for <registr@pvt.cz>); Wed, 16 Apr 1997 15:05:09 +0200
Received: by ncc.ripe.net id AA00228 (5.65a/NCC-2.41);  Wed, 16 Apr 1997 13:55:02 +0200
Received: from mail.freedotnet.net by ncc.ripe.net with SMTP id AA00215 (5.65a/NCC-2.41); Wed, 16 Apr 1997 13:55:00 +0200     Received: from jon.freedotnet.net ([208.215.186.129])                by homer.freedotnet.com (Netscape Mail Server v2.02) with ESMTP id AAA105 for <local-ir@ripe.net>; Wed, 16 Apr 1997 13:09:15 +0100
Reply-To: <jon.brody@freedotnet.net>
From: "Dr Jon Brody" <jon.brody@freedotnet.net>
To: <local-ir@ripe.net>
Subject: Re: Role?
Date: Wed, 16 Apr 1997 12:58:51 +0100

Za záhlavím správy nasleduje druhá časť t.j. vlastný text správy. Text správy musí byť od záhlavia oddelený minimálne jedným prázdnym riadkom.  

Domény

	Použitie domén  mení adresný priestor z rovinného globálneho priestoru s menami strojov pozostávajúcich z jednoduchých znakových reťazcov na hierarchicky štrukturovaný koreňový strom globálnych adries. Meno stroja je nahradené doménou a host designatorom, ktorý predstavuje postupnosť reťazcov jednotlivých častí domény oddelených bodkami s ohľadom na to, že časti domény sú zoradené od najšpecifickejšej po najvšeobecnejšiu (najobyčajnejšiu). V názvoch domén je povolené použiť len oficiálne mená, prezývky alebo aliasi nie sú povolené.

Protokol SMTP.

SMTP protokol definuje ako má vyzerať obálka správy elektronickej pošty, čo má byť v nej zapísané a akým spôsobom sa má prenášať. Možnosti ktoré SMTP ponúka nie sú obmedzené len na prenos a doručovanie správ do poštovných schránok používateľov. Je možné v prípade, že je užívateľ momentálne prihlásený na termináli, správu okamžite zobraziť namiesto jej uloženia do užívateľovej schránky alebo oboje. Táto možnosť sa v súčasnosti takmer vôbec nepoužíva.
SMTP obálka do ktorej je vkladaná vlastná správa, musí obsahovať aspoň dva základné udaje. Adresu užívateľa, ktorý poslal správu a adresu príjemcu. Je pritom možné aj to aby jedna správa mala viac príjemcov ale bola prenášaná iba raz a až v mieste svojho príjmu bola doručená viacerim príjemcom. Je nutné si uvedomiť, že adresa príjemcu v SMTP obálke vôbec nemusí byť zhodná s adresátom vlastnej správy. Napríklad doručovanie kópií Cc a Bcc. Keď je správa doručovaná príjemcom týchto kópií je na obálke napísaná ich adresa, zatiaľ čo v položke To: v rámci vlastnej správy je adresa hlavného adresáta.

Prenos SMTP obálky a jej obsahu.

Protokol SMTP predpokladá, že obálka a jej obsah budú prenášané po takom transportnom spojení, ktoré zabezpečí spoľahlivosť prenosu.
Protokol SMTP chápe prenášané dáta ako text členený na jednotlivé riadky, a tvorený iba znakmi pôvodnej 128 prvkovej abecedy ASCII. SMTP teda predpokladá prenos znakov, kódovaných iba do siedmich bitov. Pokiaľ sa takéto sedembitové znaky prenášajú kanálom, ktorý prenáša osembitové znaky, potom SMTP štandard definuje,že sedembitové znaky majú byť vkladané do osmíc tak, aby boli zarovnané doprava a zľava doplnené nulovým bitom.
Samotná SMTP obálka je pritom tiež prenášaná vo forme textu, a to na začiatku prenosu. Celá komunikácia medzi prijímačom a odosielateľom má formu dialógu.

Forma SMTP dialógu.

Vlastný dialóg oboch komunikujúcich správ má formu posielania príkazov a odpovedí na ne. Príkazy sú tvorené kľúčovými slovami, za ktorými obvykle masledujú ďalšie upresňujúce parametre.
Naproti tomu odpovede na príkazy sú číselné, tvorené trojmiestnym desiatkovým číslom (prenášaným v textovom tvare). Ich štruktúra je podobná štruktúre číselných odpovedí používaných v protokole FTP. Prvá z trojice číslic vyjadruje celkovú povahu odpovede ( napr. 2 znamená kladnú odpoveď, 5 záporná odpoveď ), druhá číslica ju ďalej upresňuje a tretia  ju špecifikuje ešte bližšie. Číselné odpovede bývajú doplnené textovými reťazcami, ktoré majú povahu komentárov určených pre prípadných ľudských príjemcov, ale ich tvar nie je štandardizovaný a môžu sa prípad od prípadu líšiť.

Fázy SMTP dialógu.

Prvou fázou dialógu podľa protokolu SMTP je samotné nadviazanie spojenia. Ten, kto nadväzuje spojenie ( odosilateľ správy ), vystupuje v úlohe klienta a kontaktuje protistranu v úlohe SMTP servera ( prijímateľ správy ). Klient pritom kontaktuje svoj server na porte č.25, ktorý patrí medzi tzv. dobre známe porty ( well-knowm ports ). Ak je všetko v poriadku a server je pripravený žiadosť prijať, odpovie číselnou odpoveďou 220 ( doplnenou prípadným textovým komentárom ). Klient reaguje tak, že sa serveru predstaví pomocou príkazu HELO. Pokiaľ je server ochotný prijímať poštu od klienta, odpovie na jeho predstavenie kladne (250).
Ďalšou fázou vzájomného dialógu je prenos pomyselnej obálky, spočívajúci v predaní adresy odosielateľa ( príkazom MAIL FROM ) a jednej či viacerých adries príjemcov ( príkazom RCPT TO ). Potom nasleduje prenos vlastnej správy, ktoré je zo strany klienta určené príkazom DATA, a zo strany servera odpoveďou 354. Samotná správa je tvorená hlavičkou a telom samotnej správy podľa RFC 822 ( viď vyššie ). Koniec správy je signalizovaný riadkom obsahujúcim jediný znak – bodku na prvej pozícii. Prípadný výskyt takéhoto riadku v tele správy je vyriešený vložením ďalšej bodky. Po úspešnom prenose celej správy nasleduje kladné potvrdenie ( odpoveďou 250 ) a ukončenie spojenia zo strany klienta príkazom QUIT.

Príklad prenosu správy pomocou SMTP:

odosielateľ (klient) 			prijímateľ (server)
{nadviazanie spojenia na úrovni protokolu TCP} 

1	220 einar.dcit.cz SMTP service ready
2 HELO frode.dcit.cz
3						250 einar.dcit.cz hello fode.dcit.cz
4 MAIL FROM <pet@dcit.cz>
5						250 sender ok
6 RCPT TO: <pav@einar.dcit.cz>
7						250 recipient ok
8 RCPT TO: <votava@einar.dcit.cz>
9						250 recipient ok
10 DATA
11 						354 Enter mail, end with "." on a line by itself
12{ hlavička správy podľa RFC 822}
      ...............
  {telo správy podľa RFC822}
.
13						250 mail accepted 
14 QUIT
15						221 einar.dcit.cz closingconnection 

ukončenie spojenia na úrovni protokolu TCP

Popis príkazov SMTP.

	SMTP príkaz je znakový reťazec zakončený <SP>, ak nasledujú parametre a <CRLF>, ak nie.

HELO/EHLO
Týmto príkazom sa identifikuje SMTP-klient SMTP-serveru. Argument obsahuje meno SMTP-klienta.
EHLO – Extended HELO

MAIL
Spustenie transakcie, ktorou sa doručí správa do jedného alebo viacerých mailboxov. Argumentom je spätná adresa.

RECIPIENT
	Určenie jedného prijímateľa správy viď príklad.

DATA
	Nasledujúce riadky sú dáta správy. Ukončenie (CRLF).(CRLF)

SEND
Príkaz použitý na zobrazenie správy na termináli používateľa. Argumentom je spätná adresa.

SEND OR MAIL (SOML)
Príkaz použitý na zobrazenie správy na termináli alebo uloženie do mailboxu. Argumentom je spätná adresa.

SEND AND MAIL (SAML)
Príkaz na zobrazenie správy na termináli a uloženie do mailboxu. Argument-spätná adresa.

RESET
Zrušenie prenosu správy, vymazanie vyrovnávacích pamätí a stavových tabuliek.

VERIFY
Týmto príkazom sa klient pýta servera či pripojený argumet reprezentuje platného užívateľa. Ak áno, tak server vráti celú adresu mailboxu užívateľa.

EXPAND
Klient sa pýta serveru či pripojený argument identifikuje zoznam platných používateľov. Ak áno, vráti názov skupiny používateľov.

HELP
	Vráti popis príkazov.

NOOP
	Prázdný príkaz, bez efektu. Server vráti OK.

QUIT
	Ukončenie spojenia.

TURN
Ponuka na výmenu úloh. 
	Ak je program A aktuálne SMTP vysielačom a poslal príkaz TURN a prijal odpoveď OK (250), potom sa program A stáva SMTP prijímačom. Ak je program B aktuálne SMTP prijímačom, prijme príkaz TURN a vyšle odpoveď OK (250), potom sa program B stáva SMTP vysielačom.
		Na odmietnutie výmeny úloh prijímač pošle odpoveď 502.
	Tento príkaz nie je bežne použiteľný (napr. ak je prenosovým kanálom TCP, tam sa nepoužíva). Používa sa však tam, kde je cena vytvorenia prenosového kanála vysoká. Napríklad, tento príkaz môže byť s výhodou použitý pri výmene mailov cez verejnú prepojovaciu telefónnu sieť (ako prenosový kanál), obzvlášť ak nejaký stroj vyzýva iné stroje na výmenu mailov.

SMTP Odpovede

	Sú určené na zabezpečenie synchronizácie žiadostí a jednotlivých činností v procese posielania pošty a hlavne na zabezpečenie, aby SMTP vysielač v každom okamihu poznal stav SMTP prijímača. Ku každému príkazu musí byť vygenerovaná práve jedna odpoveď.
	SMTP odpoveď pozostáva z troch číslic (sú prenášané ako alfanumerické znaky) a textom nasledujúcim za týmito číslami. Číslo je určené pre SMTP vysielač a slúži na automatické určenie nasledujúceho stavu. Text je určený pre užívateľa. Je „prijímačovo“ aj kontextovo nezávislý, čo predpokladá jeho obmieňanie pre každú odpoveď. Keďže trojmiestny číselný kód obsahuje dostatočne veľa zakódovanej informácie, SMTP vysielač (prijímajúci tieto odpovede) môže text nasledujúci za číselným kódom odmietnuť alebo, ak je to výhodné, poslať ho používateľovi.
	Formálne je odpoveď definovaná postupnosťou:

	trojmiestny číselný kód, <SP>,jeden riadok textu,<CRLF>

(SP je ASCII znak pre medzeru)

popis číselných kódov:
1yz   Positive Preliminary reply (čaká na ďalšie príkazy od klienta, či pokračovať alebo zrušiť akciu)
2yz   Positive Completion reply (akcia sa skončila úspešne)
3yz   Positive Intermediate reply (čaká na ďalšie informácie, klient by nemal posielať ďalšie príkazy)
4yz   Transient Negative Completion reply (chyba nie je trvalá a o akciu je možné požadovať neskôr)
5yz   Permanent Negative Completion reply (permanentná chyba)

Detaily

	Data mailu pozostávajú zo 128 ASCII znakov. Všetky znaky sú odovzdané do adresátovej schránky vrátane riadiacich znakov a formátu.

	V niektorých systémoch je nevyhnutná transformácia dát po ich prijatí a uchovaní. Je to potrebné pre stroje, ktoré majú odlišnú znakovú množinu ako je množina ASCII znakov alebo ak uchovávajú dáta v zoznamoch radšej ako v reťazcoch. Ak je nevyhnutná určitá transformácia, musí byť inverzná.

Implementačné minimum

	Každý prijímač musí mať implementované minimálne tieto príkazy (aby poznal SMTP protokol):

	HELO
	MAIL
	RCPT
	DATA
	RSET
	NOOP
	QUIT

Transparentnosť:

	Jedinou netransparentnosťou SMTP protokolu je postupnosť: 

	<CRLF>.<CRLF> (samotna bodka v riadku)

	(CRLF su ASCII znaky CR a LF – koniec riadka)

	predstavujúca koniec textu pošty, a preto ju nemôže žiaden používateľ poslať. Obyčajne však používateľ o tejto „neprípustnej“ postupnosti nemá „potuchy“. Preto sa na ostránenie tejto netransparentnosti používa nasledujúca procedúra:

1. 	Ešte pred poslaním riadku textu pošty, SMTP vysielač skontroluje prvý znak v riadku. Ak je ním bodka, vloží na začiatok riadku ešte jednu bodku.

2. 	Ak je riadok textu pošty prijatý SMTP prijímačom, skotroluje sa prvý znak v riadku. Ak je ním bodka a za ňou sa už nič nenachádza, predstavuje koniec mailu. Ak je však na začiatku riadku bodka a za ňou sú ešte ďalšie znaky, prvý znak v riadku (bodka) bude vymazaný.

Veľkosti:	

	Existuje niekoľko objektov vyžadujúcich minimálnu a maximálnu veľkosť. T.j., každá implementácia musí byť schopná prijať objekty prinajmenšom tejto veľkosti, ale nesmie poslať objekty väčšie ako je táto veľkosť.

Používateľ:

	Maximálna dĺžka používateľského mena je 64 znakov.

Doména:
	
	Maximálna dĺžka mena domény alebo čísla je 64 znakov.

Cesta:

	Maximálna celková dĺžka doprednej alebo spätnej cesty je 256 znakov.

Príkazový riadok:

	Maximálna celková dĺžka príkazu vrátane samotného príkazu a <CRLF> je 512 znakov.

Riadok s odpoveďou:

	Maximálna celková dĺžka odpovede vrátane samotnej odpovede a <CRLF> je 512 znakov.

Riadok textu:

	Maximálna celková dĺžka textového riadku vrátane <CRLF> je 1000 znakov (nepoèítajú sa ale duplikácie bodiek pre zabezpeèenie transparentnosti).

Adresátove bufre:

	Maximálny celkový počet adresátov, ktorý musia byť bufrovaný je 100.

	Pri nedodržaní týchto limitov sú v odpovediach posielané nasledovné chybové kódy:

500	Riadok pridlhý
501	Cesta pridlhá
552	Priveľa adresátov
552	Príliš veľa „mailových“ dát