předcházející následující

Simple Mail Trasnfer Protocol


Kapitola 2. Základní vlastnosti protokolu SMTP

Obsah

2.1. Základní operace
2.1.1. Otevření a ukončení spojení
2.1.2. Odesílání pošty
2.1.3. Přeposílání pošty dalším serverům
2.1.4. Ověřování existence příjemců, rozbalení seznamu příjemců
2.1.5. Výměna rolí
2.2. Návratové kódy
2.3. Minimální implementace
2.4. Příkaz NOOP

Č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.

2.1. Základní operace


    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.

2.1.1. Otevření a ukončení spojení


    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.

2.1.2. Odesílání pošty

  1. 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.

  2. Příkaz MAIL FROM: nastaví pouze odesílatele, je proto potřeba dalších příkazů pro uskutečnění přenosu zprávy.

  3. 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.

  4. 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].

  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í.

2.1.3. Přeposílání pošty dalším serverům


    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.

2.1.4. Ověřování existence příjemců, rozbalení seznamu příjemců


    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

2.1.5. Výměna rolí


    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

2.2. Návratové kódy


    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

2.3. Minimální implementace


    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

2.4. Příkaz NOOP


    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.

2.5. Cvičení


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:.




předcházející následující