Elektronická pošta: qmail, imap, pop3
Michal Prokeš, xprokes3@fi.muni.cz
Obsah
Elektronická pošta
Pro elektronickou poštu používáme adresy typu: uzivatel@domena.cz
Pošta s takovouto adresou se doručí na stroj, na který ukazuje DNS MX záznam pro domena.cz a doručí se tam uživateli uzivatel
Přenos pošty zajišťuje protokol SMTP.
Pokud nemůžeme, popřípadě nechceme odesílat poštu přímo cílovému SMTP serveru, můžeme použít tzv. relay SMTP server. (nejčastěji SMTP server svého poskytovatelepřipojení k internetu)
Podobně pro příjem pošty můžeme využít jiný poštovní server a zprávy z něj stahovat pomocí POP3, popřípadě stahovat, třídit a číst přímo na serveru pomocí IMAP4.
POP3 i IMAP lze používat také v šifrované podobě, jako POP3S a IMAPS
SMTP - Simple Mail Transfer Protocol
Protokol pro přenos pošty je popsán v RFC2821 z dubna 2001,
která nahrazuje RFC821 (SMTP), RFC1035 a RFC974 (MAIL ROUTING AND THE DOMAIN SYSTEM), RFC1869 (SMTP Service Extensions).
Email je zasílán ze SMTP klienta na SMTP server výměnou SMTP příkazů a samotného emailu.
SMTP server:
- samotný cílový SMTP server
- relay přijme zprávu a pokračuje v odesílání na další SMTP server v roli klienta
- gateway přijme zprávu a pokračuje v odesílání pomocí jiného protokolu než SMTP
zajišťuje odesílání pouze jedné kopie zprávy pro všechny příjemce mailu v jednom cílovém místě
protokol reaguje na každý příkaz odpovědí, aby bylo jasné, že příkaz přijal.
Host pro doručení se určuje pomocí DNS MX záznamu.
Příkazy
- EHLO/HELO přihlásí se k serveru doménovým jménem
- MAIL FROM:zpáteční_adresa zahájí transakci odesílání mailu (vymaže buffery a vloží do bufferu novou zpáteční adresu.
- RCPT TO:adresa-příjemce identifikuje jednoho příjemce. Více příjemců se získá násobným užitím příkazu.
- DATA přijímá data dokud neobdrží sekvenci CRLF.CRLF
- RSET (RESET) Smaže aktuální transakci = vymaže buffery.
- VRFY (VERIFY) Ověří existenci emailového účtu.
- EXPN (EXPAND) Táže se příjemce, zda je argument adresou mailing listu. Když ano, pak žádá o zapsání do něj.
- HELP jako odpověď vrátí nápovědu
- NOOP Žádná akce, server pouze odpoví OK když slyší.
- QUIT ukončí transakce a uzavře spojení s klientem
Příklad relace
xuser3@speo:~> telnet mail.muni.cz smtp
Trying 147.251.49.9...
Connected to mail.muni.cz.
Escape character is '^]'.
220 arethusa.fi.muni.cz ESMTP
EHLO fi.muni.cz
250-arethusa.fi.muni.cz
250-PIPELINING
250 8BITMIME
MAIL FROM:
250 ok
RCPT TO:
250 ok
DATA
354 go ahead
From:
To: nekdo@mail.muni.cz
Subject: Test
Testovaci zprava
.
250 ok 1048425203 qp 17133
QUIT
221 arethusa.fi.muni.cz
Connection closed by foreign host.
POP3 - Post Office Protocol - Version 3
POP3 popisuje RFC 1939
Protokol POP3 slouží k tomu, aby si klientské stanice, které nemají nastaven příjem pošty mohli poštu číst ze serveru, který ji pro ně přijímá.
POP3, narozdíl od IMAP4 neumožňuje manipulaci se zprávou na serveru. Obvykle ji stáhne a smaže.
Serverová aplikace poslouchá na daném portu (obvykle 110) a čeká na spojení. Po spojení s klientem zašle uvítací zprávu a poslouchá příkazy. Ty se zadávají klíčovým slovem, někdy doplněným parametry a zakončují sekvencí CRLF.
Nejprve je třeba se přihlásit, to uděláme pomocí USER, PASS nebo APOP. Viz níže.Server autorizuje klienta a uzamkne schránku. Přečte maily, které obsahuje a přiřadí jim čísla od 1.
Standardní příkazy POP3
- UIDL msg Vrací +OK cislo_zpravy jednoznacny_indentifikator_zpravy Hodí se pro identifikaci týž zprávy v jiné transakci.
- USER login Žádá o autorizaci uživatele
- PASS heslo Musí následovat po úspěšném USER
- STAT server vrátí +OK pocet_zprav velikost_zprav (v počtu zpráv nejsou zahrnuty zprávy označené k smazání)
- LIST vrátí -ERR * když schránka neobsahuje zprávu(y) | +OK zpráva o počtu emailů a následuje sekvence řádků ve formátu cislo_zpravy velikost, zakončená řádkem obsahujícím pouze "."
Zašleme-li příkaz s parametrem čísla zprávy, odpověď bude jednořádková: +OK cislo_zpravy velikost
- RETR msg parametrem msg je číslo zprávy. Server vrátí obsah zprávy. Zprávu zakončí sekvencí CRLF.CRLF
- DELE msg Označí zprávu za smazanou. Odkaz na její číslo bude nadále vracet chybu. Server zprávu nevymaže dokud neobdrží příkaz UPDATE.
- NOOP neudělá nic, pouze pošle +OK
- RSET zruší příznak SMAZANÉ pro všechny zprávy ve schránce.
- UPDATE smaže zprávy označené za smazané, UPDATE je volán automaticky po příkazu QUIT.
- QUIT smaže zprávy označené za smazané, odemče schránku a ukončí TCP relaci.
Volitelné příkazy POP3
- TOP msg n Vypíše hlavičku zprávy číslo msg a n 58dků zprávy
- APOP login digest Využívá se místo USER a PASS, aby nebylo nutné zasílat jméno a heslo v čisté podobě. digest je pomocí MD5 hash pro TimestampHeslo, kde Timestamp zasílá server na začátku každé relace (v uvítací zprávě).
Příklad relace:
S:
C:
S: +OK POP-3 server ready. <0cbc05924ba5c6ff928c699491591dc9@arethusa1.fi.muni.cz>
C: APOP xuser c4c9334bac560ecc979e58001b3e22fb
S: +OK User ixuser logged in. UCO 77666.
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 Bye for now.
C:
S:
IMAP4 - Internet Message Access Protocol
IMAP4rev1 (dále jen IMAP4) popisuje: RFC 2060
Tento protokol umožňuje, narozdíl od POP3 nejen stažení emailu, ale také manipulaci s ním přímo na serveru.
Umožňuje:
- vytváření,mazání a přejmenovávání schránek
- kontrolu nových zpráv, mazání zpráv, editaci příznaků
- parsování RFC-822 a MIME-IMB
- vyhledávání
- stahování vybraných atributů zprávy
Příznaky zprávy
- \Seen Přečtená
- \Answered Odpovězená
- \Flagged Spěchá, je důležitá.
- \Deleted Označena pro smazání
- \Draft Koncept
- \Recent Čerstvě doručená
- další je možno vytvářet manuálně ...
Ve schránce je možné vytvářet libovolné složky a podsložky. Speciální složka INBOX je primární složkou uživatele. Pro názvy složek používající lokalizované znaky, např. diakritiku, se používá kódování UTF-7.
Klient může zasílat příkazy aniž by čekal na výsledek předešlého. Server je pak také současně zpracovává. Je však nutné simultálně spouštět pouze příkazy, které neovlivňují stejná data.
Relace vypadá tak, že po spojení klient zasílá řetězec (aby mohl identifikovat, k čemu patří odpověď) a příkaz, popřípadě parametry a server odpovídá.
Příkazy IMAP4rev1
Vždy použitelné:
- CAPABILITY seznam podporovaných rozšíření
- NOOP nic, jen vrátí OK
- LOGOUT
stav Přihlašování:
- AUTHENTICATE přihlášení speciálním způsobem - LDAP, KERBEROS
- LOGIN
stav Autentifikovaný:
- SELECT přepne se do složky (aktivuje režim Výběr) a vypíše údaje o ní
- EXAMINE jako select ale složka jen pro čtení
- Operace se složkami: CREATE, DELETE, RENAME
- SUBSCRIBE, UNSUBSCRIBE přidává, odebírá složky na seznamu zapsaných k odběru (LSUB)
- LIST
- LSUB
- STATUS vypíše stav složky
- APPEND umožňuje uložit zprávu do složky na serveru.
stav Výběr:
- CHECK
- CLOSE smaže zprávy s příznakem \Deleted , opustí složku a přejde do stavu Autentifikovaný.
- EXPUNGE smaže zprávy s příznakem \Deleted a vypíše id každé z nich.
- SEARCH vyhledá zprávu, která má dané parametry (příznaky, odesílatele, subject, nová, nečtená, odpověď, ....
- FETCH čtení zadaných částí dané zprávy
- STORE uloží nový obsah zadané zprávy
- COPY zkopíruje zprávu do dan0 složky
- X* příkazy začínající na X jsou experimentální příkazy neuvedené v RFC
Odpovědi serveru
Příklad relace
xuser3@speo:~> telnet imap.atlas.cz imap
Trying 212.47.13.67...
Connected to imap.atlas.cz.
Escape character is '^]'.
* OK Kerio MailServer ATLAS/18-02-2003b IMAP4rev1 server ready
a001 LOGIN xuser3 tajne_heslo
a001 OK LOGIN completed
a002 SELECT INBOX
* FLAGS (\Deleted \Seen \Answered \Draft \Flagged)
* 382 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1033742513] UID validity
* OK [UIDNEXT 383] Predicted next UID
* OK [PERMANENTFLAGS (\Deleted \Seen \Answered \Draft \Flagged)] Permanent flags
a002 OK [READ-WRITE] SELECT completed
a003 FETCH ALL
a003 BAD FETCH Invalid request format
a003 SEARCH ALL
* SEARCH 1 2 3 4 5
a003 OK SEARCH completed in 0.00 s
a004 FETCH 1 ALL
* 1 FETCH (RFC822.SIZE 4330 INTERNALDATE "03-Oct-2002 06:52:23 +0100" ENVELOPE (
"Wed, 02 Oct 2002 23:42:03 -0400" "Cash for xuser3@domena.cz" (("Theodora
Blesi" NIL "Bessfv" "bol.com.br")) (("Theodora Blesi" NIL "Bessfv" "bol.com.br"
)) (("Theodora Blesi" NIL "Bessfv" "bol.com.br")) ((NIL NIL "xuser3" "domena.cz
")) NIL NIL NIL "") FLAGS (\Seen))
a004 OK FETCH completed
a005 LOGOUT
* BYE logging out
a005 OK LOGOUT completed
Connection closed by foreign host.
QMAIL mailserver
O autorovi
Autorem qmailu je programátor zaměřený na počítačovou bezpečnost a profesor University of Illinois. Jeho nejznámější programy:
- qmail - Mail server
- djbdns - DNS server
- daemontools - náhrada init.d pro provoz daemonů
- ucspi-tcp - sada utilit pro tcp, zejména tcpserver (místo inetd)
O D.J.Bernsteinovi se rozepisuji zejména proto, že jeho programovací zvyklosti jsou hodně nestandardní.
Jak jsem se již zmínil, autor se zaměřuje na bezpečnost. U svých programů nabízí $500 za najití security hole. Na stránkách qmailu se prezentuje tím, že se to dosud nikomu nepodařilo. Za bezpečnost zde však zaplatíte použitím zcela nestandardních postupů, změnou základního adresářového stromu a také tím, že budete v podstatě donuceni užívat i ostatních programů od toho autora.
O programu
qmail je poštovní agent (MTA - Mail Transfer Agent) pro UNIXové operační systémy.
Důraz je kladen zejména na bezpečnost (běží pod různými uživateli, kteří si navzájem nevěří a postupně si email na cestě předávají), výkonnost (standardně zvládá simultálně doručovat až 20 emailů, spolehlivost (zaručuje, že se email neztratí při chybě během ukládání) a také jednoduchost (je menší než konkurenční MTA)
Qmail také přichází s revolučním adresářem Maildir, který nahrazuje soubor Mailbox. Pošta je rozdělena do mnoha souborů, díky čemuž není zpomalována tím, že už je jí v souboru mnoho, umožňuje současný přístup více klientů ke schránce, uzamyká pouze jednotlivé maily.
Od qmailu přebírá Maildir také Exim a postfix.
Historie
- 24.1.1996 Beta verze 0.70 (první veřejné vydání)
- 20.2.1996 Release 1.0
- 15.6.1998 Vydání stávající verze 1.03
Rozdělení programu
Je to sada programů, běžících pod různými uživateli, kterými email postupně prochází.
Pro pochopení doporučuji prohlédnout obrázky PIC.* v dokumentaci qmailu. Ještě lépe The big qmail pictures od André Oppermanna.
Základní programy
- qmail-smtpd přijímá poštu přes SMTP protokol
Kompatibilní s: RFC 821, RFC 974, RFC 1123, RFC 1651, RFC 1652, a RFC 1854
kontrola přeposílání (možnost zakázat přeposílání zvenku jinam)
- qmail-queue fronta přes kterou prochází všechna pošta
Rozdělení fronty do adresářů (nespomaluje se když je fronta velká)
Inteligentní znovuzasílání nepodařených odeslání (pokusy čím dál méně často)
Záchrana mailů ve frontě po pádu systému, zobrazení fronty, statistiky doručení (přes qmailanalog).
- qmail-inject přijímá poštu od lokálních uživatelů
- qmail-send zjišťuje, pro kterého lokálního (virtuálního), či vzdáleného uživatele je zpráva a doručuje pomocí qmail-lspawn (lokální) a qmail-rspawn (vzdálené)
- qmail-clean maže pomocné soubory pozůstalé po pádu počítače
- qmail-rspawn předává zprávu qmail-remote
- qmail-lspawn zjišťuje existenci účtů lokálních uživatelů, kontroluje jestli nejsou skupina root, patří jim jejich Mailbox (maildir) apod. Zprávu předávají k doručení pomocí qmail-local
- qmail-remote odesílá přes SMTP danému serveru
- qmail-local doručuje uživateli dle jeho osobního nastavení (soubory .qmail*)
Ostatní
- qmail-pop3d RFC 1939 - POP3 služba
- qmail-qstat Statisktika fronty
- qmail-qread Čtení fronty
- qmail-showctl Vypíše nastavení qmailu
Pomocné programy a utility
Tyto je třeba stáhnout zvlášť z cr.yp.to
- ucspi-tcp náhrada za inetd (výrazně bezpečnější), umožňuje předávat parametry, podle toho odkud pochází připojení
- daemontools správa daemonů a jejich logů
- qmailanalog analyzátor logů qmailu
- serialmail mailování po pomalých sítích
- mess822 utilitky pro parsování emailů
- ezmlm správa mailing listů pro qmail
Kompatibilita
- dot-forward sendmailovské .forward
- fastforward sedmailovské /etc/aliases
Instalace
K instalaci systému existuje mnoho návodů typu bash skriptů:
FreeBSD: Qmail FreeBSD Mail Toaster
Linux: mnoho odkazů z qmail.org
Základní postup pro Linux:
Stáhneme si qmail z www.qmail.org a rozbalíme. Vytvoříme adresář /var/qmail, upravíme soubor INSTALL.ids dle našeho operačního systému a následně vytvoříme potřebné uživatele spuštěním toho souboru a spustíme make.
cd /usr/local/src
wget http://qmail.kn.vutbr.cz/qmail-1.03.tar.gz
gunzip qmail-1.03.tar.gz
tar xpf qmail-1.03.tar
mkdir /var/qmail
cd /usr/local/src/qmail-1.03
úprava INSTALL.ids
sh INSTALL.ids
make setup check
Nyní je třeba vytvořit konfigurační soubory:
./config-fast hostname.domena.cz
Konfigurační soubory jsou v /var/qmail/control. Upravíme podle svých potřeb. Popis souborů uvádím v sekci konfigurace.
Doporučuji: ln -s /var/qmail/control /etc/qmail
Vytvoříme aliasy pro root,postmaster a mailer-daemon, poněvadž qmail nedoručuje poštu root uživatelům.
cd ~alias;
echo "&user3@jinadomena.cz" > .qmail-postmaster
cp .qmail-postmaster .qmail-mailer-daemon
echo "user3" > .qmail-root
chmod 644 ~alias/.qmail*
Zbývá smazat sendmail a vytvořit alias na speciální sendmail, který bude doručovat přes qmail od aplikací které ho používají.
ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
Systém spouštíme (první používá mailbox, druhý Maildir):
/var/qmail/bin/qmail-start ./Mailbox /var/qmail/bin/splogger qmail &
/var/qmail/bin/qmail-start ./Maildir/ /var/qmail/bin/splogger qmail &
POZOR! Maildir adresáře je třeba vytvořít pomocí maildirmake.
Pro spouštění pomocí RC skriptů si stáhněte RedHat RCskript, popřípadě použijte daemontools. Pro ty, co si zvykly na daemontools např. u DJBDNS doporučuji qmail-conf, který vytvoří skripty qmail-*-conf a pomocí těch můžeme jednoduše tvořit adresáře pro daemontools.
Před použitím je vhodné nainstalovat ucspi-tcp (náhrada inetd).
tcpserver -v -u qmaild -g nofiles 0 smtp /var/qmail/bin/qmail-smtpd &
RELAYING se řeší pomocí ucspi-tcp:
echo '127.:allow,RELAYCLIENT=""' > /etc/qmail/tcp.smtp
echo '192.168.:allow,RELAYCLIENT=""' >> /etc/qmail/tcp.smtp
echo ':allow' >> /etc/qmail/tcp.smtp
tcprules /etc/qmail/tcp.smtp.cdb /etc/qmail/smtp.tmp /etc/qmail/etc.smtp
Funkčnost lze otestovat pomocí TEST.deliver a TEST.receive v dokumentaci.
Antivirový a antispamový filtr qmail-scanner
Vzhledem k počtu virů a spamů, které se v poslední době na internetu šíří je vhodné tyto emaily filtrovat přímo na emailovém serveru a jednotlivým uživatelům už, alespoň viry, ani nezasílat. Toto je možné docílit pomocí předřazené fronty qmail-scanner.
Qmail-Scanner: http://qmail-scanner.sourceforge.net/
Tento scanner pracuje na principu předřazené fronty. Takže při doručování pošty je zpráva předána forntě qmail-scanner-queue a až po dokončení kontroly se zpráva předá klasické qmail-queue. Qmail-scanner také dopisuje, dle nastavení X hlavičky s informacemi o své práci, může adresáta také informovat textově, že mu byl zaslán virus, spamy označit příznakem, upravit předmět apod.
Snadno si můžete přidat vlastní filtry. Mazat přílohy daného typu apod.
Instalace antivirových a antispamových programů:
Nainstalujeme podporované programy. Viz. homepage. Z mnoha jmenuji alespoň: Kaspersky AVP, MacAfee, F-prot, RAV Antivirus, Spam Assassin, ...
Instalace:
Je zde více možností:
- bez zásahu do zdrojů qmail přejmenujeme qmail-queue na qmail-orig-queue a qmail-scanner-queue.pl na qmail-queue. V konfiguraci scanneru nastavíme, že následující fronta je qmail-orig-queue.
- změna fronty ve zdrojích nastavíme jako primární frontu qmail-scanner-queue.pl a rekompilujeme.
- aplikace patche pomocí PATCHE umožníme měnit frontu pomocí parametru. Ten pak předáváme např. pomocí tcpeserveru. Je tedy možné skenovat jen poštu z venku a ne z vnitřní sítě apod.
Následuje stručná instalace s aplikací patche.
cd /usr/local/src/
wget http://www.qmail.org/qmailqueue-patch
cd /usr/local/src/qmail-1.03
patch -p0 < qmailqueue-patch
cd qmail-1.03
make setup check
cd ..
wget http://prdownloads.sourceforge.net/qmail-scanner/qmail-scanner-1.16.tgz
tar xzvf qmail-scanner-1.16.tgz
cd qmail-scanner-1.16/
./config --help
./config
./config --install
# otestovani funkcnosti
./contrib/test_installation.sh
Nyní zbývá nastavit tcpserver. Např. takto:
/etc/tcpserver/smtp.rules
#
# Zadny Qmail-Scanner na maily z 127.x.x.x
127.:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="/var/qmail/bin/qmail-queue"
# Qmail-Scanner bez SpamAssassin na postu z mistni site
# [it triggers SpamAssassin via the presence of the RELAYCLIENT var]
10.:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
#
# Qmail-Scanner se SpamAssassin na postu z okolniho sveta
:allow,QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
Odkazy na související programy
V této sekci uvadíme pouze odkazy na programy, které by se vám mohli ke qmailu hodit.
- qmail-ldap
- vpopmail virtuální domény a uživatelé (oracle,syabse,mysql,ldap,cdb)
- Courier-IMAP qmail samotný umí pouze POP3, Courier-imap zvládá pop3,pop3s,imap,imaps a podporuje Maildir adresáře.
- SquirelMail kvalitní webmail
Konfigurace
Konfigurační soubory
- defaultdomain doména serveru (kterou se bude hlásit venku)
- locals lokální domény = domény pro něž počítač doručuje poštu lokálním uživatelům
- me název počítače na kterém je qmail (např. mail.domena.cz)
- rcpthostsdomény pro které je možno přijmout poštu
Aliasy
Aliasy uživatelů se řeší pomocí .qmail* souborů (namísto .forward).
Po příchodu je pošta doručena uživateli. Nenajde-li se potřebný uživatel, prohledávají se .qmail* soubory v homu uživatele alias.
Soubor obsahuje na každém řádku jednoho uživatele kterému se má email doručit, popřípadě emailové adresy začínající znakem & pro přeposlání. Potom se obdobně prohledává domovský adresář daného uživatele.
Příklad:
Pro pes@domena.cz vytvoříme echo "user3" > /var/qmail/alias/.qmail-pes
Tím doručíme daný email uživatelovi user3.
Uživatelé si mohou doručení upravit pomocí .qmail či pomocí
.qmail-cokoli ve svém homu tvořit aliasy pro user3-cokoli@domena.cz.
Speciální soubor .qmail-default doručí uživatelům v něm uvedeným všechny zprávy, které nevyhoví jiným pravidlům (jinak se vrátí jako nedoručitelné).
Zdroje
RFC: RFC 2821 (SMTP)
RFC 1939 (POP3)
RFC 2060 (IMAP)
http://www.lifewithqmail.org Life with Qmail
http://www.qmail.org Hlavní stránka qmailu
http://cr.yp.to D.J.Bernstein