1 modulis · 1.2
SMTP: pokalbis tarp pašto serverių
1 modulis: Kaip veikia el. paštas · Skaitymo trukmė: 10 min.
Mokymosi tikslas: Po šios pamokos galėsite perskaityti SMTP pokalbį, paaiškinti, ką daro EHLO, MAIL FROM, RCPT TO ir DATA, bei pagal atsakymo kodą atpažinti, ar klaida yra laikina, ar galutinė.
Pagrindinės sąvokos: SMTP (RFC 5321), sesija, EHLO/HELO, MAIL FROM, RCPT TO, DATA, QUIT, atsakymo kodas (2xx, 3xx, 4xx, 5xx), išplėstinis būsenos kodas, plėtiniai (STARTTLS, AUTH, SIZE), null MX
Pokalbis paprastu tekstu
SMTP yra labai senas protokolas (pirmoji versija datuojama 1982 metais), todėl jis itin lengvai skaitomas. Du serveriai siunčia vienas kitam teksto eilutes. Siuntėjas (klientas) siunčia komandą, gavėjas (serveris) atsako trijų skaitmenų skaičiumi ir trumpu paaiškinimu. Tokį pokalbį galite pažodžiui perskaityti klaidos pranešime ar žurnale, todėl verta jį suprasti.
Žemiau pateiktas visas pokalbis. S: žymi gaunantį serverį, C: siunčiantį serverį. Laiškas siunčiamas nuo anna@example.com gavėjui 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
(nuo šios vietos ryšys yra šifruotas; klientas iš naujo siunčia 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 ByeKomandos po vieną
| Komanda | Reikšmė | Atkreipkite dėmesį |
|---|---|---|
| (prisijungimas) | Serveris pasisveikina kodu 220 ir nurodo savo vardą. | Tai vadinama banner. Jei serveris iškart atsako 554, jis apskritai nenori bendrauti su Jūsų IP adresu (dažniausiai dėl blokavimo sąrašo). |
EHLO vardas | „Sveiki, aš esu out.hosting.example.“ Serveris atsako, nurodydamas jam žinomus plėtinius. | Vardas turėtų būti tikrasis siunčiančio serverio vardas, pageidautina sutampantis su jo PTR įrašu (pamoka 5.1). HELO yra senesnis variantas be plėtinių. |
STARTTLS | „Nuo šiol šifruokime ryšį.“ | Tik jei serveris tai siūlo. Tarp serverių tai dažniausiai yra savanoriška (pamoka 5.4). |
MAIL FROM:<adresas> | Voko siuntėjas (envelope sender): į šį adresą siunčiami klaidų pranešimai. | Vėliau tampa antrašte Return-Path. SPF tikrina būtent šį adresą. Tuščią siuntėją <> serveriai naudoja patys savo klaidų pranešimams, kad grąžintas laiškas (bounce) niekada negeneruotų kito grąžinto laiško. |
RCPT TO:<adresas> | Gavėjas. Gali kartotis kelis kartus, po vieną kiekvienam gavėjui. | Šiuo metu serveris jau turėtų pasakyti, ar adresas egzistuoja. 550 5.1.1 šiuo momentu yra tvarkinga, iš karto žinoma klaida. |
DATA | „Dabar seks pats laiškas.“ Serveris atsako 354. | Po to seka antraštės, tuščia eilutė ir tekstas. Eilutė, kurioje yra tik taškas, užbaigia perdavimą. |
QUIT | Pokalbio pabaiga. |
Svarbiausia suprasti: viskas prieš DATA yra vokas (envelope), viskas po DATA yra turinys. Tai, kas nurodyta MAIL FROM, ir tai, kas nurodyta antraštėje From:, pateikiama atskirai ir nebūtinai turi sutapti. Serveris pristato laišką pagal RCPT TO; eilutė To: turinyje pristatymui jokios reikšmės neturi.
Atsakymo kodai
Svarbiausias yra pirmasis kodo skaitmuo:
| Prasideda | Reikšmė | Ką daro siuntėjas? |
|---|---|---|
| 2 | Pavyko. | Toliau prie kito žingsnio. 250 po DATA reiškia: serveris priėmė laišką ir nuo šiol už jį atsakingas. |
| 3 | Tęskite, laukiu daugiau. | Pasitaiko tik su 354 po DATA (ir prisijungiant). |
| 4 | Laikina klaida: dabar ne, bandykite vėliau. | Laiškas lieka eilėje ir vėliau siunčiamas iš naujo. |
| 5 | Galutinė klaida: tai nepavyks. | Siuntėjas atsisako bandymo ir siunčia klaidos pranešimą (bounce) voko siuntėjo adresu. |
Už trijų skaitmenų šiuolaikiniuose serveriuose pateikiamas išplėstinis būsenos kodas formato class.subject.detail (RFC 3463), pavyzdžiui, 5.1.1. Pirmasis skaitmuo vėl yra 2, 4 arba 5. Antrasis skaitmuo nurodo temą: 1 = adresas, 2 = pašto dėžutė, 3 = pašto sistema, 4 = tinklas ir maršrutizavimas, 5 = protokolas, 6 = turinys, 7 = saugumas ir politika. Keletas dažnai sutinkamų pavyzdžių:
550 5.1.1 The email account that you tried to reach does not exist
452 4.2.2 Mailbox full (laikina)
552 5.3.4 Message size exceeds fixed limit
451 4.7.1 Greylisted, please try again later
550 5.7.1 Message rejected (politika: spam, blocklist, DMARC)6 modulyje išmoksite perskaityti visą grąžinto laiško (bounce) pranešimą ir rasite lentelę su dažniausiai pasitaikančiais kodais.
Kodėl laikina ir galutinė klaida yra tokios svarbios
Serveris, kuris abejoja, dažnai atsako 4xx kodu. Žinomas pavyzdys yra greylisting (pilkasis sąrašas): serveris, kuris dar nepažįsta siuntėjo, pirmą kartą atsako „bandykite vėliau“. Tikras pašto serveris po kelių minučių bandys dar kartą, dauguma šlamšto programų to nedarys. Dideli gavėjai taip pat naudoja 4xx kodus, kad sulėtintų siuntimo tempą, jei dar nepasitiki IP adresu. Jums, kaip siuntėjui, tai reiškia: vėlavimą, bet ne praradimą. Sistema dažniausiai tai išsprendžia pati.
5xx yra kitokia situacija. Tokiu atveju siuntėjas nebandys iš naujo. Jei gaunate 5xx atsakymą, kažkas turi pakeisti: adresą, turinį arba siunčiančio domeno nustatymus.
Spąstai: kai kurie serveriai praneša 5xx, nors problema yra laikina (pavyzdžiui, kai pašto dėžutė pilna 552 5.2.2), o kiti praneša 4xx tam, kas niekada nepavyks. Todėl visada skaitykite tekstą po kodo, o ne tik patį skaičių.
Kas yra atsakingas?
Po 250, gauto po DATA taško, atsakomybė tenka gaunančiam serveriui. Jei vėliau jam nepavyksta įkelti laiško į pašto dėžutę, jis pats turi grąžinti klaidos pranešimą. Tai yra sudėtingo reiškinio, vadinamo backscatter, priežastis. Serveris, kuris iš pradžių priima viską, o tik vėliau supranta, kad adresas neegzistuoja, siunčia grąžintą laišką (bounce) voko siuntėjo adresu. Jei tas adresas buvo suklastotas šlamšto siuntėjo, grąžintą laišką gauna nekaltas trečiasis asmuo. Todėl serveriai jau RCPT TO metu turėtų atmesti tai, kas neįmanoma (žr. taip pat catch-all pamokoje 3.3).
Praktikoje: SMTP matymas savo aplinkoje
Paprastas naudotojas retai mato visą SMTP pokalbį, tačiau mato jo dalis:
- grąžintame laiške (bounce) pateikiama paskutinė pokalbio eilutė, pavyzdžiui,
Remote-MTA: mx1.mailprovider.exampleirDiagnostic-Code: smtp; 550 5.1.1 ...; - gauto laiško antraštėse kiekvieno serverio žingsniui yra
Received:eilutė su EHLO vardu ir IP adresu (pamoka 1.5); - pašto žurnalo (maillog) skydelyje, pavyzdžiui, El. pašto sekime DirectAdmin sąsajoje pas WebOké, matote kiekvieno laiško gaunančio serverio atsakymą. Kitų paslaugų teikėjų sistemose tai gali vadintis, pavyzdžiui, pranešimų sekimu (message tracking) arba pašto žurnalu (mail log), o turinys yra panašus.
Taigi, norėdami tai perskaityti, patys neturite jungtis prie pašto serverio. Jei norite tai patys išbandyti: naudodami openssl s_client -starttls smtp -connect server:25 galite ranka vesti pokalbį, tačiau daugelis namų interneto paslaugų teikėjų blokuoja išeinantį srautą 25 prievadu (pamoka 1.4).
Santrauka
- SMTP yra lengvai skaitomas pokalbis: EHLO, (STARTTLS), MAIL FROM, RCPT TO, DATA, QUIT.
- Viskas prieš DATA yra vokas (pristatymas ir klaidų pranešimai), viskas po to yra turinys su matomomis antraštėmis.
- 2xx = pavyko, 4xx = laikina (bandoma vėliau iš naujo), 5xx = galutinė (grąžintas laiškas).
- Išplėstinis kodas
X.Y.Znurodo temą; X.1 adresas, X.2 pašto dėžutė, X.7 politika ir saugumas. - Visada skaitykite tekstą po kodo; serveriai ne visada yra nuoseklūs.
Testas
Užduotis
Užduotis Z1.2: Domenas, kuris negauna pašto. Raskite example.com MX įrašus. Įrašykite, ką radote, ir pasirinkite, ką darys siunčiantis serveris su laišku, skirtu info@example.com: (a) pristatys serveriui su prioritetu 0, (b) bandys A įrašą, (c) iš karto atsisakys, arba (d) bandys vėliau iš naujo. Programa tiesiogiai patikrina MX įrašą ir įvertina atsakymą.
Skaitykite daugiau
Šiuose straipsniuose aprašyti žingsniai galioja WebOké valdymo skydeliams; kitų paslaugų teikėjų atveju veikimas yra panašus.
- El. laiškų siuntimo proceso / SMTP paaiškinimas
- Mail delivery failed: kaip perskaityti klaidos pranešimą ir ką reiškia jo kodai
- DirectAdmin vadovas 9.3: El. pašto sekimas: kur dingo mano laiškas?
- RFC 5321 (SMTP), 3 ir 4.2 skyriai (atsakymo kodai); RFC 3463 (išplėstiniai būsenos kodai); RFC 7505 (null MX)
