Maildir

Uit Wikipedia, de vrije encyclopedie

Ga naar: navigatie, zoeken

Maildir is een wereldwijd gebruikt e-mail-opslagformaat. Het is opgebouwd als een gestructureerde folder, waarbij e-mails opgeslagen, verhuisd of verwijderd kunnen worden met behoud van integriteit. Iedere e-mail wordt voorzien van een unieke naam en als een afzonderlijk bestand (computer) bewaard. Het Maildir-formaat vindt men voornamelijk op Unix-omgevingen, en kan zonder aanpassingen niet op Microsoft Windows-systemen gebruikt worden.

Typerend voor Maildir is de mogelijkheid dat applicaties gemeenschappelijk toegang tot eenzelfde bestand kunnen hebben zonder gebruik te maken van file locking. Een Maildir is een folder (meestal Maildir) die drie subfolders bevat: cur, new en tmp.

Interne structuur van Maildir-opslagformaat.
Interne structuur van Maildir-opslagformaat.

Inhoud

[bewerk] Inleiding

De inkomende e-mail-opslagformaten mbox en mh kenden betrouwbaarheidsproblemen, waardoor er nood was aan een stabielere oplossing. Oorspronkelijk werden e-mails bewaard in eenvoudige tekstbestanden, ook wel "mboxen" genoemd. Deze gaan gepaard met de nodige kwaaltjes. Enerzijds kan een applicatie slechts één mbox tegelijkertijd gebruiken, anderzijds is file locking noodzakelijk om meerdere applicaties gelijktijdig het bestand te laten openen. Voornamelijk dit laatste is problematisch en vaak onbetrouwbaar in netwerkgebaseerde bestandssystemen. Een proces kan immers gestopt worden terwijl een bewerking op de mbox uitgevoerd wordt. Dit leidt tot corrupte bestanden en/of verlies van het grootste gedeelte van de e-mail in de mbox.

De ontwikkeling van Maildir biedt hiervoor een oplossing, aangezien meerdere applicaties gelijktijdig toegang hebben tot de verscheidene e-mails en/of bewerkingen kunnen uitvoeren zonder elkaar daarbij in de weg te lopen. File locking is m.a.w. niet vereist.

Naast het feit dat Maildir bijzonder eenvoudig en gemakkelijk in onderhoud is, kan men stellen dat het bijzonder populair is geworden en door een groot aantal mensen gebruikt wordt.

[bewerk] Geschiedenis

[bewerk] Situatieschets

E-mails moeten bewaard worden in volgende omstandigheden:

  • Bij een SMTP MTA, nadat de mails opgehaald werden van de remote mail server en in de wachtrij staan om weggeschreven te worden naar eender waar. Dit opslagsysteem wordt ook wel spool genoemd.
  • Bij een IMAP mail server, die e-mail distribueert via mail client software (MUAs).
  • Op een lokaal mailprofiel, waar de gebruiker mail kan lezen via zijn mail reader, die de maildata lokaal ophaalt in plaats van via het netwerk protocol.
  • In andere situaties met opslagmethoden en processen, zoals het filteren van spam.

RFC822[1] en gerelateerde standaarden stellen dat e-mailberichten bestaan uit lijnen tekst, met specifieke regels voor de eerste lijn. Dit principe wordt eveneens gebruikt bij een bestand. Maildir, met zijn 'bestand-per-bericht'-design, sluit perfect aan bij hetgeen we zien bij een SMTP-overdracht op een netwerk. Een MTA behandelt batchen van e-mails via een sequentieel proces, bijzonder toepasselijk voor een bestand-per-bericht systeem als Maildir.

Een folder met vele bestanden die elk een bericht bevatten is daarom nog niet een mailopslag of onhandig door willekeurige mailtoegang. Vele ontwikkelaars gebruiken daarom een database om te indexeren en te zoeken. In 2007 hebben bestandssystemen echter betere toegangstijden dan databases, waardoor ontwikkelaars voor het grote dilemma worden geplaatst: indexeermethoden en gebruiksgemak versus snelheid, efficiëntie, hergebruik en betrouwbaarheid. Zowel de Cyrus IMAP server, MH Message Handling System, de Dovecot IMAP server als de UW IMAP server hebben private en wederzijdse incompatibiteitsproblemen tussen 'bestand-per-bericht'-formaten en hun geassocieerde indextabellen.

[bewerk] Maildir

Daniel J. Bernstein, de ontwikkelaar van qmail, Djbdns en nog vele andere software schreef de originele en totnogtoe enige Maildir specificatie. Ondertussen zijn er nog steeds geen opvolgingen, noch moeite geweest om het in een standaard te gieten. De specificatie is uiteindelijk geschreven met het oog op Bernstein's qmail omgeving, maar vormde tevens de basis om in andere applicaties geïmplementeerd te worden. Naarmate het formaat populairder werd, ontdekte men hier en daar tekortkomingen of ontstond de vraag naar uitbreidingen. Tot dusver heeft Bernstein zijn specificatie niet meer geupdate.

[bewerk] Maildir++

Sam Varshavchik, de ontwikkelaar van oa. Courier Mail Server, schreef een extensie op het maildir-formaat en doopte het als Maildir++. Deze extensie ondersteunt onder meer subfolders en mail quota. Het quota mechanisme legt een maximale foldergrootte van een maildir op. Maildir++ folders bevatten subfolders met een naam beginnend met een '.' (dot), die elk afzonderlijk als een Maildir++ folder, bvb. .Important (Maildir++ folder). Deze extensie is in feite in strijd met de Maildir specificatie, die slechts een bepaalde folder inhoud toelaat. Men kan echter stellen dat veel Maildir software ook Maildir++ ondersteunt.

[bewerk] Specificaties

[bewerk] Structuur

[bewerk] Folders

Een "maildir" is een folder die gecreëerd wordt door het maildirmake-commando. Er worden geen groepspermissies ingesteld, tenzij wanneer andere mensen je mail willen lezen. Een maildir bevat drie subfolders: new, cur en tmp. Deze drie subfolders omvatten de hoofdfolder, waar nieuwe mail door het systeem ontvangen wordt.
Folders zijn opnieuw subfolders in de maildir, waarvan de naam begint met een '.' (dot), bvb. .Drafts of .Sent. Elke folder bevat opnieuw dezelfde drie subfolders new, cur en tmp en een bijkomend bestand maildirfolder van 0 bytes. Dit bestand heeft als doel om eender welke agent, die van de folder gebruik maakt, te verzekeren dat het om een folder gaat en dat hij gerelateerde informatie kan terugvinden in de bovenliggende map.
Folders kunnen niet in een subfolder geplaatst worden. De oplossing hiervoor is het aanmaken van een subfolder met de naam van de bovenliggende folder, gevolgd door een '.' (dot) en de naam van de nieuwe subfolder, bvb. .Sent.2007. De agent zal "2007" beschouwen als subfolder van folder "Sent".

[bewerk] E-mails (berichten)

E-mailberichten worden in aparte, afzonderlijke bestanden in desbetreffende folders bewaard. In de tmp-subfolder worden de e-mails tijdelijk bewaard terwijl ze in verwerking of binnenkomen zijn. In tmp kunnen eender welke tijdelijke bestanden opgeslagen worden, zolang ze op dezelfde structurele manier opgeslagen worden. In de new-subfolder staan alle ontvangen e-mails, die nog niet door een mail-applicatie verwerkt zijn. In de cur-subfolder staan de e-mails, die wel al door mail-applicaties verwerkt zijn.

[bewerk] Lees-operaties

Het openen van een maildir om e-mails te lezen, moet op de volgende manier gebeuren:

  • Open de tmp subfolder en verwijder alle bestanden die ouder zijn dan 36 uur.
  • Controleer op nieuwe e-mailberichten in de new subfolder. Hernoem elk bestand new/bestandsnaam naar cur/bestandsnaam:2,info. Hierbij wordt info vervangen door een of meerdere booleaanse waarden, die volgende opties voorstellen:
    • "P" - Passed (NL: Reeds verwerkt)
    • "D" - Draft (NL: Concept)
    • "R" - Reply (NL: Beantwoord)
    • "S" - Seen (NL: Gelezen)
    • "T" - Trashed (NL: Verwijderd) - Nota: Gemarkeerd als verwijderd, maar nog niet verwijderd. E-mails worden verwijderd door het bestand te verwijderen.
    • "F" - Flagged (NL: Gemarkeerd om een of andere reden)
Deze opties moeten in alfabetische orde staan. Nieuwe e-mailberichten zullen enkel uit het achtervoegsel :2 bestaan, zonder enige opties om aan te duiden dat ze nog niet gelezen, gemarkeerd, beantwoord of verwijderd zijn.

Maildirs kunnen een maximale grootte |quota opgelegd worden, maar dit is louter optioneel. Indien je toch quota wil instellen, gebruik je best de door het bestandssysteem voorziene quota faciliteiten. Toch heeft maildir zijn eigen quota mogelijkheden, maar deze zijn enkel en alleen ontwikkeld in functie van bestandssystemen waar de quota faciliteiten door een bepaalde reden niet werken. Vergeet niet dat maildir in de eerste plaats is ontwikkeld om file locking te vermijden. Wanneer er van het optioneel quota systeem gebruik gemaakt wordt, moeten er extra procedures betrokken worden wanneer er nieuwe e-mailberichten toegevoegd of verwijderd worden aan een welbepaalde maildir of zijn subfolders: Het deliverquota-commando is een klein proces dat een enkel e-mailbericht aflevert in de maildir door gebruik te maken van het maildir quota protocol. Het houdt hierbij metingen van de doelfolder bij, om indien nodig beperkingen op te leggen.

[bewerk] Schrijf-operaties

De volgende procesomschrijving vindt plaats bij het ontvangen van een e-mailbericht:

  • Een nieuwe unieke bestandsnaam wordt aangemaakt volgens 2 mogelijkheden:
    • "time.MusecPpid.host"
    • "time.MusecPpid_unique.host"
Hierbij staat time voor de huidige systeemtijd, pid staat voor de volgnummer van het proces dat de e-mail in de maildir aflevert, host is de naam van de machine waar de e-mail wordt afgeleverd.
Wanneer er meerdere e-mails tegelijk worden gecreëerd, moet er een extra uniek achtervoegsel toegevoegd worden, meestal een _ (underscore) gevolgd door een increment. Dit wordt enkel toegepast wanneer e-mails door hetzelfde proces in dezelfde of verschillende maildirs worden afgeleverd. Dit protocol laat ook toe dat er meerdere processen op verscheidene machines op hetzelfde netwerk tegelijkertijd e-mails kunnen aanmaken zonder elkaar in de weg te lopen.
  • De unieke bestandsnaam uit de vorige stap wordt vervolgens gecontroleerd door een stat system call. Indien deze een ander antwoord dan ENOENT teruggeeft, moet het proces de vorige stap opnieuw uitvoeren (nieuwe unieke naam) na twee seconden wachttijd. Op deze manier kan in maildir een unieke bestandsnaam gegarandeerd worden.
  • Indien ENOENT terugkomt van de stat system call, kan het bestand met de unieke naam aangemaakt worden in de tmp-subfolder, waarin gans het e-mailbericht bewaard wordt. Het e-mailbericht moet niet noodzakelijk de "From_"-header bevatten zoals dat bij Mbox het geval is, noch moet het "From_"-lijnen bevatten in de inhoud van het bericht, voorafgegaan door een ">".
  • Nadat het e-mailbericht is weggeschreven, wordt het aantal bytes geretourneerd door de write system call. Het resultaat wordt bovendien gecontroleerd om zeker te zijn dat gans het e-mailbericht bewaard werd.
  • Vervolgens wordt het tijdelijke bestand ge-fstat. Hierbij worden de grootte, device nummer en inode nummer gestockeerd. Het bestand wordt dan gesloten en meteen verhuisd/hernoemd naar de new-subfolder. Uiteindelijk krijgt het een nieuwe bestandsnaam volgens een van volgende mogelijkheden:
    • "time.MusecPpidVdevIino.host,S=cnt"
    • "time.MusecPpidVdevIino_unique.host,S=cnt"
Hierbij staat "dev" voor het device nummer, "ino" voor het inode nummer en "cnt" voor de bestandsgrootte (in bytes).
Het laatste gedeelte ",S=cnt" optimaliseert het maildir quota proces. Hierdoor kan de grootte van ieder bericht opgeteld worden, zonder daarvoor de stat system call voor ieder bericht aan te roepen (arbeidsintensief voor sommige bestandssystemen).

[bewerk] Software

[bewerk] Software met Maildir support

[bewerk] Mail servers

[bewerk] Delivery agents

Delivery agents of mail filters verwerken inkomende e-mails op een computer of machine (MDA = Message Delivery Agent), en wordt meestal aangesproken door een MTA (Message Transfer Agent)

[bewerk] Mail readers

[bewerk] Mail index- en zoektools

[bewerk] Mail notifier

Een mail notifier geeft berichtgeving (tekst/geluid) bij nieuwe e-mail.

[bewerk] Software met indirect Maildir-gebruik

Software met ondersteuning voor Maildir is in feite nog vele langer, wetende dat je Maildir op alle mogelijke manieren kan integreren of in functie van netwerktoegang. Voorbeelden:

  • De MTA Sendmail ondersteunt in feite geen enkel delivery formaat (hoewel velen denken van wel). Sendmail gebruikt een apart afleverproces, mail.local. Procmail, Maildrop (of andere MDA die Maildir ondersteunen) kunnen in de plaats van mail.local gebruikt worden. Op die manier kunnen we stellen dat Sendmail wel degelijk Maildir ondersteunt, evenals zovele andere formaten.
  • Veel mail readers ondersteunen geen Maildir, maar wel RA-formaten (remote access) als IMAP. Aangezien de meeste IMAP servers Maildir ondersteunen, kan eender welke mail reader die IMAP ondersteunt (bvb. Microsoft Outlook, Pine of Mozilla Thunderbird), toegang hebben tot Maildir folders.
  • Fetchmail ondersteunt geen Maildir (noch een ander delivery format), maar aangezien het wel communiceert met een SMTP sever of LDA, kan eender welke MDA gebruikt worden om e-mails van Fetchmail naar Maildirs om te zetten.

[bewerk] Windows software

Het Maildir formaat kan op Windows-systemen enkel gebruikt worden wanneer er wijzigingen worden aangebracht, aangezien Windows geen ":" (dubbele punt) in bestandsnamen toelaat (cfr :2). Er is geen technische oorzaak waarom software op Windows geen alternatief teken (";" of "-") kan gebruiken, maar er kan echter geen overeenkomst bekomen worden over welk teken het nu moet worden. Hierdoor schrijft het ene Windows programma naar Maildirs, die niet uitgelezen kunnen worden door een ander Windows programma. Er bestaan echter programma's met Maildir ondersteuning die in Python en Perl ontwikkeld zijn of die via Cygwin vanuit Unix omgezet zijn.

[bewerk] Externe links

[bewerk] Bronnen, noten en/of referenties

Bronnen, noten en/of referenties:
  1. Bernstein, Daniel J. (1995) Using maildir format, (en) , dit artikel geeft uitleg over het maildir formaat en hoe het te gebruiken.
  2. Varshavchik, Sam (1998) Maildir++, (en) , specificaties en omschrijving van Maildir++ en Maildir quotas.
  3. Price, Patrick & Schneider, Roland (2007) Courier's Maildir Description, (en) , beschrijving van Courier's Maildir gebruik en uitbreidingen.
  4. Sirainen, Timo (2006) Dovecot Wiki: Maildir formaat, (en) , uitbreiding op het Maildir formaat met behulp van extensies.

  1. ^ Crocker, David H. (1982) RFC822, (en) , Standaard voor ARPA Internet Text Messages
 
Persoonlijke instellingen