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.
[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.
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:
250 Ok pokud je příjemce v pořádku
251 User not local; will forward to <forward-path>, pokud uživatel není lokálni. Přijímající server přebírá odpovědnost za doručení zprávy.
551 User not local; please try <forward-path>, pokud uživatel není lokální a přijímající server nepřebírá zodpovědnost za doručení zprávy. Záleží na odesílajícím SMTP serveru, jestli se pokusí zprávu poslat na <forward-path>, nebo jí vrátí původnímu odesílateli jako nedoručitelnou.
550 User unknown, pokud je uživatel neznámý.
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).
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
421 může být odpovědí na jakýkoliv příkaz, pokud SMTP server ví, že se musí ukončit
schránka je zaneprázdněna
schránka nebyla nalezena, příkaz byl odmítnut z bezpečnostních důvodů
při otevíraní spojení znamená "No SMTP service here"
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.
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ů:
Pokud je zpráva určena více uživatelům na různých strojích, musí se na některém místě sítě jednotlivé kopie rozejít. Z obálky se odstraní ty adresy, na které zpráva putovala jinou cestou, ovšem v hlavičkách zůstanou (kromě Bcc:).
Uživatel může dopis přeposlat. Aby měl adresát kontrolu nad tím, na jakou a ze které adresy byl dopis původně poslán, budou tyto údaje změněny pouze v obálce.
Pokud nelze dopis doručit, vrací se zpět původnímu odesílateli s informací o nedoručitelnosti. Aby nedošlo k zacyklení pokud není původní odesílatel dostupný, je v obálce uvedena prázdná adresa.
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
.