Elektronická pošta
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ů