| 1 | .TH qmail-header 5 |
| 2 | .SH NAME |
| 3 | qmail-header \- format of a mail message |
| 4 | .SH OVERVIEW |
| 5 | At the top of every mail message is a |
| 6 | highly structured |
| 7 | .BR header . |
| 8 | Many programs expect the header to carry certain information, |
| 9 | as described below. |
| 10 | The main function of |
| 11 | .B qmail-inject |
| 12 | is to make sure that each outgoing message has an appropriate header. |
| 13 | |
| 14 | For more detailed information, see |
| 15 | .BR http://pobox.com/~djb/proto/immhf.html . |
| 16 | .SH "MESSAGE STRUCTURE" |
| 17 | A message contains a series of |
| 18 | .I header fields\fR, |
| 19 | a blank line, |
| 20 | and a |
| 21 | .IR body : |
| 22 | |
| 23 | .EX |
| 24 | Received: (qmail-queue invoked by uid 666); |
| 25 | .br |
| 26 | 30 Jul 1996 11:54:54 -0000 |
| 27 | .br |
| 28 | From: djb@silverton.berkeley.edu (D. J. Bernstein) |
| 29 | .br |
| 30 | To: fred@silverton.berkeley.edu |
| 31 | .br |
| 32 | Date: 30 Jul 1996 11:54:54 -0000 |
| 33 | .br |
| 34 | Subject: Go, Bears! |
| 35 | .br |
| 36 | |
| 37 | .br |
| 38 | I've got money on this one. How about you? |
| 39 | .br |
| 40 | |
| 41 | .br |
| 42 | ---Dan (this is the third line of the body) |
| 43 | .EE |
| 44 | |
| 45 | Each header field has a |
| 46 | .IR name , |
| 47 | a colon, |
| 48 | some |
| 49 | .IR contents , |
| 50 | and a newline: |
| 51 | |
| 52 | .EX |
| 53 | Subject: Go, Bears! |
| 54 | .EE |
| 55 | |
| 56 | The field contents may be folded across several lines. |
| 57 | Each line past the first must begin with a space or tab: |
| 58 | |
| 59 | .EX |
| 60 | Received: (qmail-queue invoked by uid 666); |
| 61 | .br |
| 62 | 30 Jul 1996 11:54:54 -0000 |
| 63 | .EE |
| 64 | |
| 65 | The field name must not contain spaces, tabs, or colons. |
| 66 | Also, an empty field name is illegal. |
| 67 | .B qmail-inject |
| 68 | does not allow field names with unprintable characters. |
| 69 | |
| 70 | Case is irrelevant in field names: |
| 71 | .B subject |
| 72 | and |
| 73 | .B SUBJECT |
| 74 | and |
| 75 | .B SuBjEcT |
| 76 | have the same meaning. |
| 77 | .SH "ADDRESS LISTS" |
| 78 | Certain fields, such as |
| 79 | .BR To , |
| 80 | contain |
| 81 | .I address lists\fR. |
| 82 | |
| 83 | An address list contains some number of |
| 84 | .I addresses |
| 85 | or |
| 86 | .I address groups\fR, |
| 87 | separated by commas: |
| 88 | |
| 89 | .EX |
| 90 | a@b, c@d (Somebody), A Person <e@f>, |
| 91 | .br |
| 92 | random group: g@h, i@j;, k@l |
| 93 | .EE |
| 94 | |
| 95 | An |
| 96 | .I address group |
| 97 | has some text, a colon, a list of addresses, |
| 98 | and a semicolon: |
| 99 | |
| 100 | .EX |
| 101 | random group: g@h, i@j; |
| 102 | .EE |
| 103 | |
| 104 | An address can appear in several forms. |
| 105 | The most common form is |
| 106 | .IR box@host . |
| 107 | |
| 108 | Every address must include a host name. |
| 109 | If |
| 110 | .B qmail-inject |
| 111 | sees a lone box name |
| 112 | it adds the |
| 113 | .I default host name\fR. |
| 114 | |
| 115 | All host names should be fully qualified. |
| 116 | .B qmail-inject |
| 117 | appends the |
| 118 | .I default domain name |
| 119 | to any name without dots: |
| 120 | |
| 121 | .EX |
| 122 | djb@silverton -> djb@silverton.berkeley.edu |
| 123 | .EE |
| 124 | |
| 125 | It appends the |
| 126 | .I plus domain name |
| 127 | to any name |
| 128 | that ends with a plus sign: |
| 129 | |
| 130 | .EX |
| 131 | eric@mammoth.cs+ -> eric@mammoth.cs.berkeley.edu |
| 132 | .EE |
| 133 | |
| 134 | A host name may be a dotted-decimal address: |
| 135 | |
| 136 | .EX |
| 137 | djb@[128.32.183.163] |
| 138 | .EE |
| 139 | |
| 140 | RFC 822 allows mailbox names inside angle brackets |
| 141 | to include |
| 142 | .I source routes\fR, |
| 143 | but |
| 144 | .B qmail-inject |
| 145 | strips all source routes out of addresses. |
| 146 | .SH "SENDER ADDRESSES" |
| 147 | .B qmail-inject |
| 148 | looks for sender address lists in the following fields: |
| 149 | .BR Sender , |
| 150 | .BR From , |
| 151 | .BR Reply-To , |
| 152 | .BR Return-Path , |
| 153 | .BR Return-Receipt-To , |
| 154 | .BR Errors-To , |
| 155 | .BR Resent-Sender , |
| 156 | .BR Resent-From , |
| 157 | .BR Resent-Reply-To . |
| 158 | |
| 159 | If there is no |
| 160 | .B From |
| 161 | field, |
| 162 | .B qmail-inject |
| 163 | adds a new |
| 164 | .B From |
| 165 | field with the name of the user invoking |
| 166 | .B qmail-inject. |
| 167 | |
| 168 | RFC 822 requires that certain sender fields contain |
| 169 | only a single address, but |
| 170 | .B qmail-inject |
| 171 | does not enforce this restriction. |
| 172 | .SH "RECIPIENT ADDRESSES" |
| 173 | .B qmail-inject |
| 174 | looks for recipient address lists in the following fields: |
| 175 | .BR To , |
| 176 | .BR Cc , |
| 177 | .BR Bcc , |
| 178 | .BR Apparently-To , |
| 179 | .BR Resent-To , |
| 180 | .BR Resent-Cc , |
| 181 | .BR Resent-Bcc . |
| 182 | |
| 183 | Every message must contain at least one |
| 184 | .B To |
| 185 | or |
| 186 | .B Cc |
| 187 | or |
| 188 | .BR Bcc . |
| 189 | .B qmail-inject |
| 190 | deletes any |
| 191 | .B Bcc |
| 192 | field. |
| 193 | If there is no |
| 194 | .B To |
| 195 | or |
| 196 | .B Cc |
| 197 | field, |
| 198 | .B qmail-inject |
| 199 | adds a line |
| 200 | |
| 201 | .EX |
| 202 | Cc: recipient list not shown: ; |
| 203 | .EE |
| 204 | |
| 205 | This complies with RFC 822; |
| 206 | it also works around some strange |
| 207 | .B sendmail |
| 208 | behavior, in case the message is passed through |
| 209 | .B sendmail |
| 210 | on another machine. |
| 211 | .SH STAMPS |
| 212 | Every message must contain a |
| 213 | .B Date |
| 214 | field, with the date in a strict format defined by RFC 822. |
| 215 | If necessary |
| 216 | .B qmail-inject |
| 217 | creates a new |
| 218 | .B Date |
| 219 | field with the current date (in GMT). |
| 220 | |
| 221 | Every message should contain a |
| 222 | .B Message-Id |
| 223 | field. |
| 224 | The field contents are a unique worldwide identifier for this message. |
| 225 | If necessary |
| 226 | .B qmail-inject |
| 227 | creates a new |
| 228 | .B Message-Id |
| 229 | field. |
| 230 | |
| 231 | Another important field is |
| 232 | .BR Received . |
| 233 | Every time the message is sent from one system to another, |
| 234 | a new |
| 235 | .B Received |
| 236 | field is added to the top of the message. |
| 237 | .B qmail-inject |
| 238 | does not create any |
| 239 | .B Received |
| 240 | fields. |
| 241 | .SH "RESENT MESSAGES" |
| 242 | A message is |
| 243 | .I resent |
| 244 | if it contains any of the following fields: |
| 245 | .BR Resent-Sender , |
| 246 | .BR Resent-From , |
| 247 | .BR Resent-Reply-To , |
| 248 | .BR Resent-To , |
| 249 | .BR Resent-Cc , |
| 250 | .BR Resent-Bcc , |
| 251 | .BR Resent-Date , |
| 252 | .BR Resent-Message-ID . |
| 253 | |
| 254 | If a message is resent, |
| 255 | .B qmail-inject |
| 256 | changes its behavior as follows. |
| 257 | |
| 258 | It deletes any |
| 259 | .B Resent-Bcc |
| 260 | field (as well as any |
| 261 | .B Bcc |
| 262 | field); |
| 263 | if there are no |
| 264 | .B Resent-To |
| 265 | or |
| 266 | .B Resent-Cc |
| 267 | fields, |
| 268 | .B qmail-inject |
| 269 | adds an appropriate |
| 270 | .B Resent-Cc |
| 271 | line. |
| 272 | It does |
| 273 | .I not |
| 274 | add a |
| 275 | .B Cc |
| 276 | line, |
| 277 | even if neither |
| 278 | .B To |
| 279 | nor |
| 280 | .B Cc |
| 281 | is present. |
| 282 | |
| 283 | If there is no |
| 284 | .B Resent-From |
| 285 | field, |
| 286 | .B qmail-inject |
| 287 | adds a new |
| 288 | .B Resent-From |
| 289 | field. |
| 290 | It does |
| 291 | .I not |
| 292 | add a new |
| 293 | .B From |
| 294 | field. |
| 295 | |
| 296 | .B qmail-inject |
| 297 | adds |
| 298 | .B Resent-Date |
| 299 | if one is not already present; |
| 300 | same for |
| 301 | .BR Resent-Message-Id . |
| 302 | It does |
| 303 | .I not |
| 304 | add new |
| 305 | .B Date |
| 306 | or |
| 307 | .B Message-Id |
| 308 | fields. |
| 309 | .SH "OTHER FEATURES" |
| 310 | Addresses are separated by commas, not spaces. |
| 311 | When |
| 312 | .B qmail-inject |
| 313 | sees an illegal space, |
| 314 | it inserts a comma: |
| 315 | |
| 316 | .EX |
| 317 | djb fred -> djb, fred |
| 318 | .EE |
| 319 | |
| 320 | .B qmail-inject |
| 321 | removes all |
| 322 | .B Return-Path |
| 323 | header fields. |
| 324 | |
| 325 | .B qmail-inject |
| 326 | also removes any |
| 327 | .B Content-Length |
| 328 | fields. |
| 329 | .SH "SEE ALSO" |
| 330 | addresses(5), |
| 331 | envelopes(5), |
| 332 | qmail-inject(8) |