Obsah
Časová náročnost kapitoly: 25 minut
Protokol SMTP se používá pro přenos
e-mailových zpráv od klienta na server, dále pro výměnu e-mailů mezi
servery. SMTP servery i klienti směrují emaily na základě záznamů MX
v DNS (Domain Name Service). Podrobnější popis v dokumentu RFC 821
[2], RFC 974 [3].
SMTP protokol je typu
požadavek - odpověď. Požadavky i odpovědi jsou v ASCII formátu a
ukončují se dvojicí znaků <CRLF> (jejich ASCII hodnota je 13 a
10). Odpovědi obsahují třímístný číselný kód, který udává návratový
status následovaný textovým vysvětlením. SMTP protokol se za několik
let používání značně změnil, existuje množství norem popisujících
jeho rozšíření. V tomto textu budeme popisovat jen skutečný základ
protokolu.
Nyní se podívejme, jak protokol
pracuje po technické stránce. Základem je protokol TCP/IP. SMTP
server naslouchá na portu 25 protokolu TCP. Stejně tak i všechny své
opovědi při komunikaci s klientem směřuje na port 25. Toto se dá
snadno ověřit.
Cvičení
Spusťte Telnet a připojte
se na hostitele smtp.seznam.cz port 25
Pokud
vše proběhlo v pořádku, přijde vám jako odpověď pozdrav
220
Welcome ESMTP Sendmail
Poznámka
Aby přišla nějaká
odpověď, je potřeba být připojen do sítě internet. Toto připojení
bude potřebné i u dalších příkladů bez upozornění. Proto vždy, pokud
není výsledek podle předpokladů, ověřte, že vaše internetové
připojení je v pořádku a že pracuje i počítač, na který se pokoušíte
připojit. Tento příklad je možné provést i bez připojení na internet,
jen vyžaduje, aby v lokální síti pracoval SMTP server.
Poznámka
Na pomalých linkách
nastává případ, kdy si emaily vyměňují dva SMTP servery, proto
stranu, která v tu danou chvíli přijímá emaily, budeme nazývat SERVER
a tu stranu, která emaily v té chvíli odesílá, budeme nazývat KLIENT.
Běžně se stává, že v průběhu spojení si obě strany role vymění a v
této terminologii se stane ze SERVERU KLIENT a z KLIENTU SERVER. K
této výměně dochází zvláště v případě, kdy časová režie na odhlášení
a opětovné přihlášení serverů není zanedbatelná. Jde zvláště o
komutované připojení pomalými linkami.
Pro otevření logického spojení se
používá příkaz HELO, kterým se klient identifikuje vůči serveru.
Spojení se ukončuje příkazem QUIT.
K odesílání pošty se používá příkaz MAIL FROM:, který většinou následuje ihned za příkazem HELO. Pokud server na tento požadavek odpoví 250 OK, znamená to, že je server připraven přijímat požadavky klienta.
Příkaz MAIL FROM: nastaví pouze odesílatele, je proto potřeba dalších příkazů pro uskutečnění přenosu zprávy.
Příkaz RCPT TO: identifikuje příjemce emailu, tento příkaz se musí zopakovat pro každého příjemce, server jednotlivé příjemce buď potvrdí, nebo zamítne. Této možnosti se využívá proto, že stačí odeslat email jednou a jen dodat všechny adresy, na které chceme, aby došel.
Následuje příkaz DATA, který musí server potvrdit, a klient může odesílat vlastní obsah emailu. Detailní popis formátu emailové zprávy je v dokumentu RFC 821 [5].
Tělo emailu se zakončuje sekvencí <CRLF>.<CRLF>. Příjem dat server potvrdí. Tím končí celý proces zasílání emailu, pro další email se začíná od příkazu MAIL.
Existují příkazy pro odesílání pošty SEND, SOML a SAML. Jsou ekvivalentní příkazu MAIL, mají jen své speciální vlastnosti, ve většině případů je SMTP servery neimplementují.
Ve chvíli, kdy klient předá serveru
email pro uživatele jiného serveru, server odpoví, že uživatel není
lokální, a přeposílá zprávu ke zpracování serveru, pro který se
rozhodne na základě údajů v DNS.
Druhá
varianta je, že zadaného příjemce nemůže najít ani na ostatních
serverech nebo přeposílání pošty odmítne, není-li k němu
nakonfigurován (třeba z důvodu bezpečnosti), a v tom případě zašle
zprávu o zamítnutí příjemce.
SMTP
servery obsahují rozšířené funkce na ověřování existence příjemců a
rozbalení seznamu příjemců. Tyto funkce zajišťují příkazy VRFY a
EXPN. Jde většinou o rozbalování skupinových adres. Příkladem může
být skupinová adresa firmy, kdy email poslaný na tuto adresu se
rozešle všem zaměstnancům firmy.
download
vysoká kvalita nízká kvalita
Příkaz TURN je možno použít k výměně
rolí mezi klientem a serverem. Princip výměny rolí je popsán výše v
poznámce. Tento příkaz je nepovinný, tudíž jej nemusí obsahovat
všechny implementace SMTP serverů.
Vlastnosti klíčových slov jsou následující
-
jsou složeny z viditelných ASCII znaků
-
jsou case insenzitive - u klíčových slov nezáleží na velikosti znaků
(helo, HeLo a HELO jsou stejný příkaz)
Vlastnosti
odpovědí
- obsahují třímístný číselný
kód, který udává návratový status následovaný textovým popisem
Server vždy na příkaz odpovídá
stavovým kódem následovaným textem. Text obsahuje detailnější
informace odpovědi. Stejný stavový kód je následován rozdílnými
informacemi podle příkazu, který jej vyvolal. Detailní popis možných
odpovědí a návratových kódů je vždy u každého příkazu. Zde je jen
náhled kódů a jejich významů.
250 -
Kladná odpověď, např. zpráva odeslána v pořádku, atd.
550
- Záporná odpověď, např. přístup k serveru nepovolen, atd.
354
- Informativní odpověď, např. ukončovací sekvence víceřádkového
vstupu
251 - Informativní kladná odpověď,
např. adresát není na tomto serveru, zpráva bude přeposlána na tuto
adresu (sám se postará o její doručení)
551
- Informativní záporná odpověď, např. adresát není na tomto serveru,
prosím přepošlete zprávu na tuto adresu (je na Klientu, jestli zprávu
znovu pošle na nabídnutou adresu, server ji s původním adresátem
nepřijme)
553 - Uživatel je nejednoznačný
220 - Informativní odpověď, např. uvítací
zpráva
221 - Informativní odpověď, např.
odhlašovací zpráva
Minimální implementace protokolu musí
být schopna správně odpovědět na následující příkazy.
HELO
MAIL
RCPT
DATA
RSET
NOOP
QUIT
Tento příkaz nemá vliv na jakoukoli
probíhající operaci na serveru, nemění jeho stav ani stav Bufferů či
právě probíhající operace. Znamená žádnou operaci (NO OPeration) a
server na ni musí odpovědět 250 OK.
Námět na příklady:
Pomocí utility
telnet se připojte na smtp server a odešlete email. Pokuste se
odeslat email na neexistující adresu. Ověřte si rozdíl při použití
příkazů SEND FROM:, SOML FROM: a SAML FROM:.