Elektronická pošta

Vojtěch Pazdera, xpazdera@fi.muni.cz


Obsah


O elektronické poště

Přenos elektronické pošty byl odjakživa jedním z nejdůležitějších způsobů využití počítačových sítí. Jedná se o off-line (neinteraktivní) komunikaci - zpráva je odeslána z jednoho stroje na druhý, kde je připojena k poštovní schránce (mailboxu) příjemce a čeká na vyzvednutí. V průběhu let se objevily různé standardy pro výměnu elektronické pošty (např. X.400), avšak suverénně největší popularity v současném Internetu dosáhla koncepce elektronických zpráv podrobně popsaná v dokumentu RFC-2822 "Internet Message Format", který nahrazuje RFC-822. Uvedený dokument popisuje formát vlastních e-mailových zpráv (
viz dále), které díky rozšířením popsaným v dalších RFC mohou kromě textu obsahovat v podstatě cokoliv, včetně obrázků, hudby, atd.

Uživatelé většinou píší zprávy v programech zvaných mail user agents (MUA), např. mail, elm, mutt nebo pine. Když chce uživatel poslat zprávu, MUA ji většinou předá dalšímu programu, který má zajistit její doručení. Pro Unixové systémy bylo implementováno několik takovýchto programů pro přenos pošty (MTA - mail transport agents), z nichž nejznámější a nejvíce používaný je sendmail (viz dále), z dalších bych jmenoval ještě qmail nebo exim.

Na většině systémů se pro lokální i vzdálený přenos pošty používá tentýž MTA, obvykle dostupný jako /usr/sbin/sendmail. Lokální doručení pošty neznamená jenom připojení zprávy do adresátovy schránky, MTA řeší také aliasing adres a přeposílání zpráv (forwarding), nedoručitelné zprávy vrací s chybovou hláškou odesílateli. Proces vzdáleného doručení závisí hodně na druhu spojení, v TCP/IP sítích, jež nás především zajímají, se běžně používá Simple Mail Transfer Protocol (SMTP, viz dále), popsaný podrobně v RFC-2821 z dubna 2001 (nahrazuje RFC-821, 974, 1869, některá další RFC "uceluje").


Formát zpráv

Zpráva elektronické pošty se skládá z těla zprávy (message body), což je vlastní text zprávy, a hlavičky (header), která obsahuje řídící informace nezávislé na přenosovém systému, např. předmět zprávy, datum, seznam příjemců, atd. Hlavička předchází tělu zprávy, od nějž je oddělena jedním prázdným řádkem. Skládá se z několika řádků navzájem oddělených end-of-line sekvencí. Řádek hlavičky je tvořen názvem položky a hodnotou položky, které dělí dvojtečka a bílé znaky:
<název pole>: <hodnota>
Pokud se hodnota pole nevejde na jeden řádek, je možné pokračovat na dalším řádku, který musí začínat bílým znakem:
<bílý znak><pokračování>

Mezi důležité položky v hlavičce patří: From, To, Cc, Bcc, Subject, Date, Reply-To, Message-Id, Received a další. Popisovat přesně jejich význam je nad rámec tohoto referátu, úplný výčet položek včetně popisu najdete v RFC-2822. Pouze uvedu, že formát adres v položkách From, To, Cc, atd. je podle zmíněného RFC následující: user@host.domain, kde host.domain je plné doménové jméno cílového stroje, user je jednoznačná identifikace příjemce na daném stroji.

Mimo samotnou zprávu, tedy i mimo hlavičky, se nachází obálka zprávy (envelope), obsahující dodatečné informace specifické pro transportní médium, jako adresu odesílatele a adresáta. Hlavička spolu s obálkou tvoří tzv. administrativní data zprávy.


SMTP

Protokol SMTP, jak již bylo řečeno, je zodpovědný za (vzdálený) přenos elektronické pošty v prostředí TCP/IP. Schéma jeho funkce lze znázornit takto:
            +----------+                +----------+
+------+    |          |                |          |
| User |<-->|          |      SMTP      |          |
+------+    |  Client- |Příkazy/Odpovědi| Server-  |
+------+    |   SMTP   |<-------------->|    SMTP  |    +------+
| File |<-->|          |    a Pošta     |          |<-->| File |
|System|    |          |                |          |    |System|
+------+    +----------+                +----------+    +------+
             SMTP klient                SMTP server

Pokud chce klient odeslat zprávu, vytvoří obousměrné komunikační spojení se SMTP serverem. Adresu serveru získá klient překladem cílového doménového jména. Daný SMTP server může být buď konečným cílem zprávy, nebo se může jednat o relay (tj. určitý prostředník, který po přijetí zprávy přejde do role klienta a zprávu pošle na jiný server), nebo gateway (přenáší zprávu dále pomocí jiného protokolu než SMTP). Jinak řečeno, přenos zprávy může proběhnout v jediném spojení mezi původním odesílatelem a konečným příjemcem, nebo se odehraje jako série skoků (hops) přes zprostředkující systémy. V každém případě přebírá server odpovědnost za úspěšné doručení zprávy nebo řádné oznámení, že k tomu nedošlo.

Jakmile je ustanoven přenosový kanál, SMTP klient začne posílat čtyřpísmenné příkazy (některé mají parametry), server na ně odpovídá trojciferným chybovým kódem, volitelně následovaným textovým popisem chyby. Úvodním příkazem musí být HELO, případně EHLO. EHLO umožňuje, aby se klient a server domluvily, která rozšíření SMTP protokolu oba podporují, a mohou je tedy při přenosu používat. Následuje příklad typického (tj. úspěšného) přenosu zprávy. Uživatel Smith na stroji foo.com posílá zprávu uživatelům jménem Jones, Green a Brown na stroji foo.com. Předpokládáme, že stroj bar.com kontaktuje foo.com přímo. Green nemá na foo.com schránku.

S: 220 foo.com Simple Mail Transfer Service Ready
C: EHLO bar.com
S: 250-foo.com greets bar.com
S: 250-8BITMIME
S: 250-SIZE
S: 250-DSN
S: 250 HELP
C: MAIL FROM:<Smith@bar.com>
S: 250 OK
C: RCPT TO:<Jones@foo.com>
S: 250 OK
C: RCPT TO:<Green@foo.com>
S: 550 No such user here
C: RCPT TO:<Brown@foo.com>
S: 250 OK
C: DATA
S: 354 Start mail input; end with <CRLF>.<CRLF>
C: Blah blah blah...
C: ...etc. etc. etc.
C: .
S: 250 OK
C: QUIT
S: 221 foo.com Service closing transmission channel

S značí server, C klienta. Parametr příkazu EHLO je doménové jméno klienta, server v odpovědi na EHLO posílá seznam podporovaných rozšíření. Příkaz MAIL má parametr FROM:<odesílatel>, příkaz RCPT má parametr TO:<adresát>, server vrací hodnotu 550, pokud uživatel neexistuje. Příkaz data značí začátek textu zprávy, zpráva je ukončena tečkou na samostatném řádku. Příkaz QUIT ukončuje relaci.


Sendmail

Instalace
Sendmail je ve formě balíčku přítomen snad ve všech distribucích Linuxu. V tom případě je instalace poměrně jednoduchá, jsou však určité (bezpečnostní) důvody, proč dát přednost vlastnoručnímu překladu zdrojových kódů. Ten lze provést takto:
# tar xvfz sendmail.*.tar.gz
# cd src
# ./Build
# cd obj.*
# make install
Poslední uvedený příkaz vyžaduje rootovská práva. Po provedení uvedených příkazů bude spustitelný soubor sendmailu nainstalován v adresáři /usr/sbin, v adresáři /usr/bin se vytvoří několik symbolických linků na něj.

Soubory sendmailu
Sendmail tradičně používá konfigurační soubor /etc/mail/sendmail.cf, resp. /etc/sendmail.cf. Jeho formát je však natolik kryptický, že není příliš dobrý nápad jej (opakovaně) editovat ručně. Naštěstí to není nutné, neboť konfiguraci můžeme provést pomocí sady maker pro makroprocesor m4.

Další soubory jsou /etc/aliases, obsahující lokální aliasy, /var/spool/mqueue, což je fronta zpráv a ~/.forward, tedy uživatelská konfigurace přesměrování pošty. Program zajišťující lokální doručení pošty může být /bin/mail, deliver nebo procmail.

Konfigurace - m4
Některé položky vstupního souboru pro makroprocesor m4 (nazveme ho třeba sendmail.m4) jsou vždy povinné, jiné je možné vynechat, pokud si vystačíme se základním nastavením. Nejdůležitější součásti souboru sendmail.m4 si popíšeme na následujícím příkladu:

divert(-1)
#
# Sample configuration file - smtp only
#
divert(0)
VERSIONID(`@(#)sendmail.m4 8.9 (Linux) 01/10/98')
OSTYPE(`linux')
#
# Include support for the local and smtp mail transport protocols.
MAILER(`local')
MAILER(`smtp')
#
FEATURE(rbl)
FEATURE(access_db)
# end

Řádky souboru sendmail.m4 začínající znakem # jsou programem m4 ignorovány a budou beze změny zkopírovány do výstupního souboru (sendmail.cf), čehož lze využít pro poznámky. Makro VERSIONID je nepovinné, jeho parametrem je verze konfiguračního souboru. Velmi důležité je makro OSTYPE, které zařídí zaincludování vhodných základních nastavení pro daný systém. Makro FEATURE umožní do naší konfigurace přidat některé předdefinované vlastnosti. Těchto vlastností je mnoho, jejich výčet naleznete v dokumentaci sendmailu. Makro MAILER říká sendmailu, které metody přenosu pošty požadujeme.

Přepisovací pravidla
Přepisovací pravidla slouží ke transformaci adres odesílatelů/příjemců zpráv. Sady přepisovacích pravidel jsou aplikovány tak, že vstup (adresa) se přepisuje postupně všemi pravidly sady. V konfiguračních skriptech pro m4 můžeme používat následující sady pravidel:

LOCAL_RULE_3 - Sada pravidel 3 převádí adresu v libovolném formátu do běžného formátu, který bude následně zpracován sendmailem
LOCAL_RULE_2, LOCAL_RULE_1 - Tyto sady se většinou nepoužívají
LOCAL_RULE_0 - Sada pravidel 0 je sendmailem aplikována na adresy příjemce po sadě pravidel 3, měla by vygenerovat příkaz, který doručí zprávu příjemci
LOCAL_NET_CONFIG - Sada pravidel vložená do druhé poloviny sady pravidel 0

Příklad (fiktivní součást souboru sendmail.m4):

LOCAL_NET_CONFIG
R$* < @ $* .$m. > $* $#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3

Uvedené pravidlo bude patřit do sady pravidel LOCAL_NET_CONFIG. Každé pravidlo má levou a pravou stranu, levá se přepíše na pravou. Pro přesný popis definice pravidel si prostudujte dokumentaci sendmailu.

Volby sendmailu
Sendmail má mnoho voleb ovlivňujících jeho činnost, tyto volby lze nastavit buď v souboru sendmail.m4 nebo přímo v sendmail.cf. Např. definici
define('confSEPARATE_PROC','true')
v souboru m4 odpovídá položka
O ForkEachJob=true
v souboru sendmail.cf. Další často používané volby (v závorce název volby v souboru sendmail.cf):

confMIN_FREE_BLOCKS (MinFreeBlocks)
confME_TOO (MeToo)
confMAX_DAEMON_CHILDREN (MaxDaemonChildren)
confSEPARATE_PROC (ForkEachJob)
confSMTP_LOGIN_MSG (SmtpGreetingMessage)

Test konfigurace
Nejprve je nutné ze souboru sendmail.m4 vygenerovat soubor sendmail.cf, což provedeme takto:
# m4 /usr/share/sendmail.cf/m4/cf.m4 /etc/mail/sendmail.m4 >/etc/mail/sendmail.cf

Pokud zavoláme sendmail s parametrem -bt, spustí se v režimu testování adres:
# /usr/sbin/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 pepa
rewrite: ruleset 3 input: pepa
rewrite: ruleset 96 input: pepa
rewrite: ruleset 96 returns: pepa
...

Spuštění sendmailu
Sendmail démona lze spouštět dvěma způsoby. První způsob je nechat ho spouštět inetd démonem, druhý a častější způsob je spouštět sendmail jako samostatného démona. Programy pro čtení a psaní pošty (MUA) také běžně spouští sendmail jako příkaz pro doručení zadané zprávy.

Pokud pouštíte sendmail v samostatném režimu, umístěte do vhodného rc souboru příkaz podobný následujícímu:
/usr/sbin/sendmail -bd -q10m

Parametr -bd říká, že má sendmail běžet v pozadí jako démon, parametr -q10m říká sendmailu, aby kontroloval svou frontu každých 10 minut.


Odkazy

Relevantní odkazy a použitý materiál:
www.sendmail.org - sendmail
www.linuxdoc.org - Linux Documentation Project (na www.linux.cz je dostupný lokální mirror)
ftp.fi.muni.cz/pub/rfc - archiv RFC dokumentů