Monday, January 24, 2011

Kuidas töötab e-post

E-post oma olemuselt on üsna lihtne teenus. Sellisel kujul kui meie seda tunneme, on e-post töötanud sisuliselt aastast 1982 - mil loodi SMTP protokoll kirjade edastamiseks. E-kirju saadeti ohtralt ka varem, kuid neid edastati arvutist arvutisse FTP ehk failiedastuse protokolli abil, spetsiaalselt e-kirjade edastamiseks mõeldud protokolli veel polnud.

Sisuliselt võib öelda, et kui kiri mis saadeti välja aastal 1982 ning adressaadini jõudmata sattus mingisse interneti Bermuuda kolnurka, igavesse tsüklisse, siis sellest tsüklist pääsenult oleks praegune võrk võimeline sedasama kirja ilma mingite modifikatsioonideta endiselt adressaadini toimetama. Kõik täiendused, mis vahepeal on tehtud, on lisatud uue kihina olemasolevale, mitte ei ole põhimõtteliselt muudetud süsteemi ennast.

E-kiri koosneb laial saastus kolmest eraldi elemendist - kirja sisust, kirja päisest ja “ümbrikust”. Kirja pärises asub igasugune kirjaga seotud meta-info, näiteks mis on selle pealkiri ja kellele see on adresseeritud. Küllap paljud ei tea, aga tegelikult kirja päises olevad aadressid (To, Cc ja Bcc väljadel) ei mängi edastamisel mitte mingisugust rolli - need aadressid kuhu kiri tuleb edastada, määrab hoopis “ümbrik.”

Kirja päises olevad aadressid on ainult informatiivseks kasutamiseks e-posti kliendile ning spämmitõrjele. Tegelikud aadressid liiguvad kirjast eraldi info ehk “ümbrikuna” e-posti edastusserverilt -serverile.

E-posti edastus

SMTP serverile öeldakse MAIL FROM ja RCPT TO parameetritega ära esiteks kirja saatja ning seejärel kõik saajad, hoolimata kas need asuvad To, Cc või Bcc real. Kusjuures edastatakse ainult need aadressid, mida vastuvõttev server peab teadma. See tähendab, et kui e-posti klient võtab ühendust väljuva SMTP serveriga, siis vuristab ta ette kõik adressaadid, kuid kui väljuv SMTP server võtab ühendust vastuvõtva SMTP serveriga, edastatakse vaid need aadressid, mis kuuluvad selle konkreetse vastuvõtva serveri juurde.

Üldiselt liigub siis e-kiri järgmist rada pidi

  1. Saatev e-posti klient (MUA - Mail User Agent, n. Outlook, samuti ka webmail) võtab ühendust väljuva SMTP serveriga (MTA - Mail Transport Agent), edastab saatja ja saajate andmed ning seejärel kirja enda.
  2. Väljuv SMTP server (MTA) vaatab kes on addressaadid, ning laeb @ märgi järel oleva serveri nimeserverist (n. @hot.ee) MX (mail exchanger) kirje järgi vastuvõtva serveri aadressi (MTA, hot.ee puhul on selleks mx1.hot.ee).
  3. Väljuv SMTP server võtab ühendust vastuvõtva serveriga (port 25) ning annab teada kirja saatja andmed ning saaja aadressidena kõik sellele serverile suunatud adressaadid. Seejärel edastatakse kiri ise.
  4. Vastuvõttev SMTP server edastab kirjad vastuvõtvale e-posti serverile (MDA - Mail Delivery Agent), mis salvestab kirja adressaatide kaustadesse.
  5. Addressaadi e-posti klient (MUA) võtab POP3 või IMAP protokolli abil e-posti serveriga (MDA) ühendust ning saab nüüd kirja lõpuks kätte. Vastuvõttev e-posti klient enam “ümbrikut” ei näe, tema saab vaid kirja enda. From, To, Cc väljadel oleva info kuvatakse kasutajale kui kirjaga seotud addressaate

Kirja enda ehitus on sarnane teiste tekstipõhiste protokollidega, nagu näiteks HTTP. Kiri algab päiseosaga, mis kestab kuni esimese tühja reani (kaks reaeraldussümbolit “\r\n” järjest), edasi järgneb juba kirja sisuosa.

Päised

Reegliks on, et üks päisekirje asub ühel real. Erandiks on vaid pikemad kui 80 sümboliga kirjed - need volditakse mitmele reale laiali, aga nii et esimene rea puhul algab tekst esimesest sümbolist, järgnevatel on esimeseks sümboliks alati tühik. Nii oskab vastuvõttev server hiljem read tagasi kokku voltida - juhul kui rida algab tühikuga, liidetakse see eelneva rea lõppu.

From: andris@kreata.ee
To: addressat1@example.com, addressat2@example.com,
    addressat3@example.com, addressat4@example.com

Näiteblokis jätkub To: kirje uuelt realt kuna addressat3... ei alga rea algusest, vaid selle ees on tühikusümbolid.

Oluliseimad kirjed oleksid From, To ja Subject - kui need on täidetud, on kirja võimalik juba saata.

Sisu

Vaikimisi on tekst 7 bitises US-ASCII kodeeringus. Kõik mis järgneb päise lõpus olevale tühjale reale, ongi kirja sisuks. Ilmselgelt jääb sellest väheks, kuna nii ei ole võimalik isegi täpitähti kasutada, hieroglüüfidest jms. rääkimata. Samuti ei ole erilisi võimalusi teksti vormindamiseks ega manuste lisamiseks. Kõigi nende nimetatud asjade jaoks võeti kasutusele multimeili laiendused (MIME), kuid nendest hetkel pikemalt juttu ei tee. Sisuliselt on tegu täiendava kihiga tavalise tekstiformaadi peal.

Seega kõige lihtsam kiri võiks välja näha nii

From: andris@kreata.ee
To: andris@node.ee
Subject: Kiri endale

Tere maailm!

Esimesed kolm rida moodustavad päise, järgnev tühi rida on päise lõpu markeerija ning rida “Tere maailm!” moodustab kirja sisu.

Kirja edastamise näide

Seda, kas kirjeldatud e-kirja koostamise viis ka töötab või mitte, on igalühel võimalik kergelt järgi proovida. Vaja on telnet nimelist programmi ja ligipääsu SMTP serverile (soovitavalt mitte-autentimisega, kuna ise käsklusi trükkides on paroole raske sisestada).

Esiteks tuleb käivitada telnet SMTP serveri pihta. Mina kasutan näites hot.ee SMTP serverit, kuna see on Elioni võrgust kasutades vaba ligipääsuga.

telnet mail.hot.ee 25

Trying 194.126.101.116...
Connected to mail.hot.ee.
Escape character is '^]'.
220 hot.ee HOT-Relayhost1.estpak.ee

Server vastas teatega “220…” mis tähendab, et ühendus on avatud ja server on valmis meid kuulama. SMTP puhul tähistavad koodid algusega 2 ja 3 edu, aga 4 ja 5 ebaõnnestumist.

Järgmisena tuleb end identifitseerida ja anda teada mis tüüpi protokolli toetatakse, kas tavalist SMTP või laiendatud versiooni ESMTP. Seda saab teha käskudega HELO ja EHLO millele järgneb iseenda masina nimi. Näites kasutame tavalist SMTP versiooni ja seega on käskluseks HELO.

HELO minaise
250 HOT-Relayhost1.estpak.ee

Nüüd saab hakata “ümbrikut” kokku panema. Selle jaoks tuleb sisestada saatja aadress ja ükshaaval saajate aadressid. Need sisesatud aadressid saavad tegelikeks adressaatideks, kirja sees olevad on ainult informatiivse iseloomuga.

MAIL FROM:<andris@kreata.ee>
250 2.1.0 Ok
RCPT TO:<andris@node.ee>
250 2.1.5 Ok

Kui formaalsused on korraldatud, saab minna edasi juba tegeliku kirja edastamisega, selle jaoks tuleb kasutada ksäklust DATA. Edasi on kogu sisestatav tekst osa kirjast ning seda kuni üksiku punkti sisestamiseni omaette real. Vältimaks segadust, peab klient kirja edastades kirja sees kõik rea alguses olevad punktid topeltpunktidega asendama.

DATA
354 End data with <CR><LF>.<CR><LF>
From: andris@kreata.ee
To: andris@node.ee
Subject: Kiri endale

Tere maailm!
.
250 2.0.0 Ok: queued as 01E7F49A

Peale punkti sisestamist loeb server kirja sisu lõppenuks ning võtab selle edastamiseks üle. Klient võib nüüd ühenduse sulgeda.

QUIT
221 2.0.0 Bye
Connection closed by foreign host.

Kokkuvõtteks

Selline on siis suures plaanis e-posti liigutamise mehhanism. Võibolla võtan kunagi ka MIME pikemalt lahti kirjutada, seniks aga võib vaadata minu e-posti saatmise kliendi Nodemailer lähtekoodi, mis on täiesti MIME sõbralik, võimaldades kasutada UTF-8 kodeeringus teksti, lisada manuseid jne.