Modul 1 · 1.2
SMTP: razgovor između mail servera
Modul 1: Kako funkcionira e-mail · Vrijeme čitanja: 10 minuta
Cilj učenja: Nakon ove lekcije moći ćete pročitati SMTP razgovor, objasniti što rade EHLO, MAIL FROM, RCPT TO i DATA, te prepoznati iz koda odgovora je li greška privremena ili trajna.
Ključni pojmovi: SMTP (RFC 5321), sesija, EHLO/HELO, MAIL FROM, RCPT TO, DATA, QUIT, kod odgovora (2xx, 3xx, 4xx, 5xx), prošireni kod statusa, proširenja (STARTTLS, AUTH, SIZE), null MX
Razgovor u običnom tekstu
SMTP je vrlo star protokol (prva verzija je iz 1982. godine) i stoga vrlo čitljiv. Dva servera šalju jedan drugome retke teksta. Pošiljatelj (klijent) šalje naredbu, primatelj (server) odgovara brojem od tri znamenke i kratkim objašnjenjem. Takav razgovor možete doslovno pročitati u poruci o grešci ili zapisniku (log), pa se zato isplati razumjeti ga.
U nastavku je potpuni razgovor. S: je server primatelja, C: je server pošiljatelja. Pošta ide od anna@example.com prema 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 ovog trenutka veza je šifrirana; klijent ponovno šalje 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 ByeNaredbe jedna po jedna
| Naredba | Značenje | Obratite pozornost |
|---|---|---|
| (povezivanje) | Server pozdravlja s 220 i svojim imenom. | Ovo se naziva banner. Ako server odmah kaže 554, to znači da uopće ne želi komunicirati s Vašom IP adresom (često zbog liste blokiranih). |
EHLO ime | "Pozdrav, ja sam out.hosting.example." Server odgovara s proširenjima koja poznaje. | Ime bi trebalo biti stvarno ime servera pošiljatelja, po mogućnosti jednako njegovom PTR zapisu (lekcija 5.1). HELO je stara inačica bez proširenja. |
STARTTLS | "Hajdemo odsad šifrirati." | Samo ako server to nudi. Između servera ovo je obično dobrovoljno (lekcija 5.4). |
MAIL FROM:<adresa> | Pošiljatelj omotnice (envelope sender): ovdje idu poruke o greškama. | Kasnije postaje zaglavlje Return-Path. SPF provjerava ovu adresu. Praznog pošiljatelja <> serveri koriste za vlastite poruke o greškama, kako bi se izbjeglo da povratna poruka (bounce) stvori novu povratnu poruku. |
RCPT TO:<adresa> | Primatelj. Može se ponoviti više puta, jednom za svakog primatelja. | Ovdje bi server već trebao reći postoji li adresa. 550 5.1.1 u ovom trenutku je uredna, odmah prepoznatljiva greška. |
DATA | "Sada slijedi sama poruka." Server odgovara s 354. | Zatim slijede zaglavlja, prazan redak i tekst. Redak koji sadrži samo točku završava poruku. |
QUIT | Kraj razgovora. |
Najvažnija spoznaja: sve prije DATA je omotnica (envelope), sve nakon DATA je sadržaj. Ono što piše u MAIL FROM i ono što piše u zaglavlju From: dostavljaju se odvojeno i ne moraju biti jednaki. Server dostavlja poštu prema RCPT TO; redak To: u sadržaju nema ulogu u dostavi.
Kodovi odgovora
Prva znamenka koda je najvažnija:
| Počinje s | Značenje | Što radi pošiljatelj? |
|---|---|---|
| 2 | Uspjelo. | Nastavlja se na sljedeći korak. 250 nakon DATA znači: server je prihvatio poštu i sada je odgovoran za nju. |
| 3 | Nastavite, čekam još podataka. | Pojavljuje se samo kod 354 nakon DATA (i kod prijave). |
| 4 | Privremena greška: ne sada, pokušajte kasnije. | Pošta ostaje u redu čekanja i ponovno se nudi kasnije. |
| 5 | Trajna greška: ovo neće uspjeti. | Pošiljatelj odustaje i šalje poruku o grešci (bounce) na adresu pošiljatelja iz omotnice. |
Iza tri znamenke moderni serveri dodaju prošireni kod statusa u obliku class.subject.detail (RFC 3463), na primjer 5.1.1. Prva znamenka je ponovno 2, 4 ili 5. Druga znamenka govori o čemu se radi: 1 = adresa, 2 = mailbox, 3 = sustav pošte, 4 = mreža i usmjeravanje, 5 = protokol, 6 = sadržaj, 7 = sigurnost i pravila. Nekoliko primjera koje često viđate:
550 5.1.1 The email account that you tried to reach does not exist
452 4.2.2 Mailbox full (tijdelijk)
552 5.3.4 Message size exceeds fixed limit
451 4.7.1 Greylisted, please try again later
550 5.7.1 Message rejected (beleid: spam, blocklist, DMARC)U modulu 6 naučit ćete pročitati potpunu povratnu poruku (bounce) i pronaći ćete tablicu s kodovima koji se najčešće pojavljuju.
Zašto je razlika između privremenog i trajnog toliko važna
Server koji dvoji, često odgovara kodom 4xx. Poznat primjer je greylisting: server koji još ne poznaje pošiljatelja prvi put kaže "pokušajte kasnije". Pravi mail server vratit će se za nekoliko minuta, mnogi spam programi neće. I veliki primatelji koriste 4xx kako bi usporili tempo ako još ne vjeruju IP adresi. Za Vas kao pošiljatelja to znači: kašnjenje, ali ne i gubitak. Sustav to obično sam riješi.
5xx je nešto drugo. Tu pošiljatelj neće ponovno pokušati. Ako dobijete 5xx, netko mora nešto promijeniti: adresu, sadržaj ili postavke domene pošiljatelja.
Zamka: neki serveri daju 5xx dok je problem zapravo privremen (na primjer kod pune mailbox 552 5.2.2), a drugi daju 4xx za nešto što nikada neće uspjeti. Zato uvijek čitajte tekst iza koda, ne samo broj.
Tko je odgovoran?
Nakon 250 na točku kojom završava DATA, odgovornost leži na serveru primatelja. Ako mu kasnije ne uspije smjestiti poštu u mailbox, mora sam poslati poruku o grešci natrag. To je izvor neugodne pojave: backscatter. Server koji prvo prihvati sve, a tek kasnije otkrije da adresa ne postoji, šalje povratnu poruku (bounce) na adresu pošiljatelja iz omotnice. Ako je ta adresa bila lažirana od strane spamera, nevina treća strana dobiva povratnu poruku. Zato bi serveri trebali odbiti ono što ne može uspjeti već kod RCPT TO (vidi i catch-all u lekciji 3.3).
U praksi: SMTP u Vašem vlastitom okruženju
Obični korisnik rijetko vidi cijeli SMTP razgovor, ali ga vidi u dijelovima:
- u povratnoj poruci (bounce) nalazi se posljednji redak razgovora, na primjer
Remote-MTA: mx1.mailprovider.exampleiDiagnostic-Code: smtp; 550 5.1.1 ...; - u zaglavljima primljene poruke nalazi se po server redak
Received:s EHLO imenom i IP adresom (lekcija 1.5); - u panelu sa zapisnikom pošte, poput E-mail Tracking u DirectAdmin kod WebOké, vidite po poruci odgovor servera primatelja. Kod drugih pružatelja usluga ovo se naziva na primjer praćenje poruka ili mail log, a sadržaj je sličan.
Dakle, ne morate se sami povezati s mail serverom da biste to mogli pročitati. Tko to ipak želi isprobati: naredbom openssl s_client -starttls smtp -connect server:25 možete ručno voditi razgovor, ali mnogi kućni pružatelji internetske usluge blokiraju odlazni promet na priključku 25 (lekcija 1.4).
Sažetak
- SMTP je čitljiv razgovor: EHLO, (STARTTLS), MAIL FROM, RCPT TO, DATA, QUIT.
- Sve prije DATA je omotnica (dostava i poruke o greškama), sve nakon toga je sadržaj sa zaglavljima koja vidite.
- 2xx = uspjelo, 4xx = privremeno (ponovni pokušaj kasnije), 5xx = trajno (bounce).
- Prošireni kod
X.Y.Zgovori o čemu se radi; X.1 adresa, X.2 mailbox, X.7 pravila i sigurnost. - Uvijek čitajte tekst iza koda; serveri nisu uvijek dosljedni.
Kviz
Zadatak
Zadatak Z1.2: Domena koja ne prima poštu. Potražite MX zapise domene example.com. Unesite što ste pronašli i odaberite što server pošiljatelja radi s poštom za info@example.com: (a) dostavlja na server s prioritetom 0, (b) pokušava A zapis, (c) odmah odustaje, ili (d) pokušava ponovno kasnije. Program uživo dohvaća MX zapis i provjerava.
Dodatno štivo
Koraci u ovim člancima vrijede za panele WebOké; kod drugih pružatelja usluga rad je sličan.
- Objašnjenje postupka slanja e-pošte / SMTP
- Neuspjela dostava e-pošte: kako pročitati poruku o pogrešci i što kodovi znače
- DirectAdmin priručnik 9.3: E-mail Tracking: gdje je nestala moja pošta?
- RFC 5321 (SMTP), odjeljak 3 i 4.2 (kodovi odgovora); RFC 3463 (prošireni kodovi statusa); RFC 7505 (null MX)
