|
0
|
1 |
.TH maildir 5
|
|
|
2 |
.SH "NAME"
|
|
|
3 |
maildir \- directory for incoming mail messages
|
|
|
4 |
.SH "INTRODUCTION"
|
|
|
5 |
.I maildir
|
|
|
6 |
is a structure for
|
|
|
7 |
directories of incoming mail messages.
|
|
|
8 |
It solves the reliability problems that plague
|
|
|
9 |
.I mbox
|
|
|
10 |
files and
|
|
|
11 |
.I mh
|
|
|
12 |
folders.
|
|
|
13 |
.SH "RELIABILITY ISSUES"
|
|
|
14 |
A machine may crash while it is delivering a message.
|
|
|
15 |
For both
|
|
|
16 |
.I mbox
|
|
|
17 |
files and
|
|
|
18 |
.I mh
|
|
|
19 |
folders this means that the message will be silently truncated.
|
|
|
20 |
Even worse: for
|
|
|
21 |
.I mbox
|
|
|
22 |
format, if the message is truncated in the middle of a line,
|
|
|
23 |
it will be silently joined to the next message.
|
|
|
24 |
The mail transport agent will try again later to deliver the message,
|
|
|
25 |
but it is unacceptable that a corrupted message should show up at all.
|
|
|
26 |
In
|
|
|
27 |
.IR maildir ,
|
|
|
28 |
every message is guaranteed complete upon delivery.
|
|
|
29 |
|
|
|
30 |
A machine may have two programs simultaneously delivering mail
|
|
|
31 |
to the same user.
|
|
|
32 |
The
|
|
|
33 |
.I mbox
|
|
|
34 |
and
|
|
|
35 |
.I mh
|
|
|
36 |
formats require the programs to update a single central file.
|
|
|
37 |
If the programs do not use some locking mechanism,
|
|
|
38 |
the central file will be corrupted.
|
|
|
39 |
There are several
|
|
|
40 |
.I mbox
|
|
|
41 |
and
|
|
|
42 |
.I mh
|
|
|
43 |
locking mechanisms,
|
|
|
44 |
none of which work portably and reliably.
|
|
|
45 |
In contrast, in
|
|
|
46 |
.IR maildir ,
|
|
|
47 |
no locks are ever necessary.
|
|
|
48 |
Different delivery processes never touch the same file.
|
|
|
49 |
|
|
|
50 |
A user may try to delete messages from his mailbox at the same
|
|
|
51 |
moment that the machine delivers a new message.
|
|
|
52 |
For
|
|
|
53 |
.I mbox
|
|
|
54 |
and
|
|
|
55 |
.I mh
|
|
|
56 |
formats, the user's mail-reading program must know
|
|
|
57 |
what locking mechanism the mail-delivery programs use.
|
|
|
58 |
In contrast, in
|
|
|
59 |
.IR maildir ,
|
|
|
60 |
any delivered message
|
|
|
61 |
can be safely updated or deleted by a mail-reading program.
|
|
|
62 |
|
|
|
63 |
Many sites use Sun's
|
|
|
64 |
.B Network F\fPa\fBil\fPur\fBe System
|
|
|
65 |
(NFS),
|
|
|
66 |
presumably because the operating system vendor does not offer
|
|
|
67 |
anything else.
|
|
|
68 |
NFS exacerbates all of the above problems.
|
|
|
69 |
Some NFS implementations don't provide
|
|
|
70 |
.B any
|
|
|
71 |
reliable locking mechanism.
|
|
|
72 |
With
|
|
|
73 |
.I mbox
|
|
|
74 |
and
|
|
|
75 |
.I mh
|
|
|
76 |
formats,
|
|
|
77 |
if two machines deliver mail to the same user,
|
|
|
78 |
or if a user reads mail anywhere except the delivery machine,
|
|
|
79 |
the user's mail is at risk.
|
|
|
80 |
.I maildir
|
|
|
81 |
works without trouble over NFS.
|
|
|
82 |
.SH "THE MAILDIR STRUCTURE"
|
|
|
83 |
A directory in
|
|
|
84 |
.I maildir
|
|
|
85 |
format has three subdirectories,
|
|
|
86 |
all on the same filesystem:
|
|
|
87 |
.BR tmp ,
|
|
|
88 |
.BR new ,
|
|
|
89 |
and
|
|
|
90 |
.BR cur .
|
|
|
91 |
|
|
|
92 |
Each file in
|
|
|
93 |
.B new
|
|
|
94 |
is a newly delivered mail message.
|
|
|
95 |
The modification time of the file is the delivery date of the message.
|
|
|
96 |
The message is delivered
|
|
|
97 |
.I without
|
|
|
98 |
an extra UUCP-style
|
|
|
99 |
.B From_
|
|
|
100 |
line,
|
|
|
101 |
.I without
|
|
|
102 |
any
|
|
|
103 |
.B >From
|
|
|
104 |
quoting,
|
|
|
105 |
and
|
|
|
106 |
.I without
|
|
|
107 |
an extra blank line at the end.
|
|
|
108 |
The message is normally in RFC 822 format,
|
|
|
109 |
starting with a
|
|
|
110 |
.B Return-Path
|
|
|
111 |
line and a
|
|
|
112 |
.B Delivered-To
|
|
|
113 |
line,
|
|
|
114 |
but it could contain arbitrary binary data.
|
|
|
115 |
It might not even end with a newline.
|
|
|
116 |
|
|
|
117 |
Files in
|
|
|
118 |
.B cur
|
|
|
119 |
are just like files in
|
|
|
120 |
.BR new .
|
|
|
121 |
The big difference is that files in
|
|
|
122 |
.B cur
|
|
|
123 |
are no longer new mail:
|
|
|
124 |
they have been seen by the user's mail-reading program.
|
|
|
125 |
.SH "HOW A MESSAGE IS DELIVERED"
|
|
|
126 |
The
|
|
|
127 |
.B tmp
|
|
|
128 |
directory is used to ensure reliable delivery,
|
|
|
129 |
as discussed here.
|
|
|
130 |
|
|
|
131 |
A program delivers a mail message in six steps.
|
|
|
132 |
First, it
|
|
|
133 |
.B chdir()\fPs
|
|
|
134 |
to the
|
|
|
135 |
.I maildir
|
|
|
136 |
directory.
|
|
|
137 |
Second, it
|
|
|
138 |
.B stat()s
|
|
|
139 |
the name
|
|
|
140 |
.BR tmp/\fItime.pid.host ,
|
|
|
141 |
where
|
|
|
142 |
.I time
|
|
|
143 |
is the number of seconds since the beginning of 1970 GMT,
|
|
|
144 |
.I pid
|
|
|
145 |
is the program's process ID,
|
|
|
146 |
and
|
|
|
147 |
.I host
|
|
|
148 |
is the host name.
|
|
|
149 |
Third, if
|
|
|
150 |
.B stat()
|
|
|
151 |
returned anything other than ENOENT,
|
|
|
152 |
the program sleeps for two seconds, updates
|
|
|
153 |
.IR time ,
|
|
|
154 |
and tries the
|
|
|
155 |
.B stat()
|
|
|
156 |
again, a limited number of times.
|
|
|
157 |
Fourth, the program
|
|
|
158 |
creates
|
|
|
159 |
.BR tmp/\fItime.pid.host .
|
|
|
160 |
Fifth, the program
|
|
|
161 |
.I NFS-writes
|
|
|
162 |
the message to the file.
|
|
|
163 |
Sixth, the program
|
|
|
164 |
.BR link() s
|
|
|
165 |
the file to
|
|
|
166 |
.BR new/\fItime.pid.host .
|
|
|
167 |
At that instant the message has been successfully delivered.
|
|
|
168 |
|
|
|
169 |
The delivery program is required to start a 24-hour timer before
|
|
|
170 |
creating
|
|
|
171 |
.BR tmp/\fItime.pid.host ,
|
|
|
172 |
and to abort the delivery
|
|
|
173 |
if the timer expires.
|
|
|
174 |
Upon error, timeout, or normal completion,
|
|
|
175 |
the delivery program may attempt to
|
|
|
176 |
.B unlink()
|
|
|
177 |
.BR tmp/\fItime.pid.host .
|
|
|
178 |
|
|
|
179 |
.I NFS-writing
|
|
|
180 |
means
|
|
|
181 |
(1) as usual, checking the number of bytes returned from each
|
|
|
182 |
.B write()
|
|
|
183 |
call;
|
|
|
184 |
(2) calling
|
|
|
185 |
.B fsync()
|
|
|
186 |
and checking its return value;
|
|
|
187 |
(3) calling
|
|
|
188 |
.B close()
|
|
|
189 |
and checking its return value.
|
|
|
190 |
(Standard NFS implementations handle
|
|
|
191 |
.B fsync()
|
|
|
192 |
incorrectly
|
|
|
193 |
but make up for it by abusing
|
|
|
194 |
.BR close() .)
|
|
|
195 |
.SH "HOW A MESSAGE IS READ"
|
|
|
196 |
A mail reader operates as follows.
|
|
|
197 |
|
|
|
198 |
It looks through the
|
|
|
199 |
.B new
|
|
|
200 |
directory for new messages.
|
|
|
201 |
Say there is a new message,
|
|
|
202 |
.BR new/\fIunique .
|
|
|
203 |
The reader may freely display the contents of
|
|
|
204 |
.BR new/\fIunique ,
|
|
|
205 |
delete
|
|
|
206 |
.BR new/\fIunique ,
|
|
|
207 |
or rename
|
|
|
208 |
.B new/\fIunique
|
|
|
209 |
as
|
|
|
210 |
.BR cur/\fIunique:info .
|
|
|
211 |
See
|
|
|
212 |
.B http://pobox.com/~djb/proto/maildir.html
|
|
|
213 |
for the meaning of
|
|
|
214 |
.IR info .
|
|
|
215 |
|
|
|
216 |
The reader is also expected to look through the
|
|
|
217 |
.B tmp
|
|
|
218 |
directory and to clean up any old files found there.
|
|
|
219 |
A file in
|
|
|
220 |
.B tmp
|
|
|
221 |
may be safely removed if it
|
|
|
222 |
has not been accessed in 36 hours.
|
|
|
223 |
|
|
|
224 |
It is a good idea for readers to skip all filenames in
|
|
|
225 |
.B new
|
|
|
226 |
and
|
|
|
227 |
.B cur
|
|
|
228 |
starting with a dot.
|
|
|
229 |
Other than this, readers should not attempt to parse filenames.
|
|
|
230 |
.SH "ENVIRONMENT VARIABLES"
|
|
|
231 |
Mail readers supporting
|
|
|
232 |
.I maildir
|
|
|
233 |
use the
|
|
|
234 |
.B MAILDIR
|
|
|
235 |
environment variable
|
|
|
236 |
as the name of the user's primary mail directory.
|
|
|
237 |
.SH "SEE ALSO"
|
|
|
238 |
mbox(5),
|
|
|
239 |
qmail-local(8)
|