diff options
| author | manuel <manuel@mausz.at> | 2013-02-04 00:08:53 +0100 |
|---|---|---|
| committer | manuel <manuel@mausz.at> | 2013-02-04 00:08:53 +0100 |
| commit | 69aec538b456402170dc723af417ba5c05389c32 (patch) | |
| tree | e6f34c543f17c6392447ea337b2e2868212424d1 /maildir.5 | |
| download | qmail-69aec538b456402170dc723af417ba5c05389c32.tar.gz qmail-69aec538b456402170dc723af417ba5c05389c32.tar.bz2 qmail-69aec538b456402170dc723af417ba5c05389c32.zip | |
qmail 1.03 import
Diffstat (limited to 'maildir.5')
| -rw-r--r-- | maildir.5 | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/maildir.5 b/maildir.5 new file mode 100644 index 0000000..5da9573 --- /dev/null +++ b/maildir.5 | |||
| @@ -0,0 +1,239 @@ | |||
| 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) | ||
