E-mail

Jan Steuer, xsteuer@fi.muni.cz

Obsah

Poštovní systémy

MUA (mail user agent)
Uživatelský e-mailový program neboli poštovní klient.
MTA (mail transport agent)
Program pro přenos elektroniceké pošty směrující e-mailové zprávy mezi počítači. MTA musí rozumět emailové adrese příjemce a poslat poštu dál. Při chybě vrátí zprávu odesílateli. MTA ovládají protokol SMTP pro přenos zpráv. Pro Linux existují např. Sendmail, Exim, Postfix.
MDA (mail delivery agent)
Přijímá poštu od MTA a dodává ji lokálnímu příjemci. V Linuxu např. procmail.
access agent
Přístupový program spojující uživatelský program a skladiště zpráv (např. přes POP, IMAP..). Jedná se o volitelnou součást.
MSA (mail submission agent)
Program pro odesílání pošty. Definován v RFC 2476. Jeho hlavním účelem je rozložení zátěže u MTA.

Formát zprávy

Obálka
Definuje kam bude zpráva dodána, nebo v případě chyby, komu by měla být vrácena. Adresy v obálce jsou shodné s řádky From a To v hlavičce, ale neshodují se, když je zpráva poslána do internetové konference. Obálka není viditelná uživateli a předává se odděleně MSA.
Hlavičky
Seznam položek typu "atribut: hodnota" odděleny od sebe znaky CRLF. Hlavičky jsou součástí samotné zprávy. Některé hlavičky přidává MUA, jiné doplnuje MTA. Příklady hlaviček:
From:uvádí odesilatele.
To: příjemce.
Subject: předmět zprávy.
Received: dokumentuje průchod zprávy poštovními systémy až ke schránce uživatele. Každý počítač, přes který zpráva přejde, vloží na začátek novou hlavičku Received.
X-URL: Hlavičky začínající X- poštovní systém ignoruje, ale posílá je dále se zprávou. Existuje tedy možnost vytvářet vlastní hlavičky.
Tělo
Textový obsah zprávy. Může obsahovat i binární data, ta ale musí být zakódována tak aby je bylo možno bezpečně přenést.

Protokol SMTP

Simple Mail Transport Protocol, tedy jednoduchý protokol pro přenos zpráv. Používá se při komunikaci s MTA.
Jedná se o textový protokol, který je snadno čitelný člověku. Klient posílá několika slovní příkazy na něž server odpovídá kódem doprovázeným stručným textem. Kódy se dělí do několika skupin podle počátečního čísla.

1xxprovedení příkazu odloženo na později
2xxúspěch
3xxinicializace přenosu zprávy
4xxdočasná chyba
5xxpermanentní chyba
S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:
S: 250 Ok
C: RCPT TO:
S: 250 Ok
C: DATA
S: 354 End data with .
C: From: "Bob Example" 
C: To: Alice Example 
C: Cc: theboss@example.com
C: Date: Tue, 15 Jan 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 headers and 4 lines in the body.
C: Your friend,
C: Bob
C: .
S: 250 Ok: queued as 12345
C: MAIL FROM:
S: 250 Ok
C: RCPT TO:
S: 250 Ok
C: DATA
S: 354 End data with .
C: From: "Bob Example" 
C: To: Alice Example 
C: Cc: theboss@example.com
C: Date: Tue, 15 Jan 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 headers and 4 lines in the body.
C: Your friend,
C: Bob
C: .
S: 250 Ok: queued as 12346
C: QUIT
S: 221 Bye
{The server closes the connection}

DNS MX záznamy

MX záznam definuje cíl zprávy, přičemž ve většině případů jej směruje na poštovní ústřednu v organizaci příjemce. Pro počítač může existovat více MX záznamů, kde u každého je určeno preferenční číslo. Při směrování pošty se nejprve zkoušejí počítače od nejnižšího preferenčního čísla. Počítače, které nejsou přímo připojeny k internetu nemohou mít záznam typu A, ale mohou mít MX záznam. Počítač nemusí mít MX záznam, v tom případě je používán A záznam, ale MX záznamy se doporučují ze spousty důvodů.

MIME

(Multipurpose Internet Mail Extensions)
Rozšiřuje formát e-mailu o podporu textu ve znakových sadách jiných než US-ASCII, netextových příloh a zpráv o více částech (multi-part message). Dnes se tento standard rozšířil daleko za hranice e-mailové pošty. Uvádí několik nových hlaviček, např: MIME-version, Content-type (např. text/plain, application/octet-stream) a Content-Transfer-Encoding.

Ukázka zprávy o více částech:

MIME-version: 1.0
Content-type: multipart/mixed; boundary="frontier"

This is a multi-part message in MIME format.
--frontier
Content-type: text/plain

