|
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) |