maildir(5) katalog na przychodzące wiadomości pocztowe

WPROWADZENIE

maildir jest strukturą drzewiastą katalogów listów przychodzących. Rozwiązuje problemy niezawodności, jakie trapiły pliki mbox i katalogi pocztowe mh.

KWESTIE NIEZAWODNOŚCI

Podczas przekazywania listu może nastąpić załamanie się systemu. W przypadku plików mbox, jak i katalogów mh list ten zostanie wówczas obcięty. Co gorsza: przy formacie mbox, jeśli list zostanie ucięty w środku linii, to zostanie złączony z następnym. Agent transportu poczty (MTA) będzie później próbował ponownie dostarczyć list, ale jest niedopuszczalne, żeby popsuta wiadomość w ogóle się pojawiała. W maildir każdy list po przesłaniu jest z pewnością kompletny.

Na danej maszynie mogą równocześnie pracować dwa programy dostarczające pocztę do tego samego użytkownika. Formaty mbox i mh wymagają, by oba programy aktualizowały jeden centralny plik. Jeśli nie korzystają one z jakiegoś mechanizmu blokowania, to plik ten zostanie uszkodzony. Istnieje kilka mechanizmów blokowania mbox i mh, z których żaden nie działa przenośnie i niezawodnie. W przypadku maildir żadne blokady nie są nigdy potrzebne. Różne procesy dostarczania nigdy nie tykają tego samego pliku.

Użytkownik może próbować usunąć listy ze swojej skrzynki w tej samej chwili, gdy maszyna dostarcza nowy list. Przy formatach mbox i mh czytnik poczty użytkownika musi wiedzieć, jakiego mechanizmu blokowania używają programy dostarczające pocztę. Inaczej jest w przypadku maildir, gdzie czytnik poczty może bezpiecznie aktualizować lub usuwać dowolny dostarczony list.

Wiele ośrodków korzysta z Sunowego Network Failure System (NFS), zapewne dlatego, że dostawca systemu operacyjnego nie oferuje niczego innego. NFS pogarsza wszystkie powyższe problemy. Niektóre z implementacji NFS nie zapewniają żadnego solidnego mechanizmu blokowania. Przy formatach mbox i mh, gdy dwie maszyny dostarczają pocztę do tego samego użytkownika lub gdy użytkownik czyta pocztę gdzieś poza maszyną dostarczającą, jego poczta jest zagrożona. maildir działa z NFS bez kłopotów.

STRUKTURA MAILDIR

Katalog w formacie maildir ma trzy podkatalogi, wszystkie na tym samym systemie plików: tmp, new i cur.

Każdy plik w new jest świeżo dostarczonym listem. Czas modyfikacji pliku jest czasem dostarczenia. List jest dostarczany bez dodatkowej linii From_ w stylu UUCP, bez żadnego cytowania >From i bez dodatkowej pustej linii na końcu. Wiadomość ma normalnie format RFC 822, zaczynając się liniami Return-Path i Delivered-To, ale może zawierać dowolne dane binarne. Może nawet nie kończyć się znakiem nowej linii.

Pliki w cur są takie jak w new. Różnicę stanowi to, że pliki w cur nie są już nowymi listami: czytnik poczty użytkownika już je widział.

JAK LIST JEST DOSTARCZANY

Do zapewnienia niezawodności dostarczania wykorzystuje się katalog tmp.

Program dostarcza przesyłkę pocztową w sześciu etapach. Najpierw, wykonuje chdir() do katalogu maildir. Potem pobiera za pomocą stat() informacje o pliku o nazwie tmp/time.pid.host, gdzie time to liczba sekund od początku roku 1970 strefy czasowej GMT, pid to identyfikator procesu programu, a host jest nazwą komputera. W kroku trzecim, jeśli stat() zwrócił coś innego niż ENOENT [ENOENT=plik nie istnieje], program zasypia na dwie sekundy, aktualizuje time, i ponownie próbuje stat(), ograniczoną liczbę razy. W czwartym kroku program tworzy tmp/time.pid.host. W piątym zapisuje przez zapis-NFS przesyłkę do utworzonego pliku. W szóstym kroku program, za pomocą link() tworzy nowe dowiązanie tego pliku, new/time.pid.host. W tym momencie list dostał pomyślnie dostarczony.

Program dostarczający przed utworzeniem tmp/time.pid.host powinien uruchomić 24-godzinny licznik czasu i porzucić dostarczanie jeśli licznik zostanie przekroczony. W przypadku wystąpienia błędu, przekroczenia limitu czasu czy normalnego zakończenia działania, program może spróbować użyć unlink() do usunięcia tmp/time.pid.host.

Zapis-NFS oznacza (1) jak zwykle, sprawdzenie liczby bajtów zwracanych z każdego wywołania write(); (2) wywołanie fsync() i sprawdzenie zwróconej wartości; (3) wywołanie close() i sprawdzenie zwróconej wartości. (Standardowe implementacje NFS obsługują fsync() niepoprawnie, ale poprawiają to niewłaściwym użyciem close()).

JAK LIST JEST CZYTANY

Czytnik poczty działa jak następuje.

Przegląda katalog new, szukając nowych wiadomości. Powiedzmy, że mamy nowy list, new/unikat. Czytnik może swobodnie wyświetlić zawartość pliku new/unikat, usunąć go lub zmienić mu nazwę na cur/unikat:info. Znaczenie info opisano na stronie http://pobox.com/~djb/proto/maildir.html.

Oczekuje się również, że czytnik przeglądnie katalog tmp i wyczyści ewentualne znalezione tam stare pliki. Plik w tmp można bezpiecznie usunąć jeśli nie sięgano do niego w ciągu ostatnich 36 godzin.

Warto, by czytniki pomijały wszystkie te pliki w new i cur, których nazwy zaczynają się od kropki. Czytniki nie powinny próbować analizować nazw plików.

ZMIENNE ŚRODOWISKOWE

Czytniki poczty obsługujące maildir korzystają ze zmiennej środowiskowej MAILDIR jako nazwy podstawowego katalogu pocztowego użytkownika.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Wojtek Kotwica (PTM) <[email protected]> i Robert Luberda <[email protected]>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 1.06 oryginału.