Pošta - SMTP, POP3/IMAP

Tomáš Golembiovský, xgolemb1@fi.muni.cz


Obsah


Postfix

Postfix je MTA jež byl vytvořen jako alternativa k sendmailu.

Základní konfigurační soubory jsou obvykle v adresáři /etc/postfix. Nejdůležitější konfigurační soubory jsou main.cf a master.cf.

V soubor main.cf jsou veškeré nastavitelné parametry pro server (všech jeho subsystémů). V souboru master.cf se určuje které substémy nebo programy (a jak) se mají spuštět pro obsluhu jednotlivých služeb jako je příjem zpráv, přepis hlaviček/obálky, lokální/nelokální relay, apod.

Některé soubory s tabulkami:

access - od koho přijímat/nepřijímat e-maily
aliases, virtual - konfigurace aliasů
canonical, generic - přepisovací pravidla pro adresy
transport - konfigurace relay na základě adresy
header_checks - modifikace nebo blokace e-mailu na základě (ne)existence hlavicek

Soubory s tabulkami se nepoužívají přímo, pro urychlení se používají databáze. Tyto se vytvářejí pomocí příkazu postmap(5) (resp. postalias(5) pro tabulku aliasů).

Základní konfigurace

Formát souboru main.cf je následujíci:
# komentar
parametr = hodnota
parametr2 = $parametr

Postfix používá líné vyhodnocování, je tedy možne se odkazovat jak na parametry definované později v souboru tak na parametry které se v konfiguračním souboru vůbec nevyskytuji (používá se implicitni hodnota).

K dispozici je více než sto různých parametrů pro konfiguraci serveru. Naštěstí většina má smysluplné implicitní hodnoty takže k provtnímu nastavení stačí obvykle nastavit jen pár parametrů.

Nejduležitější parametry:
# Hostname systemu na kterém server bezi
myhostname = thoe-beta.lab.fi.muni.cz

# Lokalni domena
mydomain = lab.fi.muni.cz

# Jakou domenu maji zpravy odeslane z tohoto stroje
myorigin = $mydomain

# Domeny pro ktere je tento server cilovy (doruci se lokalne)
mydestination = $myhostname, localhost.$mydomain, localhost.localdomain,
        localhost, $mydomain

# Na kterych sitovych rozhranich poslouchat
inet_interfaces = all

# Komu povolit relay.
#   host - relay jen z tohoto pocitace
#   subnet - vsechny pocitace v podsiti
#   class - vsechny pocitace ve stejne IP tride A/B/C
mynetworks_style = subnet
#mynetworks = 10.0.30.0/24, 127.0.0.0/8

# Pro ktere domeny umoznit relay pocitacum nevyhovujicim $mynetworks resp.
# $mynetworks_style
relay_domains = $mydestination

# Kteremu pocitaci zaslat zpravu pokd ji nevyhovuje zadny zaznam v
# tabulce transport
relayhost = [thoe-alpha.lab.fi.muni.cz]

Aliasy

Aliasy sou uloženy v souboru /etc/postfix/aliases (aliases(5)). Aliasy slouží k zasílání zprávy jinému adresátovi resp. skupině adresátů.

Formát:
# komentar
jmeno: hodnota1, hodnota2,
       hodnota3, hodnota4, ...

Jmeno je lokální adresa (bez domény). Hodnota je adresa, /soubor, |příkaz nebo :include:/soubor

Příklad:
mailer-daemon: postmaster
postmaster: root
nobody:     root
buse:       root
root:       alice
staff:      alice joe /var/adm/staff.mail
project:    :include:/etc/project.list

V souboru použitém u :include: je na každém řádku jeden cíl. Možné cíle sou stejné jako cile na pravé straně pravidla v souboru aliases.

Po změně je třeba spustit "newaliases" pro znovuvytvoření databáze (resp. postalias).

Uživatelé mohou kontrolovat doručování své pošty pomoci ~/.forward jehož obsah má stejný formát jako pravá strana pravidel v souboru aliases.

Doménový koš

Vytvoření doménového koše v postfixu je otázkou pár minut. Tím nejdůležitějším rozhodnutím bude na který učet posílat zprávy adresované neexistujícím uživatele. Můžeme využít již existující účet nebo vyhradit jeden speciální.

$ useradd -g nogroup -d /no/home -s /bin/false mailbin

Pak už jen zbývá domluvit se s postfixem. Důležité je aby lokální poštu doručoval susbystem postifxu 'local' a ne někdo jiný, jinač parametr luser_relay nebude fungovat

# Chceme aby zasilal zpravy z cokoliv@lokalni_domena na mailbin@lokalni_domena
luser_relay = mailbin@$domain 

# Necht subsystem local sam rozhodne ktere ucty existuji
local_recipient_maps =

Pokud chceme ukládat úplně všechny zprávy na jeden konkrétní účet lze to zařídit také takto

Obsah souboru /etc/postfix/virtual:
# Send everything to alice
@alice.mydomain.com alice
Upravíme main.cf následovně:
virtual_alias_maps = hash:/etc/postfix/virtual
A nakonec vytvoříme databazi:
$ postmap /etc/postfix/virtual

Regexp matching

Na místo tabulek se statickými pravidly je možné použít tabulky s pravidly tvořenými regulárními výrazy. Na výběr máme posixové regularni výrazy (klasické i extended) nebo pcre.

Příklad pro tabulku virtual:
/^(.*)-abc@/ $1@mydomain.com

if !/foo.*@/
/(.*)bar@somewhere.net/ $1@nowhere.net
endif
Obsah main.cf:
virtual_alias_maps = regexp:/etc/postfix/virtual
Test funkčnosti:
$ postmap -fq 'that-abc@home.com' regexp:/etc/postfix/virtual
that@mydomain.com
$ postmap -fq 'foobar@somewhere.net' regexp:/etc/postfix/virtual_test
$ postmap -fq 'wheee-bar@somewhere.net' regexp:/etc/postfix/virtual_test
wheee-@nowhere.net

POP3

POP3 - Post Office Protocol verze 3

Jednoduchá služba pro přenos zpráv ze serveru na klientskou stanici. Standardně běží na portu 110 (SSL verze na portu 995). Protokol je trivialni a obsahuje jen 9 základních příkazu - USER, PASS, STAT, LIST, RETR, DELE, RSET, QUIT, NOOP. Kromě těchto příkazu ještě protokol obsahuje pár doplňkových příkazů které jsou nepovinné. Server odpovídá "+OK" nebo "-ERR". U víceřádkových odpověďí je odpoveď ukončena jednim řádkem obsahujícím tečku.

+OK Dovecot ready.
USER thoe
+OK
PASS secret
+OK Logged in.
STAT
+OK 2 808
RETR 1
+OK 401 octets
Return-Path: <root@lab.fi.muni.cz>
X-Original-To: thoe
Delivered-To: thoe@lab.fi.muni.cz
Received: by thoe-beta.lab.fi.muni.cz (Postfix, from userid 0)
        id CE1BF48872; Sun,  2 Apr 2006 00:31:08 +0200 (CEST)
To: thoe@lab.fi.muni.cz
From: root@lab.fi.muni.cz
Subject: test
Message-Id: <20060401223108.CE1BF48872@thoe-beta.lab.fi.muni.cz>
Date: Sun,  2 Apr 2006 00:31:08 +0200 (CEST)

xx
yy
.
DELE 1
+OK Marked to be deleted.
QUIT
+OK Logging out, messages deleted.

IMAP

IMAP - Internet Message Access Protocol

Komplexní protokol umožňující přístup k poště umístěné na serveru. Umožňuje ukládání zpráv do hierarchických uspořádaných složek, vyhledávání podle různých kritérií, přesouvání, kopírování a mazaní zpráv, upload zprav na server, přířazování atributů, a buhvi co vščcko.

Základní syntaxe:

pozadavek: <tag> <prikaz> <argumenty>
  odpoved: * <odpoved>
           * <odpoved>
             ...
           <tag> <reakce> <text>

Ukázka komunikace:

> | 1 LOGIN thoe secret
< | 1 OK Logged in.
> | 2 SELECT inbox
< | * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
< | * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
 ...
< | 2 OK [READ-WRITE] Select completed.
> | 3 SEARCH ALL
< | * SEARCH 1 2
< | 3 OK Search completed.
> | 4 FETCH 1 FLAGS
< | * 1 FETCH (FLAGS (\Seen))
< | 4 OK Fetch completed.
> | 5 fetch 1 BODY[TEXT]
< | * 1 FETCH (BODY[TEXT] {5}
< | aaa
< | )
< | 5 OK Fetch completed.
> | 6 fetch 1 RFC822
< | * 1 FETCH (RFC822 {407}
    To: root@lab.fi.muni.cz
    From: sophia@lab.fi.muni.cz
     ...
    Have a nice day
    )
< | 6 OK Fetch completed.
> | 7 STORE 2 +FLAGS (\Deleted)
< | * 2 FETCH (FLAGS (\Deleted \Seen))
< | 7 OK Store completed.
> | 8 EXPUNGE
< | * 2 EXPUNGE
< | 8 OK Expunge completed.
> | 9 LOGOUT
< | * BYE Logging out
< | 9 OK Logout completed.

Reference

http://www.postfix.org/
RFC 1939 - Post Office Protocol - Version 3
RFC 3501 - Internet Message Access Protocol - Version 4rev1