# Maildir

Maildir is een wereldwijd gebruikt e-mail-opslagformaat. Het is opgebouwd als een gestructureerde map, 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 bewaard. Het Maildir-formaat vindt men voornamelijk op Unix-omgevingen, en kan zonder aanpassingen niet op Windows 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 map (meestal Maildir) die drie submappen bevat: cur, new en tmp.

## Inleiding

De inkomende e-mail-opslagformaten mbox en mh kennen betrouwbaarheidsproblemen, waardoor er nood was aan een stabielere oplossing. Oorspronkelijk werden e-mails bewaard in eenvoudige tekstbestanden, ook wel "mboxen" genoemd. Deze opslagmethode gaat 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 met andere woorden 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.

## Geschiedenis
### 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-mailserver, die e-mail distribueert via mailclientsoftware (MUA's).
* Op een lokaal mailprofiel, waar de gebruiker mail kan lezen via zijn e-maillezer, 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 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-berichtsysteem als Maildir.
Een map met vele bestanden die elk een bericht bevatten is daarom nog niet een mailopslag of onhandig door willekeurige mailtoegang. Veel 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.

### Maildir

Daniel J. Bernstein, de ontwikkelaar van qmail, Djbdns en nog vele andere software schreef de originele en tot nog toe enige Maildirspecificatie. 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 Bernsteins 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 geüpdatet.

### Maildir++

Sam Varshavchik, de ontwikkelaar van onder andere Courier Mail Server, schreef een extensie op het maildir-formaat en doopte het als Maildir++. Deze extensie ondersteunt onder meer submappen en e-mailquota. Het quotamechanisme legt een maximale mapgrootte van een maildir op. Maildir++-mappen bevatten submappen met een naam beginnend met een '.' (dot), die elk afzonderlijk als een Maildir++-map, bijvoorbeeld .Important (Maildir++-map). Deze extensie is in feite in strijd met de Maildirspecificatie, die slechts een bepaalde map inhoud toelaat. Men kan echter stellen dat veel Maildirsoftware ook Maildir++ ondersteunt.

## Specificaties
### Structuur
#### Mappen

    Een "maildir" is een map 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 submappen: new, cur en tmp. Deze drie submappen omvatten de hoofdmap, waar nieuwe mail door het systeem ontvangen wordt.
    Mappen zijn opnieuw submappen in de maildir, waarvan de naam begint met een '.' (dot), bijvoorbeeld .Drafts of .Sent. Elke map bevat opnieuw dezelfde drie submappen new, cur en tmp en een bijkomend bestand maildirmap van 0 bytes. Dit bestand heeft als doel om eender welke agent, die van de map gebruikmaakt, te verzekeren dat het om een map gaat en dat hij gerelateerde informatie kan terugvinden in de bovenliggende map.
    Mappen kunnen niet in een submap geplaatst worden. De oplossing hiervoor is het aanmaken van een submap met de naam van de bovenliggende map, gevolgd door een '.' (dot) en de naam van de nieuwe submap, bijvoorbeeld .Sent.2007. De agent zal "2007" beschouwen als submap van map "Sent".

#### E-mails (berichten)

    E-mailberichten worden in aparte, afzonderlijke bestanden in desbetreffende mappen bewaard. In de tmp-submap 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-submap staan alle ontvangen e-mails, die nog niet door een e-mailapplicatie verwerkt zijn. In de cur-submap staan de e-mails, die wel al door e-mailapplicaties verwerkt zijn.

### Leesoperaties

Het openen van een maildir om e-mails te lezen, moet op de volgende manier gebeuren:
* Open de tmp-submap en verwijder alle bestanden die ouder zijn dan 36 uur.
* Controleer op nieuwe e-mailberichten in de new-submap. 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 quotafaciliteiten. Toch heeft maildir zijn eigen quotamogelijkheden, maar deze zijn enkel en alleen ontwikkeld in functie van bestandssystemen waar de quotafaciliteiten om 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 gebruikgemaakt wordt, moeten er extra procedures betrokken worden wanneer er nieuwe e-mailberichten toegevoegd of verwijderd worden aan een welbepaalde maildir of zijn submappen: Het deliverquota-commando is een klein proces dat een enkel e-mailbericht aflevert in de maildir door gebruik te maken van het maildir-quotaprotocol. Het houdt hierbij metingen van de doelmap bij, om indien nodig beperkingen op te leggen.

### Schrijfoperaties

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-submap, 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-submap. 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-quotaproces. 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).

## Software
### Software met Maildir-ondersteuning
#### E-mailservers

* Qmail, SMTP-server; hiervoor werd het Maildir formaat ontwikkeld.
* Postfix, SMTP-server; vroeger bekend onder VMailer of IBM Secure Mailer.
* Exim, SMTP-server; EXperimental Internet Mailer, volgt het Sendmail design model.
* Courier Mail Server, SMTP- en IMAP-server; hiervoor werd het Maildir++ formaat ontwikkeld.
* Dovecot, IMAP-server; kan zowel met Maildir als Mbox gebruikt worden.
* BincIMAP, IMAP-server;
* getmail; alternatief voor fetchmail om eenvoudig mails te organiseren. Kan overweg met meerdere formaten (o.a. Maildir, mboxrd ...)
* OfflineIMAP; gereedschap om IMAP-servers met je lokale Maildirmappen te synchroniseren.
* XMail, SMTP- en POP3-server, multiplatform.

#### Delivery agents

Delivery agents of e-mailfilters verwerken inkomende e-mails op een computer of machine (MDA = Message Delivery Agent), en wordt meestal aangesproken door een MTA (Message Transfer Agent)
* Procmail, meestal in combinatie met Sendmail.
* Maildrop, gebruikt door Courier Mail Server.
* Safecat, volledig op Maildir gebaseerd.
* FDM, ondersteunt meerdere formaten, gebaseerd op reguliere expressies.
* Grandma, ontworpen om Maildir te organiseren op basis van e-mailadressen in een lijst.

#### Mailreaders

* KMail, een KDE-e-mailreader.
* Evolution, een GNOME-equivalent voor Microsoft Office Outlook.
* Cone, tekstgebaseerd, ontwikkeld door Courier Mail Server.
* Mutt, tekstgebaseerd, ondersteunt Maildir en Mbox.
* Claws Mail, GTK+-gebaseerde client, ondersteunt Mailbox via plug-in.
* Balsa, GNOMEs eerste e-mailclient, opgevolgd door Evolution.

#### Mail index- en zoektools

* mairix, bouwt geïncrementeerde databases voor zowel Maildir, Mbox als MH.
* Beagle (software), indexeert voor meerdere formaten.

#### Mail notifier

Een mail notifier geeft berichtgeving (tekst/geluid) bij nieuwe e-mail.
* AsMail
* GBuffy, GTK+-gebaseerde notifier;
* MailNotification, e-mail-notifier voor Gnome Notification Area;
* Webmail Notifier
* WMBiff, dock-applet voor WindowMaker;
* Yamn, Yet Another E-mail Notifier; gebruik bij Qmail.

### 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 e-mailreaders 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 (bijvoorbeeld Microsoft Outlook, Pine of Mozilla Thunderbird), toegang hebben tot Maildir-mappen.
* 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.

### Windowssoftware

Het Maildirformaat 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 Windowsprogramma naar Maildirs, die niet uitgelezen kunnen worden door een ander Windowsprogramma. Er bestaan echter programma's met Maildirondersteuning die in Python en Perl ontwikkeld zijn of die via Cygwin vanuit Unix omgezet zijn.