Moduuli 1 · 1.2
SMTP: sähköpostipalvelimien välinen keskustelu
Moduuli 1: Näin sähköposti toimii · Lukuaika: 10 minuuttia
Oppimistavoite: Tämän oppitunnin jälkeen osaat lukea SMTP-keskustelun, selittää mitä EHLO, MAIL FROM, RCPT TO ja DATA tekevät, ja nähdä vastauskoodista, onko virhe tilapäinen vai lopullinen.
Keskeiset käsitteet: SMTP (RFC 5321), istunto, EHLO/HELO, MAIL FROM, RCPT TO, DATA, QUIT, vastauskoodi (2xx, 3xx, 4xx, 5xx), laajennettu tilakoodi, laajennukset (STARTTLS, AUTH, SIZE), null MX
Keskustelu tavallisella tekstillä
SMTP on hyvin vanha protokolla (ensimmäinen versio on vuodelta 1982) ja siksi hyvin luettava. Kaksi palvelinta lähettää toisilleen tekstirivejä. Lähettäjä (client) lähettää komennon, vastaanottaja (server) vastaa kolminumeroisella luvulla ja lyhyellä selityksellä. Tällaisen keskustelun voi lukea kirjaimellisesti virheilmoituksesta tai lokista, ja juuri siksi kannattaa ymmärtää se.
Alla täydellinen keskustelu. S: on vastaanottava palvelin, C: lähettävä palvelin. Posti kulkee osoitteesta anna@example.com osoitteeseen 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
(tästä eteenpäin yhteys on salattu; client lähettää uudelleen EHLO:n)
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 ByeKomennot yksi kerrallaan
| Komento | Merkitys | Huomioitavaa |
|---|---|---|
| (yhteyden muodostus) | Palvelin tervehtii koodilla 220 ja omalla nimellään. | Tätä kutsutaan banneriksi. Jos palvelin sanoo heti 554, se ei halua puhua IP-osoitteesi kanssa lainkaan (usein estolista). |
EHLO nimi | "Hei, olen out.hosting.example." Palvelin vastaa tuntemillaan laajennuksilla. | Nimen pitäisi olla lähettävän palvelimen todellinen nimi, mieluiten sama kuin sen PTR-tietue (oppitunti 5.1). HELO on vanha versio ilman laajennuksia. |
STARTTLS | "Salataan yhteys tästä eteenpäin." | Vain jos palvelin tarjoaa sitä. Palvelinten välillä tämä on yleensä vapaaehtoista (oppitunti 5.4). |
MAIL FROM:<osoite> | Envelope sender (envelope-lähettäjä): tänne menevät virheilmoitukset. | Tästä tulee myöhemmin otsikkorivi Return-Path. SPF tarkistaa tämän osoitteen. Tyhjää lähettäjää <> käyttävät palvelimet itse virheilmoituksissa, jotta bounce ei koskaan tuota uutta bouncea. |
RCPT TO:<osoite> | Vastaanottaja. Voi esiintyä useita kertoja, yksi per vastaanottaja. | Tässä kohtaa palvelimen pitäisi jo kertoa, onko osoite olemassa. 550 5.1.1 tässä vaiheessa on siisti ja heti tunnistettava virhe. |
DATA | "Nyt tulee itse viesti." Palvelin vastaa 354. | Sen jälkeen tulevat otsikkorivit, tyhjä rivi ja teksti. Rivi, jolla on vain piste, päättää viestin. |
QUIT | Keskustelun loppu. |
Tärkein oivallus: kaikki ennen DATA:a on envelope (kirjekuori), kaikki sen jälkeen on sisältö. Se, mitä MAIL FROM:ssa lukee ja mitä otsikkorivillä From: lukee, toimitetaan erikseen eivätkä ne tarvitse olla samat. Palvelin toimittaa viestin RCPT TO:n perusteella; sisällön To:-rivillä ei ole merkitystä toimituksessa.
Vastauskoodit
Koodin ensimmäinen numero on tärkein:
| Alkaa numerolla | Merkitys | Mitä lähettäjä tekee? |
|---|---|---|
| 2 | Onnistui. | Jatketaan seuraavaan vaiheeseen. 250 DATA:n jälkeen tarkoittaa: palvelin on ottanut viestin vastaan ja on nyt siitä vastuussa. |
| 3 | Jatka, odotan lisää. | Vain koodilla 354 DATA:n jälkeen (ja kirjautumisen yhteydessä). |
| 4 | Tilapäinen virhe: ei nyt, yritä myöhemmin. | Viesti jää jonoon ja tarjotaan myöhemmin uudelleen. |
| 5 | Pysyvä virhe: tämä ei tule onnistumaan. | Lähettäjä luovuttaa ja lähettää virheilmoituksen (bounce) envelope senderille. |
Kolmen numeron jälkeen nykyaikaiset palvelimet näyttävät laajennetun tilakoodin muodossa class.subject.detail (RFC 3463), esimerkiksi 5.1.1. Ensimmäinen numero on jälleen 2, 4 tai 5. Toinen numero kertoo, mistä on kyse: 1 = osoite, 2 = mailbox, 3 = postijärjestelmä, 4 = verkko ja reititys, 5 = protokolla, 6 = sisältö, 7 = turvallisuus ja käytäntö. Muutama usein näkyvä esimerkki:
550 5.1.1 The email account that you tried to reach does not exist
452 4.2.2 Mailbox full (tilapäinen)
552 5.3.4 Message size exceeds fixed limit
451 4.7.1 Greylisted, please try again later
550 5.7.1 Message rejected (käytäntö: roskaposti, estolista, DMARC)Moduulissa 6 opit lukemaan koko bouncen ja löydät taulukon yleisimmistä koodeista.
Miksi tilapäisen ja pysyvän ero on niin tärkeä
Epäröivä palvelin vastaa usein koodilla 4xx. Tunnettu esimerkki on greylisting: palvelin, joka ei vielä tunne lähettäjää, sanoo ensimmäisellä kerralla "yritä myöhemmin uudelleen". Oikea sähköpostipalvelin palaa asiaan muutaman minuutin kuluttua, moni roskapostiohjelma ei. Myös suuret vastaanottajat käyttävät 4xx:ää tahdin hidastamiseen, jos ne eivät vielä luota IP-osoitteeseen. Sinulle lähettäjänä tämä tarkoittaa: viivettä, mutta ei menetystä. Järjestelmä hoitaa asian yleensä itse.
5xx on eri asia. Silloin lähettäjä ei yritä uudelleen. Jos saat 5xx-vastauksen, jonkun pitää muuttaa jotain: osoitetta, sisältöä tai lähettävän verkkotunnuksen asetuksia.
Yksi sudenkuoppa: osa palvelimista antaa 5xx-vastauksen vaikka ongelma on tilapäinen (esimerkiksi täysi mailbox, 552 5.2.2), ja toiset antavat 4xx-vastauksen asialle, joka ei koskaan onnistu. Lue siis aina koodin perässä oleva teksti, älä pelkästään numeroa.
Kuka on vastuussa?
Kun DATA:n lopettava piste on saanut vastauksen 250, vastuu siirtyy vastaanottavalle palvelimelle. Jos se ei sen jälkeen onnistu viemään viestiä mailboxiin, sen täytyy itse lähettää virheilmoitus takaisin. Tästä syntyy hankala ilmiö: backscatter. Palvelin, joka ensin ottaa kaiken vastaan ja vasta myöhemmin huomaa, ettei osoite ole olemassa, lähettää bouncen envelope senderille. Jos tämä oli roskapostittajan väärentämä, bounce päätyy viattomalle kolmannelle osapuolelle. Siksi palvelinten pitäisi hylätä jo RCPT TO:ssa se, mikä ei voi onnistua (katso myös catch-all oppitunnilla 3.3).
Käytännössä: SMTP näkyväksi omassa ympäristössäsi
Tavallinen käyttäjä näkee SMTP-keskustelun harvoin kokonaisuudessaan, mutta palasina kyllä:
- bouncessa näkyy keskustelun viimeinen rivi, esimerkiksi
Remote-MTA: mx1.mailprovider.examplejaDiagnostic-Code: smtp; 550 5.1.1 ...; - vastaanotetun viestin otsikkorivillä näkyy jokaisen palvelimen kohdalla
Received:-rivi, jossa on EHLO-nimi ja IP-osoite (oppitunti 1.5); - lokipaneelissa, kuten E-mail Tracking DirectAdmin:ssa WebOkén palvelussa, näet viestikohtaisesti vastaanottavan palvelimen vastauksen. Muilla palveluntarjoajilla vastaava toiminto voi olla nimeltään esimerkiksi viestien seuranta tai mail log, ja sisältö on samantapainen.
Sinun ei siis tarvitse itse muodostaa yhteyttä sähköpostipalvelimeen voidaksesi lukea tätä. Jos haluat kokeilla sitä: komennolla openssl s_client -starttls smtp -connect server:25 voit käydä keskustelun käsin, mutta moni kotikäyttäjän operaattori estää lähtevän liikenteen portissa 25 (oppitunti 1.4).
Yhteenveto
- SMTP on luettava keskustelu: EHLO, (STARTTLS), MAIL FROM, RCPT TO, DATA, QUIT.
- Kaikki ennen DATA:a on envelope (toimitus ja virheilmoitukset), kaikki sen jälkeen on sisältö otsikkorivien kanssa, jotka näet.
- 2xx = onnistui, 4xx = tilapäinen (yritetään myöhemmin uudelleen), 5xx = pysyvä (bounce).
- Laajennettu koodi
X.Y.Zkertoo, mistä on kyse; X.1 osoite, X.2 mailbox, X.7 käytäntö ja turvallisuus. - Lue aina koodin perässä oleva teksti; palvelimet eivät ole aina johdonmukaisia.
Tietovisa
Tehtävä
Tehtävä Z1.2: Verkkotunnus, joka ei vastaanota sähköpostia. Etsi verkkotunnuksen example.com MX-tietueet. Täytä löytämäsi tiedot ja valitse, mitä lähettävä palvelin tekee viestille osoitteeseen info@example.com: (a) toimittaa sen palvelimelle, jolla on prioriteetti 0, (b) yrittää A-tietuetta, (c) luovuttaa heti, vai (d) yrittää myöhemmin uudelleen. Ohjelma hakee MX-tietueen live-tilassa ja tarkistaa vastauksen.
Lue lisää
Näiden artikkelien vaiheet koskevat WebOkén hallintapaneeleja; muilla palveluntarjoajilla toimintaperiaate on samankaltainen.
- Sähköpostin lähetysprosessi ja SMTP
- Mail delivery failed: näin luet virheilmoituksen ja mitä koodit tarkoittavat
- DirectAdmin-ohje 9.3: E-mail Tracking: mihin sähköpostini katosi?
- RFC 5321 (SMTP), kohdat 3 ja 4.2 (vastauskoodit); RFC 3463 (laajennetut tilakoodit); RFC 7505 (null MX)
