Maildir

poczty e-mail Maildir to powszechny sposób przechowywania wiadomości e-mail , w którym każda wiadomość jest przechowywana w oddzielnym pliku o unikalnej nazwie, a każdy folder poczty jest katalogiem systemu plików. Lokalny system plików obsługuje blokowanie plików podczas dodawania, przenoszenia i usuwania wiadomości. Głównym celem projektowym Maildir jest wyeliminowanie potrzeby stosowania kodu programu do obsługi blokowania i odblokowywania plików.

Struktura wewnętrzna

Specyfikacje

Katalog Maildir (często nazywany Maildir ) zwykle ma trzy podkatalogi o nazwach tmp , new i cur .

Podkatalog tmp tymczasowo przechowuje wiadomości e-mail, które są w trakcie dostarczania. Ten podkatalog może również przechowywać inne rodzaje plików tymczasowych. Nowy , które zostały dostarczone, ale nie zostały jeszcze odczytane przez żadną aplikację pocztową. Podkatalog cur przechowuje wiadomości, które były już widziane przez aplikacje pocztowe.

Maildir++

Sam Varshavchik, autor Courier Mail Server i innego oprogramowania, napisał rozszerzenie do formatu Maildir o nazwie Maildir++ , które obsługuje podfoldery i przydziały poczty. Katalogi Maildir++ zawierają podkatalogi, których nazwy zaczynają się od „.” (kropka), które są również folderami Maildir++. To rozszerzenie jest zgodne ze specyfikacją Maildir, która wyraźnie przewiduje możliwość dodania do katalogu maildir więcej niż tmp, new, cur.

Operacja techniczna

Agent dostarczania poczty to program dostarczający wiadomość e-mail do katalogu Maildir. Agent dostarczania poczty tworzy nowy plik o unikalnej nazwie w tmp . Oryginalny algorytm z około 1995 roku do generowania unikalnych nazw plików, zaimplementowany przez qmail był następujący:

  1. odczytanie aktualnego czasu Unix
  2. odczytać bieżący identyfikator procesu (PID)
  3. przeczytaj bieżącą nazwę hosta
  4. połączyć powyższe trzy wartości w łańcuch oddzielony znakiem kropki ; to jest nowa nazwa pliku
  5. jeśli stat() zgłasza, że ​​nazwa pliku istnieje, poczekaj dwie sekundy
  6. przejdź do poprzedniego kroku, aż nazwa pliku nie istnieje
  7. utwórz plik o unikalnej nazwie i zapisz treść wiadomości do nowego pliku

Do 2000 roku autor qmaila zalecił dołączenie do PID wartości licznika na proces, którego wartość powinna być zwiększana po każdym dostarczeniu, a sugestia ograniczenia szybkości została odrzucona.

Do 2003 r. zalecenia zostały dodatkowo zmienione i wymagały, aby zamiast PID i licznika środkowa część nazwy pliku była tworzona przez „połączenie wystarczającej liczby następujących ciągów, aby zagwarantować niepowtarzalność” nawet w przypadku wielu jednoczesnych dostaw do ten sam katalog pocztowy z jednego lub więcej procesów:

  • # n , gdzie n jest (w systemie szesnastkowym) wynikiem wywołania systemowego unix_sequencenumber() systemu operacyjnego, które zwraca liczbę rosnącą o 1 przy każdym wywołaniu, zaczynając od 0 po restarcie.
  • X n , gdzie n jest (w systemie szesnastkowym) wynikiem wywołania systemowego unix_bootnumber() systemu operacyjnego , które podaje liczbę uruchomień systemu. Wraz z # gwarantuje to wyjątkowość; niestety większość systemów operacyjnych nie obsługuje unix_sequencenumber() i unix_bootnumber() .
  • R n , gdzie n jest (w systemie szesnastkowym) wynikiem wywołania systemowego unix_cryptorandomnumber() systemu operacyjnego lub równoważnego źródła, takiego jak /dev/urandom . Niestety, niektóre systemy operacyjne nie zawierają kryptograficznych generatorów liczb losowych.
  • I n , gdzie n jest (w systemie szesnastkowym) numerem i-węzła systemu UNIX tego pliku. Niestety, numery i-węzłów nie zawsze są dostępne przez NFS .
  • V n , gdzie n to (w systemie szesnastkowym) numer urządzenia UNIX tego pliku. Niestety numery urządzeń nie zawsze są dostępne przez NFS. (Numery urządzeń również nie są pomocne w standardowym systemie plików UNIX: katalog maildir musi znajdować się w obrębie jednego urządzenia UNIX, aby link() i rename() działały.)
  • M n , gdzie n jest (w systemie dziesiętnym) licznikiem mikrosekund z tej samej funkcji gettimeofday() użytej dla lewej części unikalnej nazwy.
  • P n , gdzie n jest (w systemie dziesiętnym) identyfikatorem procesu.
  • Q n , gdzie n to (w systemie dziesiętnym) liczba dostaw dokonanych przez ten proces.

Algorytm ten został skrytykowany w 2006 roku przez Timo Sirainena , twórcę Dovecot , jako niepotrzebnie skomplikowany.

Od listopada 2018 r. autor qmail Daniel Bernstein nie wprowadził żadnych dalszych zmian w tych zaleceniach dotyczących generowania nazw plików. W nowoczesnych systemach POSIX pliki tymczasowe można bezpiecznie tworzyć za pomocą funkcji bibliotecznej mkstemp C.

Proces dostarczania zapisuje wiadomość w katalogu maildir, tworząc i zapisując w tmp/ uniquefilename , a następnie przenosząc ten plik do new/ uniquefilename . Przenoszenie można wykonać za pomocą rename , które w wielu systemach jest atomowe. Alternatywnie można to zrobić przez twarde dowiązanie pliku do nowego , a następnie odłączenie pliku od tmp . Wszelkie pozostałe pliki zostaną ostatecznie usunięte. Ta sekwencja gwarantuje, że program czytający maildir nie zobaczy częściowo napisanej wiadomości. W tym samym czasie może być wiele programów czytających katalog pocztowy. Obejmują one agentów użytkownika poczty (MUA), które uzyskują bezpośredni dostęp do systemu plików serwera, poprzez serwery Internet Message Access Protocol lub Post Office Protocol działające w imieniu zdalnych MUA, po narzędzia takie jak biff i rsync , które mogą być świadome lub nie struktury maildir. Czytelnicy nigdy nie powinni zaglądać do tmp .

Kiedy świadomy proces odczytu katalogu maildir ( serwer POP lub IMAP albo agent użytkownika poczty działający lokalnie) znajdzie wiadomości w nowym katalogu, musi przenieść je do cur . Jest to tylko sposób na powiadomienie użytkownika „masz X nowych wiadomości”. To przeniesienie musi być wykonane przy użyciu rename() , ponieważ nieatomowa technika link-then-unlink może spowodować zduplikowanie wiadomości. Na tym etapie do nazw plików dodawany jest sufiks informacyjny. Składa się z dwukropka (aby oddzielić unikalną część nazwy pliku od rzeczywistych informacji), „2”, przecinek i różne flagi . „2” określa wersję informacji, która następuje po przecinku. „2” to jedyna obecnie oficjalnie określona wersja, „1” to wersja eksperymentalna. Specyfikacja definiuje flagi, które pokazują, czy wiadomość została przeczytana, usunięta itd.: początkowa (duża) litera „Przekazano”, „Odpowiedziano”, „Widział”, „Wyrzucono”, „Wersja robocza” i „Oznaczono”. Dovecot używa małych liter, aby dopasować 26 słów kluczowych IMAP, które mogą zawierać standardowe słowa kluczowe, takie jak $ MDNSent i flagi zdefiniowane przez użytkownika.

Chociaż Maildir miał umożliwiać korzystanie bez blokad, w praktyce niektóre programy korzystające z Maildirs również używają blokad, na przykład Dovecot.

Problemy ze zgodnością systemu plików

Standard Maildir można zaimplementować tylko w systemach, które akceptują dwukropki w nazwach plików.

Systemy, które nie zezwalają na stosowanie dwukropków w nazwach plików (dotyczy to Microsoft Windows i niektórych konfiguracji Novell Storage Services ) mogą używać alternatywnego separatora, takiego jak „;” Lub "-". Łatanie bezpłatnego oprogramowania typu open source w celu użycia innego separatora jest często trywialne.

Ponieważ obecnie nie ma zgody co do tego, jaki charakter powinien mieć ten alternatywny separator, mogą wystąpić problemy z interoperacyjnością między różnymi programami obsługującymi Maildir w tych systemach. Jednak nie wszystkie programy związane z Maildir muszą wiedzieć, jaki jest znak separatora, ponieważ nie wszystkie programy związane z Maildir muszą mieć możliwość odczytywania lub modyfikowania flag wiadomości („przeczytaj”, „odpowiedziano” itp.); oprogramowanie, które jedynie dostarcza do katalogu Maildir lub archiwizuje z niego stare wiadomości tylko na podstawie daty, powinno działać niezależnie od używanego separatora. Gdyby tylko MUA musi odczytywać lub modyfikować flagi komunikatów, a używany jest tylko jeden MUA, wówczas niestandardowe alternatywne separatory mogą być używane bez problemów ze współdziałaniem.

Oprogramowanie obsługujące bezpośrednio Maildir

Serwery pocztowe

Dostawcy

Czytniki poczty

  • aerc (wydajny i rozszerzalny klient poczty)
  • Balsa poprzednio oficjalny czytnik poczty GNOME (przed Evolution)
  • Cone, czytnik poczty oparty na klątwach
  • Evolution , oficjalny klient poczty GNOME
  • GNUMmail
  • Gnus
  • KMail , czytnik poczty KDE
  • mailx
  • Błazen
  • Notmuch (szybki system poczty e-mail oparty na globalnym wyszukiwaniu i tagach)
  • Sosnowy/Alpejski
  • Mozilla Thunderbird – eksperymentalna i „domyślnie wyłączona, ponieważ wciąż jest wiele błędów”

Uwagi i odniesienia

Zobacz też

Linki zewnętrzne