Maildir
Maildir - e-postformatet är ett vanligt sätt att lagra e- postmeddelanden där varje meddelande lagras i en separat fil med ett unikt namn, och varje e-postmapp är en filsystemkatalog. Det lokala filsystemet hanterar fillåsning när meddelanden läggs till, flyttas och tas bort. Ett viktigt designmål för Maildir är att eliminera behovet av programkod för att hantera fillåsning och upplåsning.
Specifikationer
En Maildir- katalog (ofta kallad Maildir
) har vanligtvis tre underkataloger som heter tmp
, new
och cur
.
Underkatalogen tmp
lagrar tillfälligt e-postmeddelanden som håller på att levereras. Denna underkatalog kan också lagra andra typer av temporära filer. Den nya
underkatalogen lagrar meddelanden som har levererats, men som ännu inte har setts av något e-postprogram. Cur -
underkatalogen lagrar meddelanden som redan har setts av e-postprogram.
Maildir++
Sam Varshavchik, författaren till Courier Mail Server och annan programvara, skrev ett tillägg till Maildir-formatet som heter Maildir++ för att stödja undermappar och e-postkvoter. Maildir++-kataloger innehåller underkataloger med namn som börjar med ett '.' (prick) som också är Maildir++-mappar. Det här tillägget överensstämmer med Maildir-specifikationen, som uttryckligen ger möjlighet att lägga till mer än tmp, new, cur till en maildir.
Teknisk drift
En e-postleveransagent är ett program som levererar ett e-postmeddelande till en Maildir. E-postleveransagenten skapar en ny fil med ett unikt filnamn i tmp
-katalogen. Den ursprungliga algoritmen cirka 1995 för att generera unika filnamn, som implementerad av qmail var:
- läs den aktuella Unix-tiden
- läs den aktuella processidentifieraren (PID)
- läs det aktuella värdnamnet
- sammanfoga ovanstående tre värden till en sträng separerad av punkttecknet ; detta är det nya filnamnet
- om
stat()
rapporterar att filnamnet finns, vänta sedan två sekunder - gå till föregående steg tills filnamnet inte finns
- skapa en fil med det unika filnamnet och skriv meddelandets innehåll till den nya filen
År 2000 rekommenderade författaren till qmail att lägga till värdet av en per-processräknare till PID, vars värde skulle ökas efter varje leverans, och det hastighetsbegränsande förslaget hade tagits bort.
År 2003 hade rekommendationerna ändrats ytterligare för att kräva att i stället för PID och räknare skulle den mellersta delen av filnamnet skapas genom att "sammanfoga tillräckligt många av följande strängar för att garantera unikhet" även inför flera samtidiga leveranser till samma maildir från en eller flera processer:
- # n , där n är (i hexadecimal) utdata från operativsystemets
unix_sequencenumber()
systemanrop, som returnerar ett tal som ökar med 1 varje gång det anropas, med början från 0 efter omstart.- X n , där n är (i hexadecimal) utdata från operativsystemets
unix_bootnumber()
systemanrop, som rapporterar antalet gånger som systemet har startats. Tillsammans med # garanterar detta unikhet; tyvärr stöder de flesta operativsystem inteunix_sequencenumber()
ochunix_bootnumber()
.- R n , där n är (i hexadecimal) utdata från operativsystemets
unix_cryptorandomnumber()
systemanrop eller en likvärdig källa, såsom/dev/urandom
. Tyvärr inkluderar vissa operativsystem inte kryptografiska slumptalsgeneratorer.- I n , där n är (i hexadecimal) UNIX- inodnumret för denna fil. Tyvärr är inodnummer inte alltid tillgängliga via NFS .
- V n , där n är (i hexadecimal) UNIX-enhetsnumret för denna fil. Tyvärr är enhetsnummer inte alltid tillgängliga via NFS. (Enhetsnummer är inte heller till hjälp med det vanliga UNIX-filsystemet: en maildir måste finnas inom en enda UNIX-enhet för att
link()
ochrename()
ska fungera.)- M n , där n är (i decimal) mikrosekundräknaren från samma
gettimeofday()
som används för den vänstra delen av det unika namnet.- P n , där n är (i decimal) process-ID.
- Q n , där n är (i decimal) antalet leveranser som gjorts av denna process.
Denna algoritm kritiserades 2006 av Timo Sirainen , skaparen av Dovecot , för att vara onödigt komplex.
Från och med november 2018 hade qmail-författaren Daniel Bernstein inte gjort några ytterligare ändringar i dessa rekommendationer för filnamnsgenerering. På moderna POSIX-system temporära filer skapas säkert med biblioteksfunktionen mkstemp C.
Leveransprocessen lagrar meddelandet i maildir genom att skapa och skriva till tmp/ uniktfilnamn
och sedan flytta denna fil till nytt/ uniktfilnamn
. Flytten kan göras med hjälp av byta namn
, vilket är atomärt i många system. Alternativt kan det göras genom att hårdlänka filen till new
och sedan koppla bort filen från tmp
. Alla överblivna filer kommer så småningom att raderas. Denna sekvens garanterar att ett program som läser maildir inte kommer att se ett delvis skrivet meddelande. Det kan finnas flera program som läser en maildir samtidigt. De sträcker sig från e-postanvändaragenter (MUA), som får åtkomst till serverns filsystem direkt, via Internet Message Access Protocol eller Post Office Protocol- servrar som agerar på uppdrag av fjärranslutna MUA, till verktyg som biff och rsync , som kanske inte är medvetna om av maildir-strukturen. Läsare ska aldrig titta i tmp
.
När en medveten maildir-läsprocess (antingen en POP- eller IMAP- server eller en e-postanvändaragent som agerar lokalt) hittar meddelanden i den nya
katalogen, måste den flytta dem till cur
. Det är bara ett sätt att meddela användaren "du har X nya meddelanden". Denna flytt måste göras med rename()
, eftersom den icke-atomära länk-sedan-unlink- tekniken kan resultera i duplicerade meddelanden. Ett informationssuffix läggs till filnamnen i detta skede. Den består av ett kolon (för att skilja den unika delen av filnamnet från den faktiska informationen), en "2", ett kommatecken och olika flaggor . "2" anger versionen av informationen som följer kommatecken. "2" är den enda för närvarande officiellt specificerade versionen, "1" är en experimentell version. Specifikationen definierar flaggor som visar om meddelandet har lästs, raderats och så vidare: den initiala (versal) bokstaven "Godkänd", "Besvarad", "Sedd", "Papperad", "Utkast" och "Flaggad". Dovecot använder gemener för att matcha 26 IMAP-sökord, som kan inkludera standardiserade nyckelord, som $ MDNSent , och användardefinierade flaggor.
Även om Maildir var tänkt att tillåta låsfri användning, använder i praktiken vissa program som använder Maildirs också lås, som Dovecot.
Problem med filsystemskompatibilitet
Maildir-standarden kan endast implementeras på system som accepterar kolon i filnamn.
System som inte tillåter kolon i filnamn (detta inkluderar Microsoft Windows och vissa konfigurationer av Novell Storage Services ) kan använda en alternativ separator, som ";" eller "-". Det är ofta trivialt att patcha gratis och öppen källkod för att använda en annan separator.
Eftersom det för närvarande inte finns någon överenskommelse om vilken karaktär denna alternativa separator ska ha, kan det finnas interoperabilitetssvårigheter mellan olika Maildir-stödjande program på dessa system. Dock behöver inte all Maildir-relaterad programvara veta vad separatortecknet är, eftersom inte all Maildir-relaterad programvara behöver kunna läsa eller ändra flaggorna för ett meddelande ("läst", "svarade på" etc.); programvara som bara levererar till en Maildir eller arkiverar gamla meddelanden från den endast baserat på datum, bör fungera oavsett vilken separator som används. Om endast MUA behöver läsa eller modifiera meddelandeflaggor, och endast en MUA används, kan icke-standardiserade alternativa separatorer användas utan interoperabilitetsproblem.
Programvara som stöder Maildir direkt
Mailservrar
- Dovecot IMAP-server
- Courier Mail Server SMTP- och IMAP-server, för vilken formatet Maildir++ uppfanns
- Sendmail Den ursprungliga SMTP-servern
- Exim SMTP-server
- Postfix SMTP-server
- qmail SMTP-server, för vilken Maildir-formatet uppfanns
- MeTA1 SMTP-server
- Öppna SMTPD SMTP-server
Leveransagenter
- procmail
- Dovecot leveransagent
- maildrop
- getmail , ett Maildir-medvetet alternativ för posthämtning och leveransagent till Fetchmail
- fdm
- OfflineIMAP
- mbsync
Mail läsare
- aerc (effektiv och utbyggbar e-postklient)
- Balsa tidigare den officiella GNOME-postläsaren (före Evolution)
- Kona en förbannelsebaserad e-postläsare
- Evolution , officiell GNOME-e-postklient
- GNUMail
- Gnus
- KMail , KDE e-postläsare
- mailx
- Mutt
- Notmuch (snabbt, globalt sök- och taggbaserat e-postsystem)
- Tall/Alpin
- Mozilla Thunderbird – experimentell och "inaktiverad som standard eftersom det fortfarande finns många buggar"