NAME¶
maildir - directory for incoming mail messages
INTRODUCTION¶
maildir is a structure for directories of incoming mail messages. It
  solves the reliability problems that plague 
mbox files and 
mh
  folders.
RELIABILITY ISSUES¶
A machine may crash while it is delivering a message. For both 
mbox files
  and 
mh folders this means that the message will be silently truncated.
  Even worse: for 
mbox format, if the message is truncated in the middle
  of a line, it will be silently joined to the next message. The mail transport
  agent will try again later to deliver the message, but it is unacceptable that
  a corrupted message should show up at all. In 
maildir, every message is
  guaranteed complete upon delivery.
 
A machine may have two programs simultaneously delivering mail to the same user.
  The 
mbox and 
mh formats require the programs to update a single
  central file. If the programs do not use some locking mechanism, the central
  file will be corrupted. There are several 
mbox and 
mh locking
  mechanisms, none of which work portably and reliably. In contrast, in
  
maildir, no locks are ever necessary. Different delivery processes
  never touch the same file.
 
A user may try to delete messages from his mailbox at the same moment that the
  machine delivers a new message. For 
mbox and 
mh formats, the
  user's mail-reading program must know what locking mechanism the mail-delivery
  programs use. In contrast, in 
maildir, any delivered message can be
  safely updated or deleted by a mail-reading program.
 
Many sites use Sun's 
Network Failure System
  (NFS), presumably because the operating system vendor does not
  offer anything else. NFS exacerbates all of the above
  problems. Some NFS implementations don't provide any
  reliable locking mechanism. With 
mbox and 
mh formats, if two
  machines deliver mail to the same user, or if a user reads mail anywhere
  except the delivery machine, the user's mail is at risk. 
maildir works
  without trouble over NFS.
THE MAILDIR STRUCTURE¶
A directory in 
maildir format has three subdirectories, all on the same
  filesystem: 
tmp, 
new, and 
cur.
 
Each file in 
new is a newly delivered mail message. The modification time
  of the file is the delivery date of the message. The message is delivered
  
without an extra UUCP-style 
From_ line, 
without any
  
>From quoting, and 
without an extra blank line at the end.
  The message is normally in RFC 822 format, starting with a 
Return-Path
  line and a 
Delivered-To line, but it could contain arbitrary binary
  data. It might not even end with a newline.
 
Files in 
cur are just like files in 
new. The big difference is
  that files in 
cur are no longer new mail: they have been seen by the
  user's mail-reading program.
HOW A MESSAGE IS DELIVERED¶
The 
tmp directory is used to ensure reliable delivery, as discussed here.
 
A program delivers a mail message in six steps. First, it 
chdir()s
  to the maildir directory. Second, it 
stat()s the name
  
tmp/ time.pid.host, where time is the
  number of seconds since the beginning of 1970 GMT, 
pid is the program's
  process ID, and 
host is the host name. Third, if 
stat() returned
  anything other than ENOENT, the program sleeps for two seconds, updates
  
time, and tries the 
stat() again, a limited number of times.
  Fourth, the program creates 
tmp/time.pid.host. Fifth,
  the program NFS-writes the message to the file. Sixth, the program
  
link()s the file to 
new/time.pid.host. At that
  instant the message has been successfully delivered.
 
The delivery program is required to start a 24-hour timer before creating
  
tmp/ time.pid.host, and to abort the delivery
  if the timer expires. Upon error, timeout, or normal completion,
  the delivery program may attempt to unlink()
  tmp/time.pid.host.
 
NFS-writing means (1) as usual, checking the number of bytes returned
  from each 
write() call; (2) calling 
fsync() and checking its
  return value; (3) calling 
close() and checking its return value.
  (Standard NFS implementations handle 
fsync() incorrectly but make up
  for it by abusing 
close().)
HOW A MESSAGE IS READ¶
A mail reader operates as follows.
 
It looks through the 
new directory for new messages. Say there is a new
  message, 
new/unique. The reader may freely display the
  contents of new/unique, delete
  new/unique, or rename new/unique
  as cur/unique:info. See
  http://pobox.com/~djb/proto/maildir.html for the meaning of
  
info.
 
The reader is also expected to look through the 
tmp directory and to
  clean up any old files found there. A file in 
tmp may be safely removed
  if it has not been accessed in 36 hours.
 
It is a good idea for readers to skip all filenames in 
new and 
cur
  starting with a dot. Other than this, readers should not attempt to parse
  filenames.
ENVIRONMENT VARIABLES¶
Mail readers supporting 
maildir use the 
MAILDIR environment
  variable as the name of the user's primary mail directory.
SEE ALSO¶
mbox(5), 
qmail-local(8)