Modul 1 · 1.2
SMTP: rozhovor mezi mailovými servery
Modul 1: Jak funguje e-mail · Doba čtení: 10 minut
Cíl lekce: Po této lekci dokážete přečíst SMTP rozhovor, vysvětlit, co dělají příkazy EHLO, MAIL FROM, RCPT TO a DATA, a podle odpovědního kódu poznat, zda je chyba dočasná nebo trvalá.
Klíčové pojmy: SMTP (RFC 5321), relace, EHLO/HELO, MAIL FROM, RCPT TO, DATA, QUIT, odpovědní kód (2xx, 3xx, 4xx, 5xx), rozšířený stavový kód, rozšíření (STARTTLS, AUTH, SIZE), null MX
Rozhovor v obyčejném textu
SMTP je velmi starý protokol (první verze pochází z roku 1982), a proto je velmi dobře čitelný. Dva servery si posílají řádky textu. Odesílatel (klient) posílá příkaz, příjemce (server) odpovídá trojciferným číslem a krátkým vysvětlením. Takový rozhovor si můžete doslova přečíst v chybovém hlášení nebo v logu, a právě proto se vyplatí mu rozumět.
Níže je kompletní rozhovor. S: je přijímající server, C: odesílající server. Pošta jde z anna@example.com na jan@example.net.
S: 220 mx1.mailprovider.example ESMTP ready
C: EHLO out.hosting.example
S: 250-mx1.mailprovider.example Hello out.hosting.example [192.0.2.25]
S: 250-SIZE 52428800
S: 250-8BITMIME
S: 250-STARTTLS
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 Ready to start TLS
(od tohoto okamžiku je spojení šifrované; klient znovu pošle EHLO)
C: EHLO out.hosting.example
S: 250 ...
C: MAIL FROM:<anna@example.com> SIZE=24310
S: 250 2.1.0 Ok
C: RCPT TO:<jan@example.net>
S: 250 2.1.5 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: Anna <anna@example.com>
C: To: Jan <jan@example.net>
C: Subject: Offerte
C: Date: Sun, 8 Nov 2026 10:15:00 +0100
C: Message-ID: <a1b2c3@example.com>
C:
C: Hoi Jan, hierbij de offerte.
C: .
S: 250 2.0.0 Ok: queued as 4F2A1B
C: QUIT
S: 221 2.0.0 ByePříkazy jeden po druhém
| Příkaz | Význam | Pozor |
|---|---|---|
| (navázání spojení) | Server se přivítá kódem 220 a svým jménem. | Toto se nazývá banner. Pokud server rovnou odpoví 554, znamená to, že s Vaší IP adresou vůbec nechce mluvit (často kvůli blokovacímu seznamu). |
EHLO jméno | "Dobrý den, jsem out.hosting.example." Server odpoví rozšířeními, která zná. | Jméno by mělo být skutečným jménem odesílajícího serveru, nejlépe shodným s jeho PTR záznamem (lekce 5.1). HELO je starší varianta bez rozšíření. |
STARTTLS | "Od této chvíle šifrujme." | Pouze pokud to server nabízí. Mezi servery je to obvykle dobrovolné (lekce 5.4). |
MAIL FROM:<adresa> | Odesílatel obálky (envelope sender): sem chodí chybová hlášení. | Později se z toho stává hlavička Return-Path. SPF kontroluje právě tuto adresu. Prázdného odesílatele <> používají servery pro vlastní chybová hlášení, aby bounce nikdy nevyvolal další bounce. |
RCPT TO:<adresa> | Příjemce. Může se opakovat, jeden pro každého příjemce. | Právě zde by měl server už sdělit, zda adresa existuje. 550 5.1.1 v tomto okamžiku je slušná, hned rozpoznatelná chyba. |
DATA | "Teď přijde samotná zpráva." Server odpoví 354. | Poté následují hlavičky, prázdný řádek a text zprávy. Řádek obsahující pouze tečku rozhovor ukončí. |
QUIT | Konec rozhovoru. |
Nejdůležitější poznatek: vše před DATA je obálka, vše po DATA je obsah. To, co je uvedeno v MAIL FROM, a to, co je v hlavičce From:, se dodávají odděleně a nemusí si být rovny. Server doručuje podle RCPT TO; řádek To: v obsahu při doručování nehraje žádnou roli.
Odpovědní kódy
Nejdůležitější je první číslice kódu:
| Začíná na | Význam | Co dělá odesílatel? |
|---|---|---|
| 2 | Povedlo se. | Pokračuje se dalším krokem. 250 po DATA znamená: server zprávu přijal a nyní je za ni odpovědný. |
| 3 | Pokračujte, čekám na víc. | Pouze u 354 po DATA (a při přihlašování). |
| 4 | Dočasná chyba: teď ne, zkuste to později. | Zpráva zůstává ve frontě a bude později znovu nabídnuta. |
| 5 | Trvalá chyba: toto se nepodaří. | Odesílatel to vzdá a pošle chybové hlášení (bounce) na odesílatele z obálky. |
Za trojicí čísel uvádějí moderní servery rozšířený stavový kód ve tvaru class.subject.detail (RFC 3463), například 5.1.1. První číslice je opět 2, 4 nebo 5. Druhá číslice říká, čeho se problém týká: 1 = adresa, 2 = schránka, 3 = mailový systém, 4 = síť a směrování, 5 = protokol, 6 = obsah, 7 = zabezpečení a zásady. Několik příkladů, se kterými se často setkáte:
550 5.1.1 The email account that you tried to reach does not exist
452 4.2.2 Mailbox full (dočasně)
552 5.3.4 Message size exceeds fixed limit
451 4.7.1 Greylisted, please try again later
550 5.7.1 Message rejected (zásady: spam, blokovací seznam, DMARC)V modulu 6 se naučíte přečíst kompletní bounce zprávu a najdete tam tabulku s nejčastějšími kódy.
Proč je rozdíl mezi dočasnou a trvalou chybou tak důležitý
Server, který si není jistý, často odpovídá kódem 4xx. Známým příkladem je greylisting: server, který odesílatele ještě nezná, mu poprvé řekne "zkuste to později". Skutečný mailový server se za pár minut vrátí, mnoho spamových programů nikoli. Velcí příjemci také používají 4xx ke zpomalení tempa, pokud IP adrese ještě nedůvěřují. Pro Vás jako odesílatele to znamená: zpoždění, ale ne ztrátu. Systém to obvykle vyřeší sám.
5xx je jiná situace. Tam se odesílatel znovu pokoušet nebude. Pokud dostanete 5xx, musí někdo něco změnit: adresu, obsah, nebo nastavení odesílající domény.
Nástraha: některé servery vrací 5xx, přestože je problém dočasný (například u plné schránky 552 5.2.2), a jiné vrací 4xx u něčeho, co se nikdy nepodaří. Čtěte proto vždy text za kódem, nejen samotné číslo.
Kdo je odpovědný?
Po kódu 250 na tečce ukončující DATA leží odpovědnost na přijímajícím serveru. Pokud se mu následně nepodaří zprávu uložit do schránky, musí sám odeslat chybové hlášení zpět. To je zdroj nepříjemného jevu zvaného backscatter. Server, který nejdřív všechno přijme a teprve později zjistí, že adresa neexistuje, pošle bounce na odesílatele z obálky. Pokud byl tento odesílatel podvržený spammerem, dostane bounce nevinná třetí strana. Proto by servery měly odmítat už při RCPT TO to, co stejně nepůjde doručit (viz také catch-all v lekci 3.3).
V praxi: SMTP ve vašem vlastním prostředí
Běžný uživatel vidí SMTP rozhovor zřídka celý, ale vidí jeho části:
- v bounce zprávě je poslední řádek rozhovoru, například
Remote-MTA: mx1.mailprovider.exampleaDiagnostic-Code: smtp; 550 5.1.1 ...; - v hlavičkách přijaté zprávy je u každého serveru řádek
Received:s EHLO jménem a IP adresou (lekce 1.5); - v panelu s mailovým logem, jako je E-mailové sledování v DirectAdminu u WebOké, vidíte u každé zprávy odpověď přijímajícího serveru. U jiných poskytovatelů se podobná funkce nazývá například sledování zpráv nebo mail log a obsah je srovnatelný.
Nemusíte se tedy sami připojovat k mailovému serveru, abyste si toto mohli přečíst. Kdo to přesto chce vyzkoušet: pomocí openssl s_client -starttls smtp -connect server:25 můžete vést rozhovor ručně, ale mnoho domácích poskytovatelů internetu blokuje odchozí provoz na portu 25 (lekce 1.4).
Shrnutí
- SMTP je čitelný rozhovor: EHLO, (STARTTLS), MAIL FROM, RCPT TO, DATA, QUIT.
- Vše před DATA je obálka (doručování a chybová hlášení), vše po DATA je obsah s hlavičkami, které vidíte.
- 2xx = povedlo se, 4xx = dočasně (zkusit znovu později), 5xx = trvale (bounce).
- Rozšířený kód
X.Y.Zsděluje, čeho se problém týká; X.1 adresa, X.2 schránka, X.7 zásady a zabezpečení. - Vždy čtěte text za kódem; servery nejsou vždy důsledné.
Kvíz
Úkol
Úkol Z1.2: Doména, která nepřijímá poštu. Najděte MX záznamy domény example.com. Zapište, co jste zjistili, a vyberte, co udělá odesílající server se zprávou pro info@example.com: (a) doručí ji na server s prioritou 0, (b) zkusí A záznam, (c) rovnou to vzdá, nebo (d) zkusí to znovu později. Program si živě zjistí MX záznam a výsledek zkontroluje.
Další čtení
Kroky v těchto článcích platí pro panely WebOké; u jiných poskytovatelů to funguje obdobně.
- Jak funguje odesílání e-mailů (SMTP)
- Mail delivery failed: jak rozumět chybovému hlášení a co znamenají jednotlivé kódy
- Příručka k DirectAdmin 9.3: E-mailové sledování: kam zmizela moje zpráva?
- RFC 5321 (SMTP), odstavec 3 a 4.2 (odpovědní kódy); RFC 3463 (rozšířené stavové kódy); RFC 7505 (null MX)
