Protokol SMTP

Petr Ondo, xondo@fi.muni.cz


Obsah


Úvod:

Protokol SMTP byl definován v srpnu roku 1982 v RFC číslo 821. Jeho úkolem je přenášet elektronickou poštu. Původně byl navržen pro přenos textových zpráv. Později byl rozšířen v RFC 2821. Formát zpráv a adres byl definován v RFC 822 a rozšířen v RFC 2822.

Komunikace standardně probíhá na TCP portu 25 jako komunikace typu klient-server. Jako klient vystupuje MUA (Mail User Agent), který předává zprávu prvnímu MTA (Mail Transfer Agent), nebo MTA, který předává zprávu dále. Na základě uživatelského požadavku na odeslání pošty vytvoří odesílající SMTP server dvoucestný kanál k přijímajícímu SMTP serveru.

Příklad komunikace:

[votik@ip166mmx votik]$ telnet 192.168.1.6 25
Trying 192.168.1.6...
Connected to 192.168.1.6.
Escape character is '^]'.
220 localhost.localdomain ESMTP SendMail 8.9.3/8.9.3; Sun, 26 Oct 2003 15:17:44 +0100
HELO 192.168.1.6
250 localhost.localdomain Hello IDENT:votik@[192.168.1.6], pleased to meet you
MAIL From:<votik@neco.cz>
250 <votik@neco.cz>... Sender ok
RCPT To: <root@localhost>
250 <root@localhost>... Recipient ok
RCPT To: <votik@localhost>
250 <votik@localhost>... Recipient ok
RCPT To: <pokus@localhost>
550 <pokus@localhost>... User unknown
DATA
354 Enter mail, end with "." on a line by itself
toto je pokus
..
.
250 PAA00659 Message accepted for delivery
QUIT
221 localhost.localdomain closing connection
Connection closed by foreign host.

Popis komunikace a příkazů:

Na začátku komunikace se představí přijímající server a očekává příkaz HELO s identifikací odesílajícího serveru.

Po odpovědi očekává příkaz MAIL (nebo SEND, SOML, SAML – viz. dále) identifikující odesílatele.

Poté může následovat i více příkazů RCPT, které identifikují jednotlivé příjemce. Odpovědí na RCPT může být několik:


Odmítnutím uživatele není odmítnuta celá zpráva, pouze jeden její příjemce.

Poté následuje příkaz DATA, který oznamuje konec příjemců a začátek zprávy. Po odpovědi přijímajícího serveru 354, následuje v příkladě vlastní zpráva, standardně by zprávě měli předcházet hlavičky, které jsou od vlastní zprávy odděleny prázdným řádkem. Konec zprávy je signalizován jako tečka na samostatném řádku. Aby nedocházelo k omylům, pokud by toto uživatel zadal v těle zprávy, odesílající SMTP takovémuto řádku přidá na začátek ještě jednu tečku. Pokud přijímající SMTP server načte řádek začínající tečkou, za kterou následují další znaky, tuto tečku smaže a pokračuje v přijímání zprávy. Po ukončení zprávy (pokud nedošlo k chybě) následuje odpověď 250 Ok.

Odesílající server může zadáním příkazu MAIL pokračovat v posílání dalších zpráv, nebo příkazem QUIT nařídit ukončení spojení.

Aby SMTP bylo schopno fungovat, je v RFC 821 definována minimální implementace. Obsahuje příkazy HELO, MAIL, RCPT, DATA, RSET, NOOP a QUIT.

Příkaz RSET způsobí zahození všech předchozích příkazů a jejich parametrů a vyprázdní buffery. Odpovědí může být pouze 250 Ok. Příkaz NOOP nemá žádný vliv na předchozí příkazy a jejich parametry. Odpovědí je 250 Ok. V RFC 2821 byla minimální implementace rozšířena o příkazy EHLO a VRFY.

EHLO je Extended HELLO. Odpověď na EHLO je víceřádková a mimo jiné obsahuje seznam příkazů akceptovaných přijímajícím SMTP serverem.

EHLO 192.168.1.6
250-localhost.localdomain Hello IDENT:votik@[192.168.1.6], pleased to meet you
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-ETRN
250-XUSR
250 HELP

Příkaz VRFY ověří jestli je uživatel znám. Pokud ano, odpovědí je jeho celé jméno (pokud je známo) a elektronická adresa jeho schránky.

VRFY votik
250 <votik@localhost.localdomain>

VRFY jetel
250 Karel Jetel <jetel@localhost.localdomain>

VRFY pokus
550 pokus... User unknown

Dále může SMTP ještě akceptovat příkazy SEND, SOML, SAML, EXPN, HELP a TURN.

Příkaz SEND požaduje doručení zprávy nikoliv do schránky, ale na uživatelův terminál. Příkaz je úspěšný, pokud se doručení na terminál zdaří.

Příkaz SOML (SEND OR MAIL) požaduje doručení zprávy na terminál nebo do schránky. Nejprve se zkusí doručit zprávu na terminál, pokud uživatel není přihlášen, nebo má přijímání zpráv na terminál zakázáno, zpráva se uloží do schránky. V obou případech je příkaz úspěšný.

Příkaz SAML se pokusí doručit zprávu na terminál a uložit ji do schránky. Příkaz je úspěšný pokud se podaří zprávu uložit.

EXPN je požadavek na expanzi mailing listu. Pokud je parametrem mailing list, odpověď bude obsahovat jména uživatelů (pokud jsou známa) a jejich elektronické adresy.

Odpovědí na příkaz HELP bez parametrů jsou pomocné informace. Pokud má příkaz HELP parametr, je odpovědí podrobný popis tohoto parametru, pokud je parametr platným příkazem. Jinak je odpovědí chybové hlášení 504 Help topic unknown.

Příkaz TURN umožňuje prohození úloh odesílajícího a přijímajícího serveru. Odpovědí může být 250 Ok (přijímající server přebírá úlohu odesílajícího, následuje 220 Service ready), nebo odmítnutí (502). Tento příkaz byl specifikován v RFC 821, v RFC 2821 bylo kvůli potencionálnímu bezpečnostnímu riziku doporučeno tento příkaz nepoužívat, pokud přijímající server nemůže odesílatele autentifikovat (tento příkaz může být jednoduše použit k odvrácení zpráv od jejích správného cíle).

SMTP odpovědi:

Každá SMTP odpověď má přiřazen jednoznačný numerický kód. Jsou to:
211 System status, or system help reply
214 Help message
220 <domain> Service ready
221 <domain> Service closing transmission channel
250 Requested mail action ok, completed
251 User not local; will forward to <forward-path>
252 Cannot VRFY user, but will accept message and attempt delivery
354 Start mail input; end with <CRLF>.<CRLF>
421 <domain> Service not available, closing transmission channel

450 Requested mail action not taken: mailbox unavailable
451 Requested action aborted: local error in processing
452 Requested action not taken: insufficient system storage
500 Syntax error, command unrecognized
501 Syntax error in parameters or arguments
502 Command not implemented
503 Bad sequence of commands
504 Command parameter not implemented
550 Requested action not taken: mailbox unavailable
551 User not local; please try <forward-path>
552 Requested mail action aborted: exceeded storage allocation
553 Requested action not taken: mailbox name not allowed
554 Transaction failed

Formát zpráv:

Vzhledem k tomu, že původně byla elektronická pošta navržena k přenášení textových zpráv, může podle RFC 2822 tělo zprávy mít nejvíce 998 + <CRLF> znaků na řádek, ale nemělo by obsahovat více jak 78 + <CRLF> znaků na řádek. A protokol SMTP používá k přenosu zpráv 7bitové ASCII kódování. Tento způsob je zcela nevyhovující, protože nepodporuje národní znaky a přenášení netextových souborů jako příloh. Proto se v dnešní době používá k přenosu binárních dat a zpráv s podporou národních znaků standart MIME (Multipurpose Internet Mail Extensions).

Informace o MIME se přidávají ke zprávě v podobě hlaviček. Hlavičky mají tvar <klíč>: <parametry>. Klíč musí začínat na začátku řádku. Pokud je parametr víceřádkový, musí každý další řádek parametru začínat bílým místem.

Mezi standardní hlavičky patří například To:, From:, Cc:, Bcc, Subject:, atd. Mezi MIME hlavičky patří například Mime-Version:, Content-type:, atd. Hlavičky jsou od vlastní zprávy odděleny jedním prázdným řádkem. Při kódování 8bitových informací se používá kódování Base64.

Doručování zpráv:

Zprávy jsou doručovány podle informací v obálce, nikoliv podle hlaviček. Tento způsob byl zvolen z několika důvodů:

Směrování pošty:

Směrování pošty ve velkých sítích není jednoduchá záležitost. Proto se pro směrování pošty v Internetu používají MX záznamy v DNS. MX záznamy mají tvar:
name ttl IN MX preference host
Pro jedno name může existovat více MX záznamů s rozdílnými hodnotami v preference a host. Dopis jehož směrová část je name (tzn. user@name), bude poslán na host s nejnižší prioritou. Pokud není host dosažitelný, použije se host s vyšší prioritou, atd. Hodnota ttl udává dobu, po kterou se má záznam udržovat v cache DNS serveru. Díky MX záznamům není nutné, aby existoval počítač se jménem name pro používání adres ve tvaru user@name .