A szerverünkön MAILDIR formátumot használlunk. Ennek okairól itt egy rövid ismertető:
Mi történik, ha pont akkor dől össze a rendszer, amikor éppen hozzáfűzi az érkező
levelet a Mailbox-hoz? Az üzenet alaposan meg lesz csonkítva, ráadásul ha a
sor közepén történik a "baleset", akkor a következő levél
ehhez a törött sorhoz lesz hozzáfűzve. A mailer persze megérti, hogy el lett
rontva a kézbesítés, és újra kikézbesíti, de utána már elég problémás megjavítani
az összeroncsolt mbox-to, nem beszélve arról, hogy a szakadt üzenetet már nem
lehet visszaállítani.
Ezzel szemben a maildir formátum eléggé crash-biztos, gyorsabb és megbízhatóbb,
mint az mbox, ráadásul csodákra képes, ha NFS-en át használjuk. Az mbox formátum
magában is elég megbízhatatlan, de NFS-en át még rosszabb, az NFS átviteli tulajdonságai
miatt.
Mailbox formátumnál könnyen előfordulhat, hogy egyszerre több processz akar
ugyanabba a file-ba kézbesíteni. Ilyenkor, hacsak nem alkalmaznak valamiféle
lockolű mechanizmust, az mbox könnyen megsérülhet. Kitaláltak már elég sok mbox
és mh lockoló módszert, de még egyik sem mutatkozott nagyon stabilnak. Maildir
formátumnál egyáltalán nincs szükség lockoló mechanizmusra, mert sohasem fordul
elő, hogy különböző processzek ugyanabba a file írjanak.
Mbox-nál az is előfordulhat, hogy kézbesítés közben a kedves felhasználó épp
kézbesítés közben szeretne levelet törölni a Mailbox-ból. Ehhez a levelező programnak
ismernie kell a kézbesítő által használt lockoló mechanizmust. Maildir használatánál
a levelezőnek nem kell ezzel foglalkoznia.
Sok site még most is használják a Sun NFS rendszerét, valószínűleg azért, mert
a forgalmazó nem kínált más megoldást. Az NFS csak súlyosbítja az előbb említett
problémákat, ugyanis vannak olyan NFS implementációk, amelyek SEMMILYEN lockoló
mechanizmust nem tartalmaznak, így az mbox file-ok épségét kockáztatják, ha
egynél több kézbesítés történik egyszerre.
A Maildir felépítése:
- $HOME/Maildir/new
/cur
/tmp
A /new tartalmazza az éppen fogadott üzeneteket, ahol a file modifikációs dátuma
a kézbesítés időpontját jelenti.Ez az üzenet mentes mindenféle UUCP sallangtól,
mint a FROM_ mező, és üres sor sincs a végén.
A /cur teljesen ugyanez a stílus, a különbség csak annyi, hogy az itt tárolt
leveleket már olvasták, és a levelezőprogram mozgatta át őket a /new könyvtárból.
A Maildir titka a /tmp könyvtár, ami garancia a halálbiztos kézbesítésre.
A kézbesítés hat lépcsőben történik:
1. Belép a Maildir könyvtárba.
2. A stat() függvénnyel megnézi, hogy a Maildir/tmp-ben van-e idő.pid.host_neve
formátumú file-névvel rendelkező állomány. (idő=1970 óta eltelt másodpercek
száma (9 jegy), a kézbesítő processz ID-ja (max. 5 jegy), és a gép host neve)
3. Ha a stat() azzal jön vissza, hogy ilyen file már létezik, akkor vár egy
másodpercet, és újra megnézi.
4. Létrehozza az idő.pid.host_neve file-t.
5. Beleírja a levelet a file-ba.
6. Csinál egy hardlinket a /new könyvtárba /new/idő.pid.host_neve névre. Ebben
a pillanatban befejezettnek tekinthetjük a kézbesítést.
Hogyan működik az olvasás?
A levelező a Maildir/new-ból tudja a levelet olvasni, de akár le is törölheti.
Olvasás után a levél átkerül a /cur könyvtárba, de nem ugyanarra a névre, hanem
kap még egy :-al elválaszott infó mezőt is, ahol:
1. Kísérleti szemantika
2. Azt jelenti, hogy minden, a vessző utáni karakter egy különálló flagnek felel
meg.
Flagek:
S: Seen, olvasott levél
T: Trash, törlésre kijelölt levél
F: Flagged: későbbi user tranzakcióra kijelölt levél.
Egyetlen kikötés a flag-ekkel kapcsolatban, hogy az ASCII táblának megfelelő
sorrendben legyenek. Pl.: 2,FRS