Product Code Database
Example Keywords: grand theft -skirt $76-165
   » » Wiki: Maildir
Tag Wiki 'Maildir'.

The Maildir format is a common way of storing messages in which each message is stored in a separate with a unique name, and each mail folder is a file system directory. The local handles as messages are added, moved and deleted. A major design goal of Maildir is to eliminate the need for program code to handle file locking and unlocking.

A Maildir directory (often named Maildir) usually has three subdirectories named tmp, new, and cur.
(2023). 9780672321146, Sams Publishing. .

  • The tmp subdirectory temporarily stores e-mail messages that are in the process of being delivered. This subdirectory may also store other kinds of temporary files.
  • The new subdirectory stores messages that have been delivered, but have not yet been seen by any mail application.
  • The cur subdirectory stores messages that have already been seen by mail applications.

Sam Varshavchik, the author of the Courier Mail Server and other software, defined the Maildir++ extension to the Maildir format to support subfolders and mail quotas. Maildir++ directories contain subdirectories with names that start with a '.' (dot) which are also Maildir++ folders. The extension complies with the original Maildir specification, which allows for subdirectories in addition to tmp, new and cur.

Technical operation
A mail delivery agent is a that delivers an email message into a Maildir. The mail delivery agent creates a new file with a unique filename in the tmp directory. At the time of its invention (circa 1995) guaranteeing unique filenames efficiently was difficult. The original algorithm for unique names was:
  1. read the current
  2. read the current process identifier (PID)
  3. read the current
  4. concatenate the above three values into a string separated by the ; this is the new filename
  5. if stat() reports that the filename exists, then wait two seconds
  6. go to previous step until the filename does not exist
  7. create a file with the unique filename and write the message contents to the new file

By 2000, the qmail author recommended in an updated specification to append the value of a per-process counter to the PID, whose value should be incremented after each delivery. The rate-limiting recommendation to "wait two seconds" was dropped.

By 2003, the recommendations had been further amended to require that instead of the PID and counter, the middle part of the filename should be created by "concatenating enough of the following strings to guarantee uniqueness" even in the face of multiple simultaneous deliveries to the same maildir from one or more processes:

  • # n, where n is (in hexadecimal) the output of the operating system's unix_sequencenumber() system call, which returns a number that increases by 1 every time it is called, starting from 0 after reboot.
  • X n, where n is (in hexadecimal) the output of the operating system's unix_bootnumber() system call, which reports the number of times that the system has been booted. Together with #, this guarantees uniqueness; unfortunately, most operating systems don't support unix_sequencenumber() and unix_bootnumber().
  • R n, where n is (in hexadecimal) the output of the operating system's unix_cryptorandomnumber() system call or an equivalent source, such as /dev/urandom. Unfortunately, some operating systems don't include cryptographic random number generators.
  • I n, where n is (in hexadecimal) the UNIX number of this file. Unfortunately, inode numbers aren't always available through NFS.
  • V n, where n is (in hexadecimal) the UNIX device number of this file. Unfortunately, device numbers aren't always available through NFS. (Device numbers are also not helpful with the standard UNIX filesystem: a maildir has to be within a single UNIX device for link() and rename() to work.)
  • M n, where n is (in decimal) the microsecond counter from the same gettimeofday() used for the left part of the unique name.
  • P n, where n is (in decimal) the process ID.
  • Q n, where n is (in decimal) the number of deliveries made by this process.

This 2003 algorithm was criticised in 2006 as being unnecessarily complex by , the creator of Dovecot.

As of November 2018, qmail author Daniel Bernstein had made no further changes to these filename generation recommendations. On modern POSIX systems, can be safely created with the [[mkstemp]] C library function.

The delivery process stores the message in the maildir by creating and writing to tmp/''uniquefilename'', and then moving this file to new/''uniquefilename''. The moving can be done using rename, which is atomic in many systems. Alternatively, it can be done by the file to new and then unlinking the file from tmp. Any leftover file will eventually be deleted. This sequence guarantees that a maildir-reading program will not see a partially written message. There can be multiple programs reading a maildir at the same time. They range from mail user agents (MUAs), which access the server's file system directly, through Internet Message Access Protocol or Post Office Protocol servers acting on behalf of remote MUAs, to utilities such as biff and , which may or may not be aware of the maildir structure. Readers should never look in tmp.

When a cognizant maildir-reading process (either a POP or IMAP server, or a mail user agent acting locally) finds messages in the new directory, it must move them to cur. It is just a means to notify the user "you have X new messages". This moving needs to be done using rename(), as the non-atomic link-then-unlink technique may result in duplicated messages. An informational suffix is appended to filenames at this stage. It consists of a colon (to separate the unique part of the filename from the actual information), a "2", a and various flags. The "2" specifies the version of the information that follows the comma. "2" is the only currently officially specified version, "1" being an experimental version. The specification defines flags that show whether the message has been read, deleted and so on: the initial (capital) letter of "Passed", "Replied", "Seen", "Trashed", "Draft", and "Flagged". Dovecot uses lowercase letters to match 26 IMAP keywords, which may include standardised keywords, such as $MDNSent, and user-defined flags.

Although Maildir was intended to allow lockless usage, in practice some software that uses Maildirs also uses locks, such as Dovecot.

File-system compatibility issues
The Maildir standard can only be implemented on systems that accept colons in filenames.

Systems that don't allow colons in filenames (this includes Microsoft Windows and some configurations of Novell Storage Services) can use a non-standard alternative separator, such as ";" or "-". It is often trivial to patch free and open-source software to use a different separator.

As there is currently no agreement on what character this alternative separator should be, there can be interoperability difficulties between different Maildir-supporting programs on these systems. However, not all Maildir-related software needs to know what the separator character is, because not all Maildir-related software needs to be able to read or modify the flags of a message ("read", "replied to" etc.); software that merely delivers to a Maildir or archives old messages from it based only on date, should work no matter what separator is in use. If only the needs to read or modify message flags, and only one MUA is used, then non-standard alternative separators may be used without interoperability problems.

Software that supports Maildir directly

Mail servers
  • Dovecot IMAP server
  • Courier Mail Server SMTP and IMAP server, for which the Maildir++ format was invented
  • The original SMTP server
  • SMTP server
  • Postfix SMTP server
  • SMTP server, for which the Maildir format was invented
  • MeTA1 SMTP server
  • SMTP server

Delivery agents

Mail readers
  • aerc (efficient and extensible email client)
  • Balsa previously the official GNOME mail reader (prior to Evolution)
  • Cone a curses-based mail reader
  • Evolution, official GNOME mail client
  • , KDE mail reader
  • Mutt
  • Notmuch (fast, global-search and tag-based email system)
  • Pine/Alpine
  • Mozilla Thunderbird – experimental and “disabled by default because there are still many bugs”

Notes and references

See also
  • MH Message Handling System
  • MIX (email)

External links

Page 1 of 1
Page 1 of 1


Pages:  ..   .. 
Items:  .. 


General: Atom Feed Atom Feed  .. 
Help:  ..   .. 
Category:  ..   .. 
Media:  ..   .. 
Posts:  ..   ..   .. 


Page:  .. 
Summary:  .. 
1 Tags
10/10 Page Rank
5 Page Refs