Moodul 1 · 1.2
SMTP: vestlus meiliserverite vahel
Moodul 1: Kuidas e-post töötab · Lugemisaeg: 10 minutit
Õpieesmärk: pärast seda tundi oskad lugeda SMTP vestlust, selgitada, mida teevad EHLO, MAIL FROM, RCPT TO ja DATA, ning vastuskoodist näha, kas viga on ajutine või lõplik.
Põhimõisted: SMTP (RFC 5321), seanss, EHLO/HELO, MAIL FROM, RCPT TO, DATA, QUIT, vastuskood (2xx, 3xx, 4xx, 5xx), laiendatud staatuskood, laiendused (STARTTLS, AUTH, SIZE), null MX
Vestlus tavalises tekstis
SMTP on väga vana protokoll (esimene versioon on aastast 1982) ja seetõttu väga lihtsalt loetav. Kaks serverit saadavad üksteisele tekstiridu. Saatja (klient) saadab käsu, vastuvõtja (server) vastab kolmekohalise numbri ja lühikese selgitusega. Sellist vestlust saad sõna-sõnalt tagasi lugeda veateatest või logifailist, ja just seepärast tasub seda mõista.
Allpool on terviklik vestlus. S: on vastuvõttev server, C: saatev server. Kiri läheb aadressilt anna@example.com aadressile 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
(siit alates on ühendus krüpteeritud; klient saadab uuesti 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 ByeKäsud ükshaaval
| Käsk | Tähendus | Tähele pane |
|---|---|---|
| (ühendumine) | Server tervitab koodiga 220 ja oma nimega. | Seda nimetatakse banneriks. Kui server ütleb kohe 554, ei taha ta su IP-aadressiga üldse rääkida (sageli on tegu blokeerimisloendiga). |
EHLO nimi | "Tere, mina olen out.hosting.example." Server vastab laiendustega, mida ta tunneb. | Nimi peaks olema saatva serveri tegelik nimi, soovitatavalt sama mis tema PTR-kirjes (tund 5.1). HELO on vanem variant ilma laiendusteta. |
STARTTLS | "Hakkame nüüdsest krüpteerima." | Ainult siis, kui server seda pakub. Serverite vahel on see enamasti vabatahtlik (tund 5.4). |
MAIL FROM:<aadress> | Envelope sender: siia lähevad veateated. | Sellest saab hiljem päiserida Return-Path. SPF kontrollib seda aadressi. Tühja saatja <> kasutavad serverid ise veateadete jaoks, et tagastuskiri ei tekitaks omakorda tagastuskirja. |
RCPT TO:<aadress> | Vastuvõtja. Võib korduda mitu korda, üks iga vastuvõtja kohta. | Siin peaks server juba ütlema, kas aadress on olemas. 550 5.1.1 sel hetkel on korralik, kohe teadaolev viga. |
DATA | "Nüüd tuleb kiri ise." Server vastab 354. | Seejärel järgnevad päiseread, tühi rida ja tekst. Rida, mis sisaldab ainult punkti, lõpetab selle. |
QUIT | Vestluse lõpp. |
Kõige olulisem mõte: kõik enne DATA-d on envelope (envelope), kõik pärast seda on sisu. See, mis seisab MAIL FROM-is ja mis seisab päiserias From:, antakse eraldi ega pea olema sama. Server toimetab kirja kohale RCPT TO järgi; sisu To:-rida kohaletoimetamisel rolli ei mängi.
Vastuskoodid
Koodi esimene number on kõige olulisem:
| Algab numbriga | Tähendus | Mida saatja teeb? |
|---|---|---|
| 2 | Õnnestus. | Edasi järgmise sammu juurde. 250 pärast DATA-t tähendab: server on kirja vastu võtnud ja on nüüd selle eest vastutav. |
| 3 | Jätka, ma ootan veel. | Ainult koodi 354 puhul pärast DATA-t (ja sisselogimisel). |
| 4 | Ajutine viga: mitte praegu, proovi hiljem. | Kiri jääb järjekorda ja pakutakse hiljem uuesti. |
| 5 | Lõplik viga: see ei õnnestu. | Saatja loobub ja saadab veateate (tagastuskirja) envelope sender'ile. |
Kolme numbri taga on kaasaegsetel serveritel laiendatud staatuskood kujul class.subject.detail (RFC 3463), näiteks 5.1.1. Esimene number on jälle 2, 4 või 5. Teine number ütleb, millest jutt käib: 1 = aadress, 2 = mailbox, 3 = meilisüsteem, 4 = võrk ja marsruutimine, 5 = protokoll, 6 = sisu, 7 = turvalisus ja reeglid. Mõned, mida tihti näed:
550 5.1.1 The email account that you tried to reach does not exist
452 4.2.2 Mailbox full (ajutine)
552 5.3.4 Message size exceeds fixed limit
451 4.7.1 Greylisted, please try again later
550 5.7.1 Message rejected (reegel: rämpspost, blokeerimisloend, DMARC)Moodulis 6 õpid lugema tervet tagastuskirja ja leiad tabeli kõige levinumate koodidega.
Miks ajutine ja lõplik on nii olulised
Server, kes kahtleb, vastab sageli koodiga 4xx. Tuntud näide on greylisting: server, kes saatjat veel ei tunne, ütleb esimesel korral "proovi hiljem". Pärisserver tuleb mõne minuti pärast tagasi, paljud rämpspostiprogrammid mitte. Ka suured vastuvõtjad kasutavad 4xx-koodi, et aeglustada tempot, kui nad veel ei usalda mingit IP-aadressi. Sinu kui saatja jaoks tähendab see: viivitus, kuid mitte kadu. Süsteem lahendab selle enamasti ise.
5xx on teistsugune. Sellisel juhul ei proovi saatja uuesti. Kui saad 5xx vastuse, peab keegi midagi muutma: aadressi, sisu või saatva domeeni seadistusi.
Üks lõks: mõned serverid annavad 5xx vastuse, kuigi probleem on ajutine (näiteks täis mailbox'i korral 552 5.2.2), ja teised annavad 4xx vastuse millegi kohta, mis ei õnnestu kunagi. Loe seega alati koodi taga olevat teksti, mitte ainult numbrit.
Kes vastutab?
Pärast 250 koodi DATA punkti juures lasub vastutus vastuvõtval serveril. Kui ta hiljem ei suuda kirja mailboxi panna, peab ta ise saatma veateate tagasi. See on tüütu nähtuse, backscatter, allikas. Server, kes kõigepealt kõik vastu võtab ja alles hiljem taipab, et aadressi pole olemas, saadab tagastuskirja envelope sender'ile. Kui see oli rämpspostitaja poolt võltsitud, saab veateate süütu kolmas osapool. Seepärast peaksid serverid tagasi lükkama juba RCPT TO juures selle, mis ei ole võimalik (vaata ka catch-all tunnis 3.3).
Praktikas: SMTP nägemine enda keskkonnas
Tavaline kasutaja näeb SMTP vestlust harva täies ulatuses, kuid tükkide kaupa küll:
- tagastuskirjas on vestluse viimane rida, näiteks
Remote-MTA: mx1.mailprovider.examplejaDiagnostic-Code: smtp; 550 5.1.1 ...; - vastuvõetud kirja päiseridades on iga serveri kohta
Received:-rida koos EHLO-nime ja IP-aadressiga (tund 1.5); - meililogi paneelis, näiteks WebOké DirectAdminis oleva E-mail Trackingu puhul, näed iga kirja kohta vastuvõtva serveri vastust. Teiste pakkujate juures nimetatakse seda näiteks sõnumijälgimiseks või mail log'iks ning sisu on sarnane.
Sa ei pea seega ise serveriga ühendust looma, et seda lugeda. Kes soovib siiski proovida: käsuga openssl s_client -starttls smtp -connect server:25 saad vestlust käsitsi läbi viia, kuid paljud koduinterneti pakkujad blokeerivad väljuvat liiklust pordil 25 (tund 1.4).
Kokkuvõte
- SMTP on loetav vestlus: EHLO, (STARTTLS), MAIL FROM, RCPT TO, DATA, QUIT.
- Kõik enne DATA-d on envelope (kohaletoimetamine ja veateated), kõik pärast seda on sisu koos nähtavate päiseridadega.
- 2xx = õnnestus, 4xx = ajutine (proovitakse hiljem uuesti), 5xx = lõplik (tagastuskiri).
- Laiendatud kood
X.Y.Zütleb, millest jutt käib; X.1 aadress, X.2 mailbox, X.7 reeglid ja turvalisus. - Loe alati koodi taga olevat teksti; serverid ei ole alati järjepidevad.
Test
Ülesanne
Ülesanne Z1.2: Domeen, mis meili vastu ei võta. Otsi üles domeeni example.com MX-kirjed. Kirjuta üles, mida leiad, ja vali, mida teeb saatev server kirjaga aadressile info@example.com: (a) toimetab kohale serverile prioriteediga 0, (b) proovib A-kirjet, (c) loobub kohe, või (d) proovib hiljem uuesti. Programm pärib MX-kirje reaalajas ja kontrollib vastust.
Lisalugemine
Nendes artiklites kirjeldatud sammud kehtivad WebOké paneelide kohta; teiste pakkujate juures töötab see sarnaselt.
- E-kirjade saatmise protsess / SMTP
- E-kirja kohaletoimetamine ebaõnnestus: nii loed veateadet ja mida koodid tähendavad
- DirectAdmin juhend 9.3: E-mail Tracking: kuhu mu kiri jäi?
- RFC 5321 (SMTP), lõik 3 ja 4.2 (vastuskoodid); RFC 3463 (laiendatud staatuskoodid); RFC 7505 (null MX)