This is the body of the message.
--frontier
Content-type: application/octet-stream
Content-transfer-encoding: base64

PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--

POP3

(Post Office Protocol version 3)
Protokol sloužící k přenosu pošty ze serveru na uživatelský počítač. Zpráva je ze serveru smazána a uživatel může se zprávou pracovat i bez připojení k síti.

S: 
C: 
S:    +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
C:    APOP mrose c4c9334bac560ecc979e58001b3e22fb
S:    +OK mrose's maildrop has 2 messages (320 octets)
C:    STAT
S:    +OK 2 320
C:    LIST
S:    +OK 2 messages (320 octets)
S:    1 120
S:    2 200
S:    .
C:    RETR 1
S:    +OK 120 octets
S:    
S:    .
C:    DELE 1
S:    +OK message 1 deleted
C:    RETR 2
S:    +OK 200 octets
S:    
S:    .
C:    DELE 2
S:    +OK message 2 deleted
C:    QUIT
S:    +OK dewey POP3 server signing off (maildrop empty)
C:  
S:  

IMAP

(Internet Message Access Protocol)
Protokol sloužící k práci s poštou na straně serveru. Pošta se tedy narozdíl od POP3 nestahuje na klientský počítač.

Spam

(nevyžádaná e-mailová pošta) Údajně je denně odesláno přes 90 miliard spam zpráv. Spam je v dnešní době největším problémem emailové komunikace. Na obranu proti spamu se vyvinulo spoustu různých více či méně úspěšných technik. Zde je výčet pouze některých:

DNSBL
(DNS Based Black Lists) Sít přes DNS zveřejnuje seznam nedůvěryhodných počítačů. Servery mohou poštu z těchto počítačů odmítat.
Greylisting
SMTP server dočasně odmítne zprávu z neznámého SMTP serveru.
Uvítací zpoždění
SMTP server chvíli posečká, než pošle uvítací zprávu klientovi.
Filtrování dle země původu
Server odmítá zprávy pocházející ze zemí ze kterých se často šíří spam.
Hybridní filtrování
Implementováno například v programu SpamAssassin. Nad zprávou se provede spousta testů, jejihž výsledkem je číselné skore. Pokud zpráva převyšuje určíté celkové fixně dané skore, je označena jako spam.
Dataváze spamu
Ze zprávy je vypočten hash a ten je zkontrolován oproti databázi známých spamů.

Postfix

Dnes nejrozšířenějším SMTP serverem je Sendmail (v roce 2007 instalován na zhruba 30% serverů). Sendmail doplácí při konfiguraci na svou komplexnost - jazyk konfiguračního souboru je z Turingova hlediska kompletní. Proto jsem se raději rozhodl pro Postfix.

Konfigurační soubory Postfixu jsou k nalezení ve většině distribucí v /etc/postfix.
Hlavním konfiguračním souborem serveru je main.cf. Většina voleb je rozumně nastavena a proto stačí provést jen drobné úpravy.
Dalším důležitým souborem je master.cf. Protože Postfix není jednolitým serverem, ale spíše souborem několika v pozadí běžících démonů, určují se v tomto konfiguračním souboru jaké úkony mají být prováděny kterými démony.

Popis některých voleb konfiguračního souboru main.cf.

# hostname systému, na kterém běží server
myhostname = proto05-beta.lab.fi.muni.cz

# lokální doména
mydomain = lab.fi.muni.cz

# doména, kterou mají uvedenou zprávy odesílané z tohoto serveru
myorigin = $mydomain

# pro tyto domény je server cílový (lokální doručení)
mydestination = $myhostname, localhost.$mydomain, localhost.localdomain, $mydomain

# síťová rozhraní, na kterých je sledován provoz
inet_interfaces = all

# komu povolit relay:
# host - jen z tohoto počítače
# subnet - všechny počítače v podsíti
# class - všechny počítače ve stejné IP třídě A/B/C
mynetworks_style = subnet
# mynetworks = 10.0.50.0/24, 127.0.0.0/8

# které doméně povolit relay, pokud neprojde $mynetworks resp. $mynetworks_style
relay_domains = $mydestination

# kterému počítači zaslat zprávu, jestliže jí nevyhovuje žádný záznam v
# tabulce transport
relayhost = [proto05-alpha.lab.fi.muni.cz]

Doménový koš

Před vytvořením doménového koše musíme určit účet pro posílání zpráv adresovaných neexistujícím uživatelům. Můžeme využít již existující účet nebo vytvořit nový, speciální:

$ useradd -g nogroup -d /no/home -s /bin/false mailbin
Při nastavování Postfixu je důležité, aby lokální poštu doručoval podsystém 'local', jinak parametr luser_relay nebude fungovat:
luser_relay = mailbin@$domain 

# podsystém local sám rozhodne, které účty existuji
local_recipient_maps =

Literatura