SMTP: rozmowa między serwerami pocztowymi
Moduł 1: Jak działa poczta e-mail · Czas czytania: 10 minut
Cel lekcji: Po tej lekcji będą Państwo potrafili odczytać rozmowę SMTP, wyjaśnić, do czego służą EHLO, MAIL FROM, RCPT TO i DATA, oraz rozpoznać na podstawie kodu odpowiedzi, czy błąd jest tymczasowy, czy ostateczny.
Kluczowe pojęcia: SMTP (RFC 5321), sesja, EHLO/HELO, MAIL FROM, RCPT TO, DATA, QUIT, kod odpowiedzi (2xx, 3xx, 4xx, 5xx), rozszerzony kod statusu, rozszerzenia (STARTTLS, AUTH, SIZE), null MX
Rozmowa w zwykłym tekście
SMTP to bardzo stary protokół (pierwsza wersja pochodzi z 1982 roku) i dlatego jest wyjątkowo czytelny. Dwa serwery wysyłają do siebie linijki tekstu. Nadawca (klient) wysyła polecenie, odbiorca (serwer) odpowiada trzycyfrową liczbą wraz z krótkim wyjaśnieniem. Taką rozmowę można dosłownie odczytać w komunikacie o błędzie lub w logu, i właśnie dlatego warto ją rozumieć.
Poniżej pełna rozmowa. S: oznacza serwer odbierający, C: serwer wysyłający. Wiadomość trafia z anna@example.com do 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 tego momentu połączenie jest szyfrowane; klient ponownie wysyła 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 ByePolecenia po kolei
| Polecenie | Znaczenie | Na co zwrócić uwagę |
|---|---|---|
| (nawiązanie połączenia) | Serwer wita się kodem 220 i swoją nazwą. | Nazywa się to banerem. Jeśli serwer od razu odpowie 554, oznacza to, że w ogóle nie chce rozmawiać z Państwa adresem IP (często z powodu wpisu na listę blokującą). |
EHLO nazwa | "Witam, jestem out.hosting.example." Serwer odpowiada rozszerzeniami, które obsługuje. | Nazwa powinna być rzeczywistą nazwą serwera wysyłającego, najlepiej zgodną z jego rekordem PTR (lekcja 5.1). HELO to starszy wariant bez rozszerzeń. |
STARTTLS | "Od teraz szyfrujmy połączenie." | Tylko jeśli serwer to oferuje. Między serwerami jest to zwykle opcjonalne (lekcja 5.4). |
MAIL FROM:<adres> | Nadawca koperty: tutaj trafiają komunikaty o błędach. | Później staje się nagłówkiem Return-Path. SPF sprawdza właśnie ten adres. Pusty nadawca <> jest używany przez serwery do własnych komunikatów o błędach, dzięki czemu zwrot (bounce) nigdy nie generuje kolejnego zwrotu. |
RCPT TO:<adres> | Odbiorca. Może wystąpić wielokrotnie, po jednym razie na odbiorcę. | Już tutaj serwer powinien powiedzieć, czy adres istnieje. Kod 550 5.1.1 w tym momencie to czytelny, natychmiastowo rozpoznawalny błąd. |
DATA | "Teraz nadejdzie sama wiadomość." Serwer odpowiada kodem 354. | Następnie podawane są nagłówki, pusta linia i treść. Linia zawierająca wyłącznie kropkę kończy wiadomość. |
QUIT | Koniec rozmowy. |
Najważniejsza zasada: wszystko przed DATA to koperta, wszystko po DATA to treść. To, co znajduje się w MAIL FROM, i to, co znajduje się w nagłówku From:, są podawane oddzielnie i nie muszą być takie same. Serwer dostarcza wiadomość na podstawie RCPT TO; linia To: w treści nie ma przy doręczaniu żadnego znaczenia.
Kody odpowiedzi
Najważniejsza jest pierwsza cyfra kodu:
| Zaczyna się od | Znaczenie | Co robi nadawca? |
|---|---|---|
| 2 | Sukces. | Przejście do kolejnego kroku. Kod 250 po DATA oznacza, że serwer przyjął wiadomość i od tej chwili to on jest za nią odpowiedzialny. |
| 3 | Kontynuuj, czekam na dalsze dane. | Występuje tylko przy 354 po DATA (oraz przy logowaniu). |
| 4 | Błąd tymczasowy: nie teraz, proszę spróbować później. | Wiadomość pozostaje w kolejce i jest ponownie przesyłana później. |
| 5 | Błąd ostateczny: to się nie uda. | Nadawca rezygnuje i wysyła komunikat o błędzie (zwrot, bounce) do nadawcy koperty. |
Za trzema cyframi na nowoczesnych serwerach pojawia się rozszerzony kod statusu w postaci class.subject.detail (RFC 3463), na przykład 5.1.1. Pierwsza cyfra to znowu 2, 4 lub 5. Druga cyfra wskazuje, czego dotyczy problem: 1 = adres, 2 = skrzynka pocztowa, 3 = system pocztowy, 4 = sieć i trasowanie, 5 = protokół, 6 = treść, 7 = bezpieczeństwo i polityka. Kilka przykładów, które często można spotkać:
550 5.1.1 The email account that you tried to reach does not exist
452 4.2.2 Mailbox full (tymczasowo)
552 5.3.4 Message size exceeds fixed limit
451 4.7.1 Greylisted, please try again later
550 5.7.1 Message rejected (polityka: spam, lista blokująca, DMARC)W module 6 nauczą się Państwo odczytywać pełny zwrot (bounce) i znajdą tam tabelę z najczęściej występującymi kodami.
Dlaczego rozróżnienie na tymczasowy i ostateczny jest tak ważne
Serwer, który ma wątpliwości, często odpowiada kodem 4xx. Znanym przykładem jest greylisting: serwer, który jeszcze nie zna danego nadawcy, za pierwszym razem odpowiada "proszę spróbować później". Prawdziwy serwer pocztowy wraca po kilku minutach, wiele programów rozsyłających spam tego nie robi. Również duzi odbiorcy stosują kod 4xx, aby spowolnić tempo, jeśli jeszcze nie ufają danemu adresowi IP. Dla Państwa jako nadawcy oznacza to: opóźnienie, ale nie utratę wiadomości. System zwykle sam sobie z tym radzi.
Kod 5xx jest inny. W tym przypadku nadawca nie podejmuje ponownej próby. Jeśli otrzymają Państwo kod 5xx, ktoś musi coś zmienić: adres, treść lub ustawienia domeny wysyłającej.
Pułapka: niektóre serwery zwracają kod 5xx, mimo że problem jest tymczasowy (na przykład przy pełnej skrzynce pocztowej 552 5.2.2), a inne zwracają kod 4xx dla czegoś, co nigdy się nie uda. Dlatego zawsze należy czytać tekst znajdujący się za kodem, nie tylko samą liczbę.
Kto ponosi odpowiedzialność?
Po kodzie 250 na zakończenie DATA odpowiedzialność przechodzi na serwer odbierający. Jeśli później nie uda mu się umieścić wiadomości w skrzynce pocztowej, musi sam odesłać komunikat o błędzie. To właśnie źródło trudnego zjawiska zwanego backscatter. Serwer, który najpierw przyjmuje wszystko, a dopiero później stwierdza, że adres nie istnieje, wysyła zwrot (bounce) do nadawcy koperty. Jeśli ten adres został sfałszowany przez spamera, zwrot trafia do niewinnej osoby trzeciej. Dlatego serwery powinny odrzucać to, co niemożliwe, już na etapie RCPT TO (zob. również catch-all w lekcji 3.3).
W praktyce: SMTP we własnym środowisku
Zwykły użytkownik rzadko widzi całą rozmowę SMTP, ale widzi jej fragmenty:
- w zwrocie (bounce) znajduje się ostatnia linia rozmowy, na przykład
Remote-MTA: mx1.mailprovider.exampleorazDiagnostic-Code: smtp; 550 5.1.1 ...; - w nagłówkach otrzymanej wiadomości dla każdego serwera znajduje się linia
Received:z nazwą EHLO i adresem IP (lekcja 1.5); - w panelu z logiem poczty, takim jak Śledzenie e-mail w DirectAdmin u WebOké, widzą Państwo odpowiedź serwera odbierającego dla każdej wiadomości. U innych dostawców taka funkcja może nazywać się na przykład śledzeniem wiadomości lub dziennikiem poczty (mail log), a jej zawartość jest podobna.
Nie muszą więc Państwo sami łączyć się z serwerem pocztowym, aby to odczytać. Dla osób, które chciałyby spróbować: za pomocą openssl s_client -starttls smtp -connect server:25 można prowadzić taką rozmowę ręcznie, jednak wielu dostawców usług domowych blokuje ruch wychodzący na porcie 25 (lekcja 1.4).
Podsumowanie
- SMTP to czytelna rozmowa: EHLO, (STARTTLS), MAIL FROM, RCPT TO, DATA, QUIT.
- Wszystko przed DATA to koperta (doręczenie i komunikaty o błędach), wszystko po DATA to treść wraz z widocznymi nagłówkami.
- 2xx = sukces, 4xx = tymczasowo (ponowna próba później), 5xx = ostatecznie (zwrot, bounce).
- Rozszerzony kod
X.Y.Zwskazuje, czego dotyczy problem: X.1 adres, X.2 skrzynka pocztowa, X.7 polityka i bezpieczeństwo. - Zawsze należy czytać tekst znajdujący się za kodem; serwery nie zawsze są konsekwentne.
Quiz
Zadanie
Zadanie Z1.2: Domena, która nie odbiera poczty. Proszę wyszukać rekordy MX domeny example.com. Proszę wpisać, co Państwo znaleźli, i wybrać, co zrobi serwer wysyłający z wiadomością do info@example.com: (a) dostarczy ją do serwera z priorytetem 0, (b) spróbuje skorzystać z rekordu A, (c) od razu zrezygnuje, czy (d) spróbuje ponownie później. Program na bieżąco sprawdza rekord MX i weryfikuje odpowiedź.
Dowiedz się więcej
Kroki opisane w tych artykułach dotyczą paneli WebOké; u innych dostawców działa to w podobny sposób.
- Jak działa wysyłanie wiadomości e-mail / SMTP
- Mail delivery failed: jak odczytać komunikat o błędzie i co oznaczają poszczególne kody
- Instrukcja DirectAdmin 9.3: Śledzenie e-mail: gdzie podziała się moja wiadomość?
- RFC 5321 (SMTP), paragraf 3 i 4.2 (kody odpowiedzi); RFC 3463 (rozszerzone kody statusu); RFC 7505 (null MX)
