1. Przegld

Oto diagram przepywu danych w systemie qmail:

 qmail-smtpd --- qmail-queue --- qmail-send --- qmail-rspawn --- qmail-remote
               /                     |      \
qmail-inject _/                 qmail-clean  \_ qmail-lspawn --- qmail-local

Kada wiadomo dodawana jest do katalogu kolejki przez qmail-queue.
qmail-queue uruchamiany jest w razie potrzeby przez: qmail-inject dla wiadomoci
lokalnych, qmail-smtpd dla wiadomoci otrzymanych przez SMTP,
qmail-local dla wiadomoci przesyanych, qmail-send dla wiadomoci odbitych.

Nastpnie kada wiadomo dostarczana jest przez qmail-send, ktry kooperuje z
qmail-lspawn i qmail-rspawn, wiadomoci usuwane s przez qmail-clean.
Te cztery programy dziaaj jako demony.

Kolejka jest tak zaprojektowana, e jest odporna, jeeli odporny jest
system plikw. Wszystkie porzdki dokonywane s przez qmail-send i
qmail-clean, bez ludzkiej interwencji. Szczegy w sekcji 6.


2. Struktura kolejki

Kada wiadomo w kolejkie indentyfikowana jest przez unikaln liczb,
powiedzmy 457. Kolejka podzielona jest na kilka katalogw, w ktrych
znajduj si rne informacje na temat 457 wiadomoci:

   mess/457: wiadomo
   todo/457: koperta: skd nadesza wiadomo i gdzie zmierza
   intd/457: koperta w czasie tworzenia przez qmail-queue
   info/457: adres nadawcy koperty, po przetworzeniu
   local/457: lokalni odbiorcy koperty, po przetworzeniu
   remote/457: zdalni odbiorcy koperty, po przetworzeniu
   bounce/457: totalne poraki

Oto wszystkie moliwe stany dla danej wiadomoci. + oznacza e plik istnieje,
- nie istnieje, ? moe istnie:

   S1. -mess -intd -todo -info -local -remote -bounce
   S2. +mess -intd -todo -info -local -remote -bounce
   S3. +mess +intd -todo -info -local -remote -bounce
   S4. +mess ?intd +todo ?info ?local ?remote -bounce (zakolejkowana)
   S5. +mess -intd -todo +info ?local ?remote ?bounce (przetworzona)

Gwarantowane: jeeli mess/457 istnieje, ma numer iwza 457.


3. Jak wiadomo zostaje wprowadzona do kolejki

Aby doda wiadomo do kolejki qmail-queue najpierw tworzy plik w oddzielnym
katalogu - pid/, z unikaln nazw. System plikw przypisuje plikowi unikalny
numer iwza. qmail-queue sprawdza ten numer, powiedzmy 457.
Przez powysz gwarancj wiadomo 457 musi by w stanie S1.

qmail-queue zmienia pid/cokolwiek na mess/457, przechodzc do S2. Wiadomo
zostaje zapisana w mess/457. Zostaje utworzony intd/457, przechodzc w S3,
informacje z kopererty zostaj zapisane w intd/457.

qmail-queue tworzy nowe odwoanie z todo/457 do intd/457, przechodzc do
kroku S4. Wiadomo zostaa pomylnie umieszczona w kolejce,
qmail-queue pozostawia j dla qmail-send.

qmail-queue rozpoczyna 24 godzinne odliczanie, rezygnuje jeeli czas upynie.


4. Jak zakolejkowane wiadomoci s przetwarzane

Po umieszczeniu wiadomoci w kolejce qmail-send musi podzieli odbiorcw
na lokalnych i zdalnych. Moe rwnie zmieni niektre adresy.

Kiedy qmail-send zobaczy plik todo/457, wie e wiadomo jest w stanie S4.
Usuwa info/457, local/457 i remote/457, jeeli istniej. Przeglda
todo/457. Tworzy info/457, prawdopodobnie local/457, oraz remote/457.
Po skoczeniu usuwa intd/457. Wiadomo nadal jest w stanie S4.
W kocu, qmail-send usuwa todo/457, przechodzc w ten sposb do kroku S5.
Wiadomo zostaa pomylnie przetworzona.


5. Jak przetworzone wiadomoci s dostarczane

Wiadomo w stanie S5 obsugiwana jest nastpujco. Kady adres zawarty w
local/457 i remote/457 jest oznaczany jako ZROBIONY, lub NIEZROBIONY.

   ZROBIONY: wiadomo zostaa pomylnie dostarczona, lub nastpio cakowite
             odrzucenie. W obu przypadkach qmail-send nie bdzie wicej
             prbowa dostarczy wiadomoci pod ten adres.

   NIEZROBIONY: jeeli napotkano bd tymczasowy, lub nie byo prby
             wysania. W oby przypadkach qmail-send sprbuje pniej
             dostarczy wiadomo.

qmail-send prbuje dostarcza wiadomo pod adresy oznaczone jako NIEZROBIONY.
Jeeli wiadomo zostanie dostarczona obiorca zostanie oznaczony jako ZROBIONY.
Jeeli nastpio cakowite odrzucenie qmail-send zostawia wiadomo w
bounce/457, po czym oznacza adres jako ZROBIONY. Zauwa, e bounce/457 nie jest
wypadkoodporny.

qmail-send moe obuy bounce/457 w dowolnej chwili, dzieje si to
nastpujco: (1) wstrzeliwuje do kolejki wiadomo o bdzie, ktra
zostaa utworzona z bounce/457 i mess/457; (2) usuwa bounce/457.

Po oznaczeniu wszystkich adresw w local/457 jako ZROBIONY, qmail-send usuwa
ten plik. To samo dotyczy si remote/457.

Jeeli local/457 i remote/457 zniky qmail-send eliminuje wiadomo
w nastpujcy sposb. Jeeli instnieje bounce/457 qmail-send obuguje
go w sposb opisany powyej. Jeeli nie ma ju tego pliku qmail-send
usuwa info/457, przechodzi do S2 i usuwa mess/457, teraz jest w stanie S1.


6. Porzdki

Jeeli komputer pada podczas prby wstrzelenia wiadomoci, lub podczas
usuwania wiadomoci moe ona zosta w stanie S2, lub S3.

qmail-send widzc wiadomo w stanie S2, lub S3, ktra nie jest wanie
przez niego eliminowana, przy czym mess/457 ma wicej ni 36 godzin,
usuwnie intd/457, pniej mess/457. Zauwa, e qmail-queue odpowiedzialny
za t wiadomo musi by martwy.

Podobnie, qmail-send widzc w katalogu pid/ plik, ktry jest starszy ni
36 godzin, usuwa go.

Czyszczenie nie jest konieczne jeeli komputer padnie w trakcie dostarczania
wiadomoci. W najgorzym wypadku wiadomo zostanie dwkrotnie dostarczona.
(nie ma moliwoci, dla rozproszonego systemu pocztowego, wyeliminiowania
duplikatw. Co si stanie jeeli poczenie SMTP zostanie zerwane tu
przed kocem? Klient musi zaoy najgorsze i przesa wiadomo ponownie.
Podobnie, jeeli komputer padnie przed uznaniem adresu za ZROBIONY, nowa
wiadomo pocztowa musi zosta wysana. Rozwizaniem mogoby by przechowywanie
logw na maszynie odbierajcej i usuwanie duplikatw.)


7. Dodatkowe informacje

Aktualnie info/457 istnieje z dwch powodw: zawiera nadawc koperty,
czas modyfikacji uywany jest do okrelenia czasu pobytu wiadomoci w kolejce.
W przyszoci info/457 moe przechowywa wicej informacji.
Wszystkie zmiany zgodne z poprzednikami bd oznaczane numerem wersji.

Po tym jak qmail-queue umieci wiadomo w kolejce, wywouje
qmail-send. Aktualny mechanizm blokada/wywoanie oparty jest na nazwanym
potoku. Przed skanowaniem todo/ qmail-send otwiera blokad/wywoanie z
opcj O_NDELAY w celu czytania, po czym czeka na znak. qmail-queue uruchamia
program przez zapisanie bajtu O_NDELAY do tego potoku. Dziki temu
qmail-send zostaje obudzony. Przed kolejnym skanowaniem todo/ qmail-send
zamyka i ponownie otwiera potok.
