Author: Kevin Schoon [me@kevinschoon.com]
Hash: 5fbd4ca060b8fa0f393829245f54c66f6b8566dd
Timestamp: Sun, 28 Jul 2024 13:38:04 +0000 (2 months ago)

+9846 -92 +/-9 browse
make message parsing work, support more commands, refactor
1diff --git a/Cargo.lock b/Cargo.lock
2index 90c9ea4..f80ce72 100644
3--- a/Cargo.lock
4+++ b/Cargo.lock
5 @@ -30,12 +30,208 @@ dependencies = [
6 ]
7
8 [[package]]
9+ name = "aho-corasick"
10+ version = "1.1.3"
11+ source = "registry+https://github.com/rust-lang/crates.io-index"
12+ checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
13+ dependencies = [
14+ "memchr",
15+ ]
16+
17+ [[package]]
18 name = "allocator-api2"
19 version = "0.2.18"
20 source = "registry+https://github.com/rust-lang/crates.io-index"
21 checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
22
23 [[package]]
24+ name = "async-channel"
25+ version = "1.9.0"
26+ source = "registry+https://github.com/rust-lang/crates.io-index"
27+ checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
28+ dependencies = [
29+ "concurrent-queue",
30+ "event-listener 2.5.3",
31+ "futures-core",
32+ ]
33+
34+ [[package]]
35+ name = "async-channel"
36+ version = "2.3.1"
37+ source = "registry+https://github.com/rust-lang/crates.io-index"
38+ checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
39+ dependencies = [
40+ "concurrent-queue",
41+ "event-listener-strategy",
42+ "futures-core",
43+ "pin-project-lite",
44+ ]
45+
46+ [[package]]
47+ name = "async-executor"
48+ version = "1.13.0"
49+ source = "registry+https://github.com/rust-lang/crates.io-index"
50+ checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7"
51+ dependencies = [
52+ "async-task",
53+ "concurrent-queue",
54+ "fastrand 2.1.0",
55+ "futures-lite 2.3.0",
56+ "slab",
57+ ]
58+
59+ [[package]]
60+ name = "async-fs"
61+ version = "1.6.0"
62+ source = "registry+https://github.com/rust-lang/crates.io-index"
63+ checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06"
64+ dependencies = [
65+ "async-lock 2.8.0",
66+ "autocfg",
67+ "blocking",
68+ "futures-lite 1.13.0",
69+ ]
70+
71+ [[package]]
72+ name = "async-io"
73+ version = "1.13.0"
74+ source = "registry+https://github.com/rust-lang/crates.io-index"
75+ checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
76+ dependencies = [
77+ "async-lock 2.8.0",
78+ "autocfg",
79+ "cfg-if",
80+ "concurrent-queue",
81+ "futures-lite 1.13.0",
82+ "log",
83+ "parking",
84+ "polling 2.8.0",
85+ "rustix 0.37.27",
86+ "slab",
87+ "socket2 0.4.10",
88+ "waker-fn",
89+ ]
90+
91+ [[package]]
92+ name = "async-io"
93+ version = "2.3.3"
94+ source = "registry+https://github.com/rust-lang/crates.io-index"
95+ checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964"
96+ dependencies = [
97+ "async-lock 3.4.0",
98+ "cfg-if",
99+ "concurrent-queue",
100+ "futures-io",
101+ "futures-lite 2.3.0",
102+ "parking",
103+ "polling 3.7.2",
104+ "rustix 0.38.34",
105+ "slab",
106+ "tracing",
107+ "windows-sys 0.52.0",
108+ ]
109+
110+ [[package]]
111+ name = "async-lock"
112+ version = "2.8.0"
113+ source = "registry+https://github.com/rust-lang/crates.io-index"
114+ checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
115+ dependencies = [
116+ "event-listener 2.5.3",
117+ ]
118+
119+ [[package]]
120+ name = "async-lock"
121+ version = "3.4.0"
122+ source = "registry+https://github.com/rust-lang/crates.io-index"
123+ checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
124+ dependencies = [
125+ "event-listener 5.3.1",
126+ "event-listener-strategy",
127+ "pin-project-lite",
128+ ]
129+
130+ [[package]]
131+ name = "async-net"
132+ version = "1.8.0"
133+ source = "registry+https://github.com/rust-lang/crates.io-index"
134+ checksum = "0434b1ed18ce1cf5769b8ac540e33f01fa9471058b5e89da9e06f3c882a8c12f"
135+ dependencies = [
136+ "async-io 1.13.0",
137+ "blocking",
138+ "futures-lite 1.13.0",
139+ ]
140+
141+ [[package]]
142+ name = "async-process"
143+ version = "1.8.1"
144+ source = "registry+https://github.com/rust-lang/crates.io-index"
145+ checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88"
146+ dependencies = [
147+ "async-io 1.13.0",
148+ "async-lock 2.8.0",
149+ "async-signal",
150+ "blocking",
151+ "cfg-if",
152+ "event-listener 3.1.0",
153+ "futures-lite 1.13.0",
154+ "rustix 0.38.34",
155+ "windows-sys 0.48.0",
156+ ]
157+
158+ [[package]]
159+ name = "async-signal"
160+ version = "0.2.9"
161+ source = "registry+https://github.com/rust-lang/crates.io-index"
162+ checksum = "dfb3634b73397aa844481f814fad23bbf07fdb0eabec10f2eb95e58944b1ec32"
163+ dependencies = [
164+ "async-io 2.3.3",
165+ "async-lock 3.4.0",
166+ "atomic-waker",
167+ "cfg-if",
168+ "futures-core",
169+ "futures-io",
170+ "rustix 0.38.34",
171+ "signal-hook-registry",
172+ "slab",
173+ "windows-sys 0.52.0",
174+ ]
175+
176+ [[package]]
177+ name = "async-stream"
178+ version = "0.3.5"
179+ source = "registry+https://github.com/rust-lang/crates.io-index"
180+ checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
181+ dependencies = [
182+ "async-stream-impl",
183+ "futures-core",
184+ "pin-project-lite",
185+ ]
186+
187+ [[package]]
188+ name = "async-stream-impl"
189+ version = "0.3.5"
190+ source = "registry+https://github.com/rust-lang/crates.io-index"
191+ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
192+ dependencies = [
193+ "proc-macro2",
194+ "quote",
195+ "syn",
196+ ]
197+
198+ [[package]]
199+ name = "async-task"
200+ version = "4.7.1"
201+ source = "registry+https://github.com/rust-lang/crates.io-index"
202+ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
203+
204+ [[package]]
205+ name = "atomic-waker"
206+ version = "1.1.2"
207+ source = "registry+https://github.com/rust-lang/crates.io-index"
208+ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
209+
210+ [[package]]
211 name = "autocfg"
212 version = "1.3.0"
213 source = "registry+https://github.com/rust-lang/crates.io-index"
214 @@ -57,10 +253,38 @@ dependencies = [
215 ]
216
217 [[package]]
218+ name = "base64"
219+ version = "0.13.1"
220+ source = "registry+https://github.com/rust-lang/crates.io-index"
221+ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
222+
223+ [[package]]
224+ name = "bitflags"
225+ version = "1.3.2"
226+ source = "registry+https://github.com/rust-lang/crates.io-index"
227+ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
228+
229+ [[package]]
230 name = "bitflags"
231 version = "2.6.0"
232 source = "registry+https://github.com/rust-lang/crates.io-index"
233 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
234+ dependencies = [
235+ "serde",
236+ ]
237+
238+ [[package]]
239+ name = "blocking"
240+ version = "1.6.1"
241+ source = "registry+https://github.com/rust-lang/crates.io-index"
242+ checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea"
243+ dependencies = [
244+ "async-channel 2.3.1",
245+ "async-task",
246+ "futures-io",
247+ "futures-lite 2.3.0",
248+ "piper",
249+ ]
250
251 [[package]]
252 name = "bytes"
253 @@ -81,6 +305,222 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
254 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
255
256 [[package]]
257+ name = "concurrent-queue"
258+ version = "2.5.0"
259+ source = "registry+https://github.com/rust-lang/crates.io-index"
260+ checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
261+ dependencies = [
262+ "crossbeam-utils",
263+ ]
264+
265+ [[package]]
266+ name = "core-foundation"
267+ version = "0.9.4"
268+ source = "registry+https://github.com/rust-lang/crates.io-index"
269+ checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
270+ dependencies = [
271+ "core-foundation-sys",
272+ "libc",
273+ ]
274+
275+ [[package]]
276+ name = "core-foundation-sys"
277+ version = "0.8.6"
278+ source = "registry+https://github.com/rust-lang/crates.io-index"
279+ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
280+
281+ [[package]]
282+ name = "crc32fast"
283+ version = "1.4.2"
284+ source = "registry+https://github.com/rust-lang/crates.io-index"
285+ checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
286+ dependencies = [
287+ "cfg-if",
288+ ]
289+
290+ [[package]]
291+ name = "crossbeam-utils"
292+ version = "0.8.20"
293+ source = "registry+https://github.com/rust-lang/crates.io-index"
294+ checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
295+
296+ [[package]]
297+ name = "data-encoding"
298+ version = "2.6.0"
299+ source = "registry+https://github.com/rust-lang/crates.io-index"
300+ checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2"
301+
302+ [[package]]
303+ name = "encoding"
304+ version = "0.2.33"
305+ source = "registry+https://github.com/rust-lang/crates.io-index"
306+ checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
307+ dependencies = [
308+ "encoding-index-japanese",
309+ "encoding-index-korean",
310+ "encoding-index-simpchinese",
311+ "encoding-index-singlebyte",
312+ "encoding-index-tradchinese",
313+ ]
314+
315+ [[package]]
316+ name = "encoding-index-japanese"
317+ version = "1.20141219.5"
318+ source = "registry+https://github.com/rust-lang/crates.io-index"
319+ checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
320+ dependencies = [
321+ "encoding_index_tests",
322+ ]
323+
324+ [[package]]
325+ name = "encoding-index-korean"
326+ version = "1.20141219.5"
327+ source = "registry+https://github.com/rust-lang/crates.io-index"
328+ checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
329+ dependencies = [
330+ "encoding_index_tests",
331+ ]
332+
333+ [[package]]
334+ name = "encoding-index-simpchinese"
335+ version = "1.20141219.5"
336+ source = "registry+https://github.com/rust-lang/crates.io-index"
337+ checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
338+ dependencies = [
339+ "encoding_index_tests",
340+ ]
341+
342+ [[package]]
343+ name = "encoding-index-singlebyte"
344+ version = "1.20141219.5"
345+ source = "registry+https://github.com/rust-lang/crates.io-index"
346+ checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
347+ dependencies = [
348+ "encoding_index_tests",
349+ ]
350+
351+ [[package]]
352+ name = "encoding-index-tradchinese"
353+ version = "1.20141219.5"
354+ source = "registry+https://github.com/rust-lang/crates.io-index"
355+ checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
356+ dependencies = [
357+ "encoding_index_tests",
358+ ]
359+
360+ [[package]]
361+ name = "encoding_index_tests"
362+ version = "0.1.4"
363+ source = "registry+https://github.com/rust-lang/crates.io-index"
364+ checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
365+
366+ [[package]]
367+ name = "encoding_rs"
368+ version = "0.8.34"
369+ source = "registry+https://github.com/rust-lang/crates.io-index"
370+ checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
371+ dependencies = [
372+ "cfg-if",
373+ ]
374+
375+ [[package]]
376+ name = "errno"
377+ version = "0.3.9"
378+ source = "registry+https://github.com/rust-lang/crates.io-index"
379+ checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
380+ dependencies = [
381+ "libc",
382+ "windows-sys 0.52.0",
383+ ]
384+
385+ [[package]]
386+ name = "event-listener"
387+ version = "2.5.3"
388+ source = "registry+https://github.com/rust-lang/crates.io-index"
389+ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
390+
391+ [[package]]
392+ name = "event-listener"
393+ version = "3.1.0"
394+ source = "registry+https://github.com/rust-lang/crates.io-index"
395+ checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2"
396+ dependencies = [
397+ "concurrent-queue",
398+ "parking",
399+ "pin-project-lite",
400+ ]
401+
402+ [[package]]
403+ name = "event-listener"
404+ version = "5.3.1"
405+ source = "registry+https://github.com/rust-lang/crates.io-index"
406+ checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
407+ dependencies = [
408+ "concurrent-queue",
409+ "parking",
410+ "pin-project-lite",
411+ ]
412+
413+ [[package]]
414+ name = "event-listener-strategy"
415+ version = "0.5.2"
416+ source = "registry+https://github.com/rust-lang/crates.io-index"
417+ checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
418+ dependencies = [
419+ "event-listener 5.3.1",
420+ "pin-project-lite",
421+ ]
422+
423+ [[package]]
424+ name = "fastrand"
425+ version = "1.9.0"
426+ source = "registry+https://github.com/rust-lang/crates.io-index"
427+ checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
428+ dependencies = [
429+ "instant",
430+ ]
431+
432+ [[package]]
433+ name = "fastrand"
434+ version = "2.1.0"
435+ source = "registry+https://github.com/rust-lang/crates.io-index"
436+ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
437+
438+ [[package]]
439+ name = "flate2"
440+ version = "1.0.30"
441+ source = "registry+https://github.com/rust-lang/crates.io-index"
442+ checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
443+ dependencies = [
444+ "crc32fast",
445+ "miniz_oxide",
446+ ]
447+
448+ [[package]]
449+ name = "foreign-types"
450+ version = "0.3.2"
451+ source = "registry+https://github.com/rust-lang/crates.io-index"
452+ checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
453+ dependencies = [
454+ "foreign-types-shared",
455+ ]
456+
457+ [[package]]
458+ name = "foreign-types-shared"
459+ version = "0.1.1"
460+ source = "registry+https://github.com/rust-lang/crates.io-index"
461+ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
462+
463+ [[package]]
464+ name = "form_urlencoded"
465+ version = "1.2.1"
466+ source = "registry+https://github.com/rust-lang/crates.io-index"
467+ checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
468+ dependencies = [
469+ "percent-encoding",
470+ ]
471+
472+ [[package]]
473 name = "futures"
474 version = "0.3.30"
475 source = "registry+https://github.com/rust-lang/crates.io-index"
476 @@ -129,6 +569,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
477 checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
478
479 [[package]]
480+ name = "futures-lite"
481+ version = "1.13.0"
482+ source = "registry+https://github.com/rust-lang/crates.io-index"
483+ checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
484+ dependencies = [
485+ "fastrand 1.9.0",
486+ "futures-core",
487+ "futures-io",
488+ "memchr",
489+ "parking",
490+ "pin-project-lite",
491+ "waker-fn",
492+ ]
493+
494+ [[package]]
495+ name = "futures-lite"
496+ version = "2.3.0"
497+ source = "registry+https://github.com/rust-lang/crates.io-index"
498+ checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
499+ dependencies = [
500+ "fastrand 2.1.0",
501+ "futures-core",
502+ "futures-io",
503+ "parking",
504+ "pin-project-lite",
505+ ]
506+
507+ [[package]]
508 name = "futures-macro"
509 version = "0.3.30"
510 source = "registry+https://github.com/rust-lang/crates.io-index"
511 @@ -170,6 +638,17 @@ dependencies = [
512 ]
513
514 [[package]]
515+ name = "getrandom"
516+ version = "0.2.15"
517+ source = "registry+https://github.com/rust-lang/crates.io-index"
518+ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
519+ dependencies = [
520+ "cfg-if",
521+ "libc",
522+ "wasi",
523+ ]
524+
525+ [[package]]
526 name = "gimli"
527 version = "0.29.0"
528 source = "registry+https://github.com/rust-lang/crates.io-index"
529 @@ -177,6 +656,12 @@ checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
530
531 [[package]]
532 name = "hashbrown"
533+ version = "0.12.3"
534+ source = "registry+https://github.com/rust-lang/crates.io-index"
535+ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
536+
537+ [[package]]
538+ name = "hashbrown"
539 version = "0.14.5"
540 source = "registry+https://github.com/rust-lang/crates.io-index"
541 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
542 @@ -192,6 +677,59 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
543 checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
544
545 [[package]]
546+ name = "hermit-abi"
547+ version = "0.4.0"
548+ source = "registry+https://github.com/rust-lang/crates.io-index"
549+ checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
550+
551+ [[package]]
552+ name = "idna"
553+ version = "0.5.0"
554+ source = "registry+https://github.com/rust-lang/crates.io-index"
555+ checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
556+ dependencies = [
557+ "unicode-bidi",
558+ "unicode-normalization",
559+ ]
560+
561+ [[package]]
562+ name = "indexmap"
563+ version = "1.9.3"
564+ source = "registry+https://github.com/rust-lang/crates.io-index"
565+ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
566+ dependencies = [
567+ "autocfg",
568+ "hashbrown 0.12.3",
569+ "serde",
570+ ]
571+
572+ [[package]]
573+ name = "instant"
574+ version = "0.1.13"
575+ source = "registry+https://github.com/rust-lang/crates.io-index"
576+ checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
577+ dependencies = [
578+ "cfg-if",
579+ ]
580+
581+ [[package]]
582+ name = "io-lifetimes"
583+ version = "1.0.11"
584+ source = "registry+https://github.com/rust-lang/crates.io-index"
585+ checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
586+ dependencies = [
587+ "hermit-abi 0.3.9",
588+ "libc",
589+ "windows-sys 0.48.0",
590+ ]
591+
592+ [[package]]
593+ name = "itoa"
594+ version = "1.0.11"
595+ source = "registry+https://github.com/rust-lang/crates.io-index"
596+ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
597+
598+ [[package]]
599 name = "lazy_static"
600 version = "1.5.0"
601 source = "registry+https://github.com/rust-lang/crates.io-index"
602 @@ -204,6 +742,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
603 checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
604
605 [[package]]
606+ name = "libloading"
607+ version = "0.7.4"
608+ source = "registry+https://github.com/rust-lang/crates.io-index"
609+ checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
610+ dependencies = [
611+ "cfg-if",
612+ "winapi",
613+ ]
614+
615+ [[package]]
616+ name = "linux-raw-sys"
617+ version = "0.3.8"
618+ source = "registry+https://github.com/rust-lang/crates.io-index"
619+ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
620+
621+ [[package]]
622+ name = "linux-raw-sys"
623+ version = "0.4.14"
624+ source = "registry+https://github.com/rust-lang/crates.io-index"
625+ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
626+
627+ [[package]]
628 name = "lock_api"
629 version = "0.4.12"
630 source = "registry+https://github.com/rust-lang/crates.io-index"
631 @@ -220,17 +780,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
632 checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
633
634 [[package]]
635+ name = "mail-parser"
636+ version = "0.9.3"
637+ source = "registry+https://github.com/rust-lang/crates.io-index"
638+ checksum = "ed5a1335c3a964788c90cb42ae04a34b5f2628e89566949ce3bd4ada695c0bcd"
639+ dependencies = [
640+ "encoding_rs",
641+ "serde",
642+ ]
643+
644+ [[package]]
645 name = "maitred"
646 version = "0.1.0"
647 dependencies = [
648 "bytes",
649 "futures",
650+ "mail-parser",
651+ "melib",
652 "smtp-proto",
653 "thiserror",
654 "tokio",
655 "tokio-stream",
656 "tokio-util",
657 "tracing",
658+ "url",
659 ]
660
661 [[package]]
662 @@ -245,10 +818,60 @@ dependencies = [
663 ]
664
665 [[package]]
666- name = "memchr"
667- version = "2.7.4"
668+ name = "melib"
669+ version = "0.8.6"
670+ source = "registry+https://github.com/rust-lang/crates.io-index"
671+ checksum = "4f233699ab6a71d41529624e3d9600c8a3a208874fcf4ec4a05778314afdd2e7"
672+ dependencies = [
673+ "async-stream",
674+ "base64",
675+ "bitflags 2.6.0",
676+ "data-encoding",
677+ "encoding",
678+ "encoding_rs",
679+ "flate2",
680+ "futures",
681+ "indexmap",
682+ "libc",
683+ "libloading",
684+ "log",
685+ "native-tls",
686+ "nix",
687+ "nom",
688+ "polling 2.8.0",
689+ "regex",
690+ "serde",
691+ "serde_derive",
692+ "serde_json",
693+ "serde_path_to_error",
694+ "smallvec",
695+ "smol",
696+ "socket2 0.5.7",
697+ "unicode-segmentation",
698+ "uuid",
699+ "xdg",
700+ ]
701+
702+ [[package]]
703+ name = "memchr"
704+ version = "2.7.4"
705+ source = "registry+https://github.com/rust-lang/crates.io-index"
706+ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
707+
708+ [[package]]
709+ name = "memoffset"
710+ version = "0.9.1"
711+ source = "registry+https://github.com/rust-lang/crates.io-index"
712+ checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
713+ dependencies = [
714+ "autocfg",
715+ ]
716+
717+ [[package]]
718+ name = "minimal-lexical"
719+ version = "0.2.1"
720 source = "registry+https://github.com/rust-lang/crates.io-index"
721- checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
722+ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
723
724 [[package]]
725 name = "miniz_oxide"
726 @@ -265,10 +888,49 @@ version = "1.0.1"
727 source = "registry+https://github.com/rust-lang/crates.io-index"
728 checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4"
729 dependencies = [
730- "hermit-abi",
731+ "hermit-abi 0.3.9",
732 "libc",
733 "wasi",
734- "windows-sys",
735+ "windows-sys 0.52.0",
736+ ]
737+
738+ [[package]]
739+ name = "native-tls"
740+ version = "0.2.12"
741+ source = "registry+https://github.com/rust-lang/crates.io-index"
742+ checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
743+ dependencies = [
744+ "libc",
745+ "log",
746+ "openssl",
747+ "openssl-probe",
748+ "openssl-sys",
749+ "schannel",
750+ "security-framework",
751+ "security-framework-sys",
752+ "tempfile",
753+ ]
754+
755+ [[package]]
756+ name = "nix"
757+ version = "0.27.1"
758+ source = "registry+https://github.com/rust-lang/crates.io-index"
759+ checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
760+ dependencies = [
761+ "bitflags 2.6.0",
762+ "cfg-if",
763+ "libc",
764+ "memoffset",
765+ ]
766+
767+ [[package]]
768+ name = "nom"
769+ version = "7.1.3"
770+ source = "registry+https://github.com/rust-lang/crates.io-index"
771+ checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
772+ dependencies = [
773+ "memchr",
774+ "minimal-lexical",
775 ]
776
777 [[package]]
778 @@ -297,12 +959,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
779 checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
780
781 [[package]]
782+ name = "openssl"
783+ version = "0.10.66"
784+ source = "registry+https://github.com/rust-lang/crates.io-index"
785+ checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
786+ dependencies = [
787+ "bitflags 2.6.0",
788+ "cfg-if",
789+ "foreign-types",
790+ "libc",
791+ "once_cell",
792+ "openssl-macros",
793+ "openssl-sys",
794+ ]
795+
796+ [[package]]
797+ name = "openssl-macros"
798+ version = "0.1.1"
799+ source = "registry+https://github.com/rust-lang/crates.io-index"
800+ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
801+ dependencies = [
802+ "proc-macro2",
803+ "quote",
804+ "syn",
805+ ]
806+
807+ [[package]]
808+ name = "openssl-probe"
809+ version = "0.1.5"
810+ source = "registry+https://github.com/rust-lang/crates.io-index"
811+ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
812+
813+ [[package]]
814+ name = "openssl-sys"
815+ version = "0.9.103"
816+ source = "registry+https://github.com/rust-lang/crates.io-index"
817+ checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6"
818+ dependencies = [
819+ "cc",
820+ "libc",
821+ "pkg-config",
822+ "vcpkg",
823+ ]
824+
825+ [[package]]
826 name = "overload"
827 version = "0.1.1"
828 source = "registry+https://github.com/rust-lang/crates.io-index"
829 checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
830
831 [[package]]
832+ name = "parking"
833+ version = "2.2.0"
834+ source = "registry+https://github.com/rust-lang/crates.io-index"
835+ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
836+
837+ [[package]]
838 name = "parking_lot"
839 version = "0.12.3"
840 source = "registry+https://github.com/rust-lang/crates.io-index"
841 @@ -322,10 +1034,16 @@ dependencies = [
842 "libc",
843 "redox_syscall",
844 "smallvec",
845- "windows-targets",
846+ "windows-targets 0.52.6",
847 ]
848
849 [[package]]
850+ name = "percent-encoding"
851+ version = "2.3.1"
852+ source = "registry+https://github.com/rust-lang/crates.io-index"
853+ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
854+
855+ [[package]]
856 name = "pin-project-lite"
857 version = "0.2.14"
858 source = "registry+https://github.com/rust-lang/crates.io-index"
859 @@ -338,6 +1056,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
860 checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
861
862 [[package]]
863+ name = "piper"
864+ version = "0.2.3"
865+ source = "registry+https://github.com/rust-lang/crates.io-index"
866+ checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391"
867+ dependencies = [
868+ "atomic-waker",
869+ "fastrand 2.1.0",
870+ "futures-io",
871+ ]
872+
873+ [[package]]
874+ name = "pkg-config"
875+ version = "0.3.30"
876+ source = "registry+https://github.com/rust-lang/crates.io-index"
877+ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
878+
879+ [[package]]
880+ name = "polling"
881+ version = "2.8.0"
882+ source = "registry+https://github.com/rust-lang/crates.io-index"
883+ checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
884+ dependencies = [
885+ "autocfg",
886+ "bitflags 1.3.2",
887+ "cfg-if",
888+ "concurrent-queue",
889+ "libc",
890+ "log",
891+ "pin-project-lite",
892+ "windows-sys 0.48.0",
893+ ]
894+
895+ [[package]]
896+ name = "polling"
897+ version = "3.7.2"
898+ source = "registry+https://github.com/rust-lang/crates.io-index"
899+ checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b"
900+ dependencies = [
901+ "cfg-if",
902+ "concurrent-queue",
903+ "hermit-abi 0.4.0",
904+ "pin-project-lite",
905+ "rustix 0.38.34",
906+ "tracing",
907+ "windows-sys 0.52.0",
908+ ]
909+
910+ [[package]]
911 name = "proc-macro2"
912 version = "1.0.86"
913 source = "registry+https://github.com/rust-lang/crates.io-index"
914 @@ -361,22 +1127,116 @@ version = "0.5.3"
915 source = "registry+https://github.com/rust-lang/crates.io-index"
916 checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
917 dependencies = [
918- "bitflags",
919+ "bitflags 2.6.0",
920+ ]
921+
922+ [[package]]
923+ name = "regex"
924+ version = "1.10.5"
925+ source = "registry+https://github.com/rust-lang/crates.io-index"
926+ checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
927+ dependencies = [
928+ "aho-corasick",
929+ "memchr",
930+ "regex-automata",
931+ "regex-syntax",
932+ ]
933+
934+ [[package]]
935+ name = "regex-automata"
936+ version = "0.4.7"
937+ source = "registry+https://github.com/rust-lang/crates.io-index"
938+ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
939+ dependencies = [
940+ "aho-corasick",
941+ "memchr",
942+ "regex-syntax",
943 ]
944
945 [[package]]
946+ name = "regex-syntax"
947+ version = "0.8.4"
948+ source = "registry+https://github.com/rust-lang/crates.io-index"
949+ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
950+
951+ [[package]]
952 name = "rustc-demangle"
953 version = "0.1.24"
954 source = "registry+https://github.com/rust-lang/crates.io-index"
955 checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
956
957 [[package]]
958+ name = "rustix"
959+ version = "0.37.27"
960+ source = "registry+https://github.com/rust-lang/crates.io-index"
961+ checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
962+ dependencies = [
963+ "bitflags 1.3.2",
964+ "errno",
965+ "io-lifetimes",
966+ "libc",
967+ "linux-raw-sys 0.3.8",
968+ "windows-sys 0.48.0",
969+ ]
970+
971+ [[package]]
972+ name = "rustix"
973+ version = "0.38.34"
974+ source = "registry+https://github.com/rust-lang/crates.io-index"
975+ checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
976+ dependencies = [
977+ "bitflags 2.6.0",
978+ "errno",
979+ "libc",
980+ "linux-raw-sys 0.4.14",
981+ "windows-sys 0.52.0",
982+ ]
983+
984+ [[package]]
985+ name = "ryu"
986+ version = "1.0.18"
987+ source = "registry+https://github.com/rust-lang/crates.io-index"
988+ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
989+
990+ [[package]]
991+ name = "schannel"
992+ version = "0.1.23"
993+ source = "registry+https://github.com/rust-lang/crates.io-index"
994+ checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
995+ dependencies = [
996+ "windows-sys 0.52.0",
997+ ]
998+
999+ [[package]]
1000 name = "scopeguard"
1001 version = "1.2.0"
1002 source = "registry+https://github.com/rust-lang/crates.io-index"
1003 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1004
1005 [[package]]
1006+ name = "security-framework"
1007+ version = "2.11.1"
1008+ source = "registry+https://github.com/rust-lang/crates.io-index"
1009+ checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1010+ dependencies = [
1011+ "bitflags 2.6.0",
1012+ "core-foundation",
1013+ "core-foundation-sys",
1014+ "libc",
1015+ "security-framework-sys",
1016+ ]
1017+
1018+ [[package]]
1019+ name = "security-framework-sys"
1020+ version = "2.11.1"
1021+ source = "registry+https://github.com/rust-lang/crates.io-index"
1022+ checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf"
1023+ dependencies = [
1024+ "core-foundation-sys",
1025+ "libc",
1026+ ]
1027+
1028+ [[package]]
1029 name = "serde"
1030 version = "1.0.204"
1031 source = "registry+https://github.com/rust-lang/crates.io-index"
1032 @@ -397,6 +1257,33 @@ dependencies = [
1033 ]
1034
1035 [[package]]
1036+ name = "serde_json"
1037+ version = "1.0.120"
1038+ source = "registry+https://github.com/rust-lang/crates.io-index"
1039+ checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
1040+ dependencies = [
1041+ "itoa",
1042+ "ryu",
1043+ "serde",
1044+ ]
1045+
1046+ [[package]]
1047+ name = "serde_path_to_error"
1048+ version = "0.1.16"
1049+ source = "registry+https://github.com/rust-lang/crates.io-index"
1050+ checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6"
1051+ dependencies = [
1052+ "itoa",
1053+ "serde",
1054+ ]
1055+
1056+ [[package]]
1057+ name = "sha1_smol"
1058+ version = "1.0.1"
1059+ source = "registry+https://github.com/rust-lang/crates.io-index"
1060+ checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d"
1061+
1062+ [[package]]
1063 name = "sharded-slab"
1064 version = "0.1.7"
1065 source = "registry+https://github.com/rust-lang/crates.io-index"
1066 @@ -428,6 +1315,26 @@ name = "smallvec"
1067 version = "1.13.2"
1068 source = "registry+https://github.com/rust-lang/crates.io-index"
1069 checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
1070+ dependencies = [
1071+ "serde",
1072+ ]
1073+
1074+ [[package]]
1075+ name = "smol"
1076+ version = "1.3.0"
1077+ source = "registry+https://github.com/rust-lang/crates.io-index"
1078+ checksum = "13f2b548cd8447f8de0fdf1c592929f70f4fc7039a05e47404b0d096ec6987a1"
1079+ dependencies = [
1080+ "async-channel 1.9.0",
1081+ "async-executor",
1082+ "async-fs",
1083+ "async-io 1.13.0",
1084+ "async-lock 2.8.0",
1085+ "async-net",
1086+ "async-process",
1087+ "blocking",
1088+ "futures-lite 1.13.0",
1089+ ]
1090
1091 [[package]]
1092 name = "smtp-proto"
1093 @@ -440,12 +1347,22 @@ dependencies = [
1094
1095 [[package]]
1096 name = "socket2"
1097+ version = "0.4.10"
1098+ source = "registry+https://github.com/rust-lang/crates.io-index"
1099+ checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
1100+ dependencies = [
1101+ "libc",
1102+ "winapi",
1103+ ]
1104+
1105+ [[package]]
1106+ name = "socket2"
1107 version = "0.5.7"
1108 source = "registry+https://github.com/rust-lang/crates.io-index"
1109 checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
1110 dependencies = [
1111 "libc",
1112- "windows-sys",
1113+ "windows-sys 0.52.0",
1114 ]
1115
1116 [[package]]
1117 @@ -460,6 +1377,18 @@ dependencies = [
1118 ]
1119
1120 [[package]]
1121+ name = "tempfile"
1122+ version = "3.10.1"
1123+ source = "registry+https://github.com/rust-lang/crates.io-index"
1124+ checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
1125+ dependencies = [
1126+ "cfg-if",
1127+ "fastrand 2.1.0",
1128+ "rustix 0.38.34",
1129+ "windows-sys 0.52.0",
1130+ ]
1131+
1132+ [[package]]
1133 name = "thiserror"
1134 version = "1.0.63"
1135 source = "registry+https://github.com/rust-lang/crates.io-index"
1136 @@ -490,6 +1419,21 @@ dependencies = [
1137 ]
1138
1139 [[package]]
1140+ name = "tinyvec"
1141+ version = "1.8.0"
1142+ source = "registry+https://github.com/rust-lang/crates.io-index"
1143+ checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
1144+ dependencies = [
1145+ "tinyvec_macros",
1146+ ]
1147+
1148+ [[package]]
1149+ name = "tinyvec_macros"
1150+ version = "0.1.1"
1151+ source = "registry+https://github.com/rust-lang/crates.io-index"
1152+ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1153+
1154+ [[package]]
1155 name = "tokio"
1156 version = "1.39.2"
1157 source = "registry+https://github.com/rust-lang/crates.io-index"
1158 @@ -502,9 +1446,9 @@ dependencies = [
1159 "parking_lot",
1160 "pin-project-lite",
1161 "signal-hook-registry",
1162- "socket2",
1163+ "socket2 0.5.7",
1164 "tokio-macros",
1165- "windows-sys",
1166+ "windows-sys 0.52.0",
1167 ]
1168
1169 [[package]]
1170 @@ -541,7 +1485,7 @@ dependencies = [
1171 "futures-io",
1172 "futures-sink",
1173 "futures-util",
1174- "hashbrown",
1175+ "hashbrown 0.14.5",
1176 "pin-project-lite",
1177 "slab",
1178 "tokio",
1179 @@ -606,24 +1550,79 @@ dependencies = [
1180 ]
1181
1182 [[package]]
1183+ name = "unicode-bidi"
1184+ version = "0.3.15"
1185+ source = "registry+https://github.com/rust-lang/crates.io-index"
1186+ checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
1187+
1188+ [[package]]
1189 name = "unicode-ident"
1190 version = "1.0.12"
1191 source = "registry+https://github.com/rust-lang/crates.io-index"
1192 checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
1193
1194 [[package]]
1195+ name = "unicode-normalization"
1196+ version = "0.1.23"
1197+ source = "registry+https://github.com/rust-lang/crates.io-index"
1198+ checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
1199+ dependencies = [
1200+ "tinyvec",
1201+ ]
1202+
1203+ [[package]]
1204+ name = "unicode-segmentation"
1205+ version = "1.11.0"
1206+ source = "registry+https://github.com/rust-lang/crates.io-index"
1207+ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
1208+
1209+ [[package]]
1210+ name = "url"
1211+ version = "2.5.2"
1212+ source = "registry+https://github.com/rust-lang/crates.io-index"
1213+ checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
1214+ dependencies = [
1215+ "form_urlencoded",
1216+ "idna",
1217+ "percent-encoding",
1218+ ]
1219+
1220+ [[package]]
1221+ name = "uuid"
1222+ version = "1.10.0"
1223+ source = "registry+https://github.com/rust-lang/crates.io-index"
1224+ checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
1225+ dependencies = [
1226+ "getrandom",
1227+ "serde",
1228+ "sha1_smol",
1229+ ]
1230+
1231+ [[package]]
1232 name = "valuable"
1233 version = "0.1.0"
1234 source = "registry+https://github.com/rust-lang/crates.io-index"
1235 checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
1236
1237 [[package]]
1238+ name = "vcpkg"
1239+ version = "0.2.15"
1240+ source = "registry+https://github.com/rust-lang/crates.io-index"
1241+ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1242+
1243+ [[package]]
1244 name = "version_check"
1245 version = "0.9.5"
1246 source = "registry+https://github.com/rust-lang/crates.io-index"
1247 checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
1248
1249 [[package]]
1250+ name = "waker-fn"
1251+ version = "1.2.0"
1252+ source = "registry+https://github.com/rust-lang/crates.io-index"
1253+ checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
1254+
1255+ [[package]]
1256 name = "wasi"
1257 version = "0.11.0+wasi-snapshot-preview1"
1258 source = "registry+https://github.com/rust-lang/crates.io-index"
1259 @@ -653,11 +1652,35 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1260
1261 [[package]]
1262 name = "windows-sys"
1263+ version = "0.48.0"
1264+ source = "registry+https://github.com/rust-lang/crates.io-index"
1265+ checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
1266+ dependencies = [
1267+ "windows-targets 0.48.5",
1268+ ]
1269+
1270+ [[package]]
1271+ name = "windows-sys"
1272 version = "0.52.0"
1273 source = "registry+https://github.com/rust-lang/crates.io-index"
1274 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
1275 dependencies = [
1276- "windows-targets",
1277+ "windows-targets 0.52.6",
1278+ ]
1279+
1280+ [[package]]
1281+ name = "windows-targets"
1282+ version = "0.48.5"
1283+ source = "registry+https://github.com/rust-lang/crates.io-index"
1284+ checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
1285+ dependencies = [
1286+ "windows_aarch64_gnullvm 0.48.5",
1287+ "windows_aarch64_msvc 0.48.5",
1288+ "windows_i686_gnu 0.48.5",
1289+ "windows_i686_msvc 0.48.5",
1290+ "windows_x86_64_gnu 0.48.5",
1291+ "windows_x86_64_gnullvm 0.48.5",
1292+ "windows_x86_64_msvc 0.48.5",
1293 ]
1294
1295 [[package]]
1296 @@ -666,30 +1689,48 @@ version = "0.52.6"
1297 source = "registry+https://github.com/rust-lang/crates.io-index"
1298 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
1299 dependencies = [
1300- "windows_aarch64_gnullvm",
1301- "windows_aarch64_msvc",
1302- "windows_i686_gnu",
1303+ "windows_aarch64_gnullvm 0.52.6",
1304+ "windows_aarch64_msvc 0.52.6",
1305+ "windows_i686_gnu 0.52.6",
1306 "windows_i686_gnullvm",
1307- "windows_i686_msvc",
1308- "windows_x86_64_gnu",
1309- "windows_x86_64_gnullvm",
1310- "windows_x86_64_msvc",
1311+ "windows_i686_msvc 0.52.6",
1312+ "windows_x86_64_gnu 0.52.6",
1313+ "windows_x86_64_gnullvm 0.52.6",
1314+ "windows_x86_64_msvc 0.52.6",
1315 ]
1316
1317 [[package]]
1318 name = "windows_aarch64_gnullvm"
1319+ version = "0.48.5"
1320+ source = "registry+https://github.com/rust-lang/crates.io-index"
1321+ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
1322+
1323+ [[package]]
1324+ name = "windows_aarch64_gnullvm"
1325 version = "0.52.6"
1326 source = "registry+https://github.com/rust-lang/crates.io-index"
1327 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
1328
1329 [[package]]
1330 name = "windows_aarch64_msvc"
1331+ version = "0.48.5"
1332+ source = "registry+https://github.com/rust-lang/crates.io-index"
1333+ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
1334+
1335+ [[package]]
1336+ name = "windows_aarch64_msvc"
1337 version = "0.52.6"
1338 source = "registry+https://github.com/rust-lang/crates.io-index"
1339 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
1340
1341 [[package]]
1342 name = "windows_i686_gnu"
1343+ version = "0.48.5"
1344+ source = "registry+https://github.com/rust-lang/crates.io-index"
1345+ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
1346+
1347+ [[package]]
1348+ name = "windows_i686_gnu"
1349 version = "0.52.6"
1350 source = "registry+https://github.com/rust-lang/crates.io-index"
1351 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
1352 @@ -702,29 +1743,59 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
1353
1354 [[package]]
1355 name = "windows_i686_msvc"
1356+ version = "0.48.5"
1357+ source = "registry+https://github.com/rust-lang/crates.io-index"
1358+ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
1359+
1360+ [[package]]
1361+ name = "windows_i686_msvc"
1362 version = "0.52.6"
1363 source = "registry+https://github.com/rust-lang/crates.io-index"
1364 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
1365
1366 [[package]]
1367 name = "windows_x86_64_gnu"
1368+ version = "0.48.5"
1369+ source = "registry+https://github.com/rust-lang/crates.io-index"
1370+ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
1371+
1372+ [[package]]
1373+ name = "windows_x86_64_gnu"
1374 version = "0.52.6"
1375 source = "registry+https://github.com/rust-lang/crates.io-index"
1376 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
1377
1378 [[package]]
1379 name = "windows_x86_64_gnullvm"
1380+ version = "0.48.5"
1381+ source = "registry+https://github.com/rust-lang/crates.io-index"
1382+ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
1383+
1384+ [[package]]
1385+ name = "windows_x86_64_gnullvm"
1386 version = "0.52.6"
1387 source = "registry+https://github.com/rust-lang/crates.io-index"
1388 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
1389
1390 [[package]]
1391 name = "windows_x86_64_msvc"
1392+ version = "0.48.5"
1393+ source = "registry+https://github.com/rust-lang/crates.io-index"
1394+ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
1395+
1396+ [[package]]
1397+ name = "windows_x86_64_msvc"
1398 version = "0.52.6"
1399 source = "registry+https://github.com/rust-lang/crates.io-index"
1400 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1401
1402 [[package]]
1403+ name = "xdg"
1404+ version = "2.5.2"
1405+ source = "registry+https://github.com/rust-lang/crates.io-index"
1406+ checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546"
1407+
1408+ [[package]]
1409 name = "zerocopy"
1410 version = "0.7.35"
1411 source = "registry+https://github.com/rust-lang/crates.io-index"
1412 diff --git a/maitred/Cargo.toml b/maitred/Cargo.toml
1413index af22925..81236de 100644
1414--- a/maitred/Cargo.toml
1415+++ b/maitred/Cargo.toml
1416 @@ -6,9 +6,12 @@ edition = "2021"
1417 [dependencies]
1418 bytes = "1.6.1"
1419 futures = "0.3.30"
1420+ mail-parser = { version = "0.9.3", features = ["serde", "serde_support"] }
1421+ melib = { version = "0.8.6", default-features = false, features = ["base64", "smtp"] }
1422 smtp-proto = { version = "0.1.5", features = ["serde", "serde_support"] }
1423 thiserror = "1.0.63"
1424 tokio = { version = "1.39.2", features = ["full"] }
1425 tokio-stream = { version = "0.1.15", features = ["full"] }
1426 tokio-util = { version = "0.7.11", features = ["full"] }
1427 tracing = { version = "0.1.40", features = ["log"] }
1428+ url = "2.5.2"
1429 diff --git a/maitred/src/error.rs b/maitred/src/error.rs
1430index 05d6c21..f6a2bd1 100644
1431--- a/maitred/src/error.rs
1432+++ b/maitred/src/error.rs
1433 @@ -1,4 +1,8 @@
1434- use smtp_proto::{Error as SmtpError};
1435+ use std::string::FromUtf8Error;
1436+
1437+ use melib::error::Error as MelibError;
1438+ use smtp_proto::Error as SmtpError;
1439+ use url::ParseError;
1440
1441 #[derive(Debug, thiserror::Error)]
1442 pub enum Error {
1443 @@ -8,4 +12,10 @@ pub enum Error {
1444 Io(#[from] std::io::Error),
1445 #[error("Smtp failure: {0}")]
1446 Smtp(#[from] SmtpError),
1447+ #[error("Melib error: {0}")]
1448+ Melib(#[from] MelibError),
1449+ #[error("Failed to parse Url: {0}")]
1450+ UrlParsing(#[from] ParseError),
1451+ #[error("Failed to read UTF8: {0}")]
1452+ Utf8(#[from] FromUtf8Error)
1453 }
1454 diff --git a/maitred/src/lib.rs b/maitred/src/lib.rs
1455index 0c51127..e11ad6a 100644
1456--- a/maitred/src/lib.rs
1457+++ b/maitred/src/lib.rs
1458 @@ -1,5 +1,6 @@
1459 mod error;
1460 mod server;
1461+ mod session;
1462 mod transport;
1463
1464 pub use error::Error;
1465 diff --git a/maitred/src/server.rs b/maitred/src/server.rs
1466index d17e807..ccc7fb6 100644
1467--- a/maitred/src/server.rs
1468+++ b/maitred/src/server.rs
1469 @@ -1,30 +1,13 @@
1470 use futures::SinkExt;
1471- use smtp_proto::{Request, Response};
1472+ use smtp_proto::Request;
1473 use tokio::net::{TcpListener, TcpStream};
1474 use tokio_stream::StreamExt;
1475 use tokio_util::codec::Framed;
1476
1477 use crate::error::Error;
1478+ use crate::session::Session;
1479 use crate::transport::Transport;
1480
1481- /// State of an active SMTP session
1482- #[derive(Default)]
1483- struct Session {
1484- // all previous commands excluding
1485- pub history: Vec<Request<String>>,
1486- // message body
1487- pub body: Vec<u8>,
1488- }
1489-
1490- impl Session {
1491- /// If the session is in data transfer mode
1492- pub fn data_transfer(self) -> bool {
1493- self.history
1494- .last()
1495- .is_some_and(|req| matches!(req, Request::Data))
1496- }
1497- }
1498-
1499 pub struct Server {
1500 addr: String,
1501 }
1502 @@ -54,60 +37,32 @@ impl Server {
1503 let transport = Transport::default();
1504 let mut framed = Framed::new(stream, transport);
1505 let mut session = Session::default();
1506- 'outer: while let Some(request) = framed.next().await {
1507- tracing::debug!("Processing SMTP request: {:?}", request);
1508+ let mut finished = false;
1509+ while let Some(request) = framed.next().await {
1510 match request {
1511- Ok(req) => {
1512- session.history.push(req.clone());
1513- match req {
1514- Request::Ehlo { host } => {
1515- framed
1516- .send(Response::new(250, 0, 0, 0, format!("Hello {}", host)))
1517- .await?;
1518- }
1519- Request::Lhlo { host } => todo!(),
1520- Request::Helo { host } => {
1521- framed
1522- .send(Response::new(250, 0, 0, 0, format!("Hello {}", host)))
1523- .await?;
1524- }
1525- Request::Mail { from } => {}
1526- Request::Rcpt { to } => {}
1527- Request::Bdat {
1528- chunk_size,
1529- is_last,
1530- } => todo!(),
1531- Request::Auth {
1532- mechanism,
1533- initial_response,
1534- } => todo!(),
1535- Request::Noop { value } => todo!(),
1536- Request::Vrfy { value } => todo!(),
1537- Request::Expn { value } => todo!(),
1538- Request::Help { value } => todo!(),
1539- Request::Etrn { name } => todo!(),
1540- Request::Atrn { domains } => todo!(),
1541- Request::Burl { uri, is_last } => todo!(),
1542- Request::StartTls => todo!(),
1543- Request::Data => {
1544- tracing::info!("Client starting transfer");
1545- // FIXME: read messages here, likely need to wrap
1546- // Request in another enum and implement in the
1547- // decoder
1548- unimplemented!("fixme")
1549+ Ok(command) => {
1550+ if matches!(command.0, Request::Quit) {
1551+ finished = true;
1552+ }
1553+
1554+ match session.process(&command.0, command.1) {
1555+ Ok(resp) => {
1556+ tracing::debug!("Returning response: {:?}", resp);
1557+ framed.send(resp).await?;
1558 }
1559- Request::Rset => todo!(),
1560- Request::Quit => {
1561- framed
1562- .send(Response::new(221, 0, 0, 0, "Ciao!".to_string()))
1563- .await?;
1564- break 'outer;
1565+ Err(err) => {
1566+ tracing::warn!("Client error: {:?}", err);
1567+ framed.send(err).await?;
1568 }
1569- }
1570+ };
1571 }
1572 Err(err) => {
1573 tracing::warn!("Socket closed with error: {:?}", err)
1574 }
1575+ };
1576+
1577+ if finished {
1578+ break;
1579 }
1580 }
1581 tracing::info!("Connection closed");
1582 @@ -119,6 +74,7 @@ impl Server {
1583 tracing::info!("Mail server listening @ {}", self.addr);
1584 loop {
1585 let (socket, _) = listener.accept().await.unwrap();
1586+ // TODO: timeout
1587 if let Err(err) = self.process(socket).await {
1588 tracing::warn!("Client encountered an error: {:?}", err);
1589 }
1590 diff --git a/maitred/src/session.rs b/maitred/src/session.rs
1591new file mode 100644
1592index 0000000..44a50be
1593--- /dev/null
1594+++ b/maitred/src/session.rs
1595 @@ -0,0 +1,116 @@
1596+ use bytes::Bytes;
1597+ use mail_parser::{Addr, Message, MessageParser};
1598+ use melib::Address;
1599+ use smtp_proto::{Request, Response};
1600+ use url::Host;
1601+
1602+ use crate::error::Error;
1603+ use crate::transport::Command;
1604+
1605+ /// State of an active SMTP session
1606+ #[derive(Default)]
1607+ pub(crate) struct Session<'a> {
1608+ /// all previous commands excluding
1609+ pub history: Vec<Request<String>>,
1610+ /// message body
1611+ pub body: Option<Message<'a>>,
1612+ /// mailto address
1613+ pub mail_to: Option<Address>,
1614+ /// rcpt address
1615+ pub rcpt_to: Option<Address>,
1616+ pub hostname: Option<Host>,
1617+ }
1618+
1619+ impl Session<'_> {
1620+ pub fn reset(&mut self) {
1621+ self.body = None;
1622+ self.mail_to = None;
1623+ self.rcpt_to = None;
1624+ self.hostname = None;
1625+ }
1626+
1627+ /// Statefully process the SMTP command with optional data payload, any
1628+ /// error returned is passed back to the caller.
1629+ /// FIXME: Not at all reasonable yet
1630+ pub fn process(
1631+ &mut self,
1632+ req: &Request<String>,
1633+ data: Option<Bytes>,
1634+ ) -> Result<Response<String>, Response<String>> {
1635+ self.history.push(req.clone());
1636+ match req {
1637+ Request::Ehlo { host } => {
1638+ self.hostname = Some(
1639+ Host::parse(host).map_err(|e| Response::new(500, 0, 0, 0, e.to_string()))?,
1640+ );
1641+ Ok(Response::new(250, 0, 0, 0, format!("Hello {}", host)))
1642+ }
1643+ Request::Lhlo { host } => {
1644+ self.hostname = Some(
1645+ Host::parse(host).map_err(|e| Response::new(500, 0, 0, 0, e.to_string()))?,
1646+ );
1647+ Ok(Response::new(250, 0, 0, 0, format!("Hello {}", host)))
1648+ }
1649+ Request::Helo { host } => {
1650+ self.hostname = Some(
1651+ Host::parse(host).map_err(|e| Response::new(500, 0, 0, 0, e.to_string()))?,
1652+ );
1653+ Ok(Response::new(250, 0, 0, 0, format!("Hello {}", host)))
1654+ }
1655+ Request::Mail { from } => {
1656+ let mail_to = Address::try_from(from.address.as_str()).map_err(|e| {
1657+ Response::new(
1658+ 500,
1659+ 0,
1660+ 0,
1661+ 0,
1662+ format!("Cannot parse: {} {}", from.address, e),
1663+ )
1664+ })?;
1665+ self.mail_to = Some(mail_to.clone());
1666+ Ok(Response::new(250, 0, 0, 0, mail_to.to_string()))
1667+ }
1668+ Request::Rcpt { to } => {
1669+ let mail_to = Address::try_from(to.address.as_str()).map_err(|e| {
1670+ Response::new(500, 0, 0, 0, format!("Cannot parse: {} {}", to.address, e))
1671+ })?;
1672+ self.mail_to = Some(mail_to.clone());
1673+ Ok(Response::new(250, 0, 0, 0, mail_to.to_string()))
1674+ }
1675+ Request::Bdat {
1676+ chunk_size: _,
1677+ is_last: _,
1678+ } => {
1679+ let message_payload = data.expect("data returned without a payload").to_vec();
1680+ let parser = MessageParser::new();
1681+ let result = parser.parse(&message_payload);
1682+ tracing::info!("Parsed message successfully: {:?}", result);
1683+ Ok(Response::new(200, 0, 0, 0, "Message processed".to_string()))
1684+ }
1685+ Request::Auth {
1686+ mechanism,
1687+ initial_response,
1688+ } => todo!(),
1689+ Request::Noop { value } => todo!(),
1690+ Request::Vrfy { value } => todo!(),
1691+ Request::Expn { value } => todo!(),
1692+ Request::Help { value } => todo!(),
1693+ Request::Etrn { name } => todo!(),
1694+ Request::Atrn { domains } => todo!(),
1695+ Request::Burl { uri, is_last } => todo!(),
1696+ Request::StartTls => todo!(),
1697+ Request::Data => {
1698+ let message_payload = data.expect("data returned without a payload").to_vec();
1699+ let parser = MessageParser::new();
1700+ let result = parser.parse(&message_payload);
1701+ tracing::info!("Parsed message successfully: {:?}", result);
1702+ Ok(Response::new(200, 0, 0, 0, "Message processed".to_string()))
1703+ }
1704+ Request::Rset => {
1705+ self.reset();
1706+ Ok(Response::new(200, 0, 0, 0, "".to_string()))
1707+ }
1708+ Request::Quit => Ok(Response::new(221, 0, 0, 0, "Ciao!".to_string())),
1709+ }
1710+ }
1711+ }
1712 diff --git a/maitred/src/transport.rs b/maitred/src/transport.rs
1713index 6001ac8..fa2dabe 100644
1714--- a/maitred/src/transport.rs
1715+++ b/maitred/src/transport.rs
1716 @@ -1,7 +1,8 @@
1717- use std::io::Write;
1718+ use std::sync::Arc;
1719+ use std::{fmt::Display, io::Write};
1720
1721- use bytes::BytesMut;
1722- use smtp_proto::request::receiver::RequestReceiver;
1723+ use bytes::{Bytes, BytesMut};
1724+ use smtp_proto::request::receiver::{BdatReceiver, DataReceiver, RequestReceiver};
1725 pub use smtp_proto::{Request, Response};
1726 use tokio_util::codec::{Decoder, Encoder};
1727
1728 @@ -18,10 +19,26 @@ impl Write for Wrapper<'_> {
1729 }
1730 }
1731
1732+ pub(crate) enum Receiver {
1733+ Data(DataReceiver),
1734+ Bdat(BdatReceiver),
1735+ }
1736+
1737+ /// Command from the client with an optional attached payload.
1738+ pub(crate) struct Command(pub Request<String>, pub Option<Bytes>);
1739+
1740+ impl Display for Command {
1741+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1742+ write!(f, "{:?}", self.0)
1743+ }
1744+ }
1745+
1746 /// SMTP Transport
1747 #[derive(Default)]
1748- pub struct Transport {
1749+ pub(crate) struct Transport {
1750+ receiver: Option<Box<Receiver>>,
1751 prev: Option<Request<String>>,
1752+ buf: Vec<u8>,
1753 }
1754
1755 impl Encoder<Response<String>> for Transport {
1756 @@ -34,17 +51,79 @@ impl Encoder<Response<String>> for Transport {
1757 }
1758
1759 impl Decoder for Transport {
1760- type Item = Request<String>;
1761+ type Item = Command;
1762 type Error = crate::Error;
1763
1764 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1765 if src.is_empty() {
1766 return Ok(None);
1767 }
1768+ if let Some(rec) = self.receiver.as_mut() {
1769+ let chunk_size = src.len();
1770+ tracing::debug!("Reading {} bytes of data stream", chunk_size);
1771+ match rec.as_mut() {
1772+ Receiver::Data(data_receiver) => {
1773+ let chunk = src.split_to(src.len());
1774+ if data_receiver.ingest(&mut chunk.iter(), &mut self.buf) {
1775+ tracing::debug!("Finished parsing data stream");
1776+ let payload = Bytes::copy_from_slice(&self.buf);
1777+ self.buf.clear();
1778+ self.receiver = None;
1779+ return Ok(Some(Command(
1780+ self.prev
1781+ .as_ref()
1782+ .expect("missing previous command")
1783+ .clone(),
1784+ Some(payload),
1785+ )));
1786+ } else {
1787+ return Ok(None);
1788+ }
1789+ }
1790+ Receiver::Bdat(bdat_receiver) => {
1791+ let chunk = src.split_to(src.len());
1792+ if bdat_receiver.ingest(&mut chunk.iter(), &mut self.buf) {
1793+ tracing::debug!("Finished parsing data stream");
1794+ let payload = Bytes::copy_from_slice(&self.buf);
1795+ self.buf.clear();
1796+ self.receiver = None;
1797+ return Ok(Some(Command(
1798+ self.prev
1799+ .as_ref()
1800+ .expect("missing previous command")
1801+ .clone(),
1802+ Some(payload),
1803+ )));
1804+ } else {
1805+ return Ok(None);
1806+ }
1807+ }
1808+ }
1809+ };
1810+
1811 let mut r = RequestReceiver::default();
1812 let buf = src.split_to(src.len());
1813 let request = r.ingest(&mut buf.iter(), buf.to_vec().as_slice())?;
1814 self.prev = Some(request.clone());
1815- Ok(Some(request))
1816+ match request {
1817+ Request::Bdat {
1818+ chunk_size,
1819+ is_last,
1820+ } => {
1821+ tracing::info!("Starting binary data transfer");
1822+ self.receiver = Some(Box::new(Receiver::Bdat(BdatReceiver::new(
1823+ chunk_size, is_last,
1824+ ))));
1825+ self.buf.clear();
1826+ Ok(None)
1827+ }
1828+ Request::Data => {
1829+ tracing::info!("Starting data transfer");
1830+ self.receiver = Some(Box::new(Receiver::Data(DataReceiver::new())));
1831+ self.buf.clear();
1832+ Ok(None)
1833+ }
1834+ _ => Ok(Some(Command(request, None))),
1835+ }
1836 }
1837 }
1838 diff --git a/rfcs/rfc5321.txt b/rfcs/rfc5321.txt
1839new file mode 100644
1840index 0000000..4c33ddd
1841--- /dev/null
1842+++ b/rfcs/rfc5321.txt
1843 @@ -0,0 +1,5323 @@
1844+
1845+
1846+
1847+
1848+
1849+
1850+ Network Working Group J. Klensin
1851+ Request for Comments: 5321 October 2008
1852+ Obsoletes: 2821
1853+ Updates: 1123
1854+ Category: Standards Track
1855+
1856+
1857+ Simple Mail Transfer Protocol
1858+
1859+ Status of This Memo
1860+
1861+ This document specifies an Internet standards track protocol for the
1862+ Internet community, and requests discussion and suggestions for
1863+ improvements. Please refer to the current edition of the "Internet
1864+ Official Protocol Standards" (STD 1) for the standardization state
1865+ and status of this protocol. Distribution of this memo is unlimited.
1866+
1867+ Abstract
1868+
1869+ This document is a specification of the basic protocol for Internet
1870+ electronic mail transport. It consolidates, updates, and clarifies
1871+ several previous documents, making all or parts of most of them
1872+ obsolete. It covers the SMTP extension mechanisms and best practices
1873+ for the contemporary Internet, but does not provide details about
1874+ particular extensions. Although SMTP was designed as a mail
1875+ transport and delivery protocol, this specification also contains
1876+ information that is important to its use as a "mail submission"
1877+ protocol for "split-UA" (User Agent) mail reading systems and mobile
1878+ environments.
1879+
1880+
1881+
1882+
1883+
1884+
1885+
1886+
1887+
1888+
1889+
1890+
1891+
1892+
1893+
1894+
1895+
1896+
1897+
1898+
1899+
1900+
1901+ Klensin Standards Track [Page 1]
1902+
1903+ RFC 5321 SMTP October 2008
1904+
1905+
1906+ Table of Contents
1907+
1908+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
1909+ 1.1. Transport of Electronic Mail . . . . . . . . . . . . . . . 5
1910+ 1.2. History and Context for This Document . . . . . . . . . . 5
1911+ 1.3. Document Conventions . . . . . . . . . . . . . . . . . . . 6
1912+ 2. The SMTP Model . . . . . . . . . . . . . . . . . . . . . . . . 7
1913+ 2.1. Basic Structure . . . . . . . . . . . . . . . . . . . . . 7
1914+ 2.2. The Extension Model . . . . . . . . . . . . . . . . . . . 9
1915+ 2.2.1. Background . . . . . . . . . . . . . . . . . . . . . . 9
1916+ 2.2.2. Definition and Registration of Extensions . . . . . . 10
1917+ 2.2.3. Special Issues with Extensions . . . . . . . . . . . . 11
1918+ 2.3. SMTP Terminology . . . . . . . . . . . . . . . . . . . . . 11
1919+ 2.3.1. Mail Objects . . . . . . . . . . . . . . . . . . . . . 11
1920+ 2.3.2. Senders and Receivers . . . . . . . . . . . . . . . . 12
1921+ 2.3.3. Mail Agents and Message Stores . . . . . . . . . . . . 12
1922+ 2.3.4. Host . . . . . . . . . . . . . . . . . . . . . . . . . 13
1923+ 2.3.5. Domain Names . . . . . . . . . . . . . . . . . . . . . 13
1924+ 2.3.6. Buffer and State Table . . . . . . . . . . . . . . . . 14
1925+ 2.3.7. Commands and Replies . . . . . . . . . . . . . . . . . 14
1926+ 2.3.8. Lines . . . . . . . . . . . . . . . . . . . . . . . . 14
1927+ 2.3.9. Message Content and Mail Data . . . . . . . . . . . . 15
1928+ 2.3.10. Originator, Delivery, Relay, and Gateway Systems . . . 15
1929+ 2.3.11. Mailbox and Address . . . . . . . . . . . . . . . . . 15
1930+ 2.4. General Syntax Principles and Transaction Model . . . . . 16
1931+ 3. The SMTP Procedures: An Overview . . . . . . . . . . . . . . . 17
1932+ 3.1. Session Initiation . . . . . . . . . . . . . . . . . . . . 18
1933+ 3.2. Client Initiation . . . . . . . . . . . . . . . . . . . . 18
1934+ 3.3. Mail Transactions . . . . . . . . . . . . . . . . . . . . 19
1935+ 3.4. Forwarding for Address Correction or Updating . . . . . . 21
1936+ 3.5. Commands for Debugging Addresses . . . . . . . . . . . . . 22
1937+ 3.5.1. Overview . . . . . . . . . . . . . . . . . . . . . . . 22
1938+ 3.5.2. VRFY Normal Response . . . . . . . . . . . . . . . . . 24
1939+ 3.5.3. Meaning of VRFY or EXPN Success Response . . . . . . . 25
1940+ 3.5.4. Semantics and Applications of EXPN . . . . . . . . . . 26
1941+ 3.6. Relaying and Mail Routing . . . . . . . . . . . . . . . . 26
1942+ 3.6.1. Source Routes and Relaying . . . . . . . . . . . . . . 26
1943+ 3.6.2. Mail eXchange Records and Relaying . . . . . . . . . . 26
1944+ 3.6.3. Message Submission Servers as Relays . . . . . . . . . 27
1945+ 3.7. Mail Gatewaying . . . . . . . . . . . . . . . . . . . . . 28
1946+ 3.7.1. Header Fields in Gatewaying . . . . . . . . . . . . . 28
1947+ 3.7.2. Received Lines in Gatewaying . . . . . . . . . . . . . 29
1948+ 3.7.3. Addresses in Gatewaying . . . . . . . . . . . . . . . 29
1949+ 3.7.4. Other Header Fields in Gatewaying . . . . . . . . . . 29
1950+ 3.7.5. Envelopes in Gatewaying . . . . . . . . . . . . . . . 30
1951+ 3.8. Terminating Sessions and Connections . . . . . . . . . . . 30
1952+ 3.9. Mailing Lists and Aliases . . . . . . . . . . . . . . . . 31
1953+ 3.9.1. Alias . . . . . . . . . . . . . . . . . . . . . . . . 31
1954+
1955+
1956+
1957+ Klensin Standards Track [Page 2]
1958+
1959+ RFC 5321 SMTP October 2008
1960+
1961+
1962+ 3.9.2. List . . . . . . . . . . . . . . . . . . . . . . . . . 31
1963+ 4. The SMTP Specifications . . . . . . . . . . . . . . . . . . . 32
1964+ 4.1. SMTP Commands . . . . . . . . . . . . . . . . . . . . . . 32
1965+ 4.1.1. Command Semantics and Syntax . . . . . . . . . . . . . 32
1966+ 4.1.2. Command Argument Syntax . . . . . . . . . . . . . . . 41
1967+ 4.1.3. Address Literals . . . . . . . . . . . . . . . . . . . 43
1968+ 4.1.4. Order of Commands . . . . . . . . . . . . . . . . . . 44
1969+ 4.1.5. Private-Use Commands . . . . . . . . . . . . . . . . . 46
1970+ 4.2. SMTP Replies . . . . . . . . . . . . . . . . . . . . . . . 46
1971+ 4.2.1. Reply Code Severities and Theory . . . . . . . . . . . 48
1972+ 4.2.2. Reply Codes by Function Groups . . . . . . . . . . . . 50
1973+ 4.2.3. Reply Codes in Numeric Order . . . . . . . . . . . . . 52
1974+ 4.2.4. Reply Code 502 . . . . . . . . . . . . . . . . . . . . 53
1975+ 4.2.5. Reply Codes after DATA and the Subsequent
1976+ <CRLF>.<CRLF> . . . . . . . . . . . . . . . . . . . . 53
1977+ 4.3. Sequencing of Commands and Replies . . . . . . . . . . . . 54
1978+ 4.3.1. Sequencing Overview . . . . . . . . . . . . . . . . . 54
1979+ 4.3.2. Command-Reply Sequences . . . . . . . . . . . . . . . 55
1980+ 4.4. Trace Information . . . . . . . . . . . . . . . . . . . . 57
1981+ 4.5. Additional Implementation Issues . . . . . . . . . . . . . 61
1982+ 4.5.1. Minimum Implementation . . . . . . . . . . . . . . . . 61
1983+ 4.5.2. Transparency . . . . . . . . . . . . . . . . . . . . . 62
1984+ 4.5.3. Sizes and Timeouts . . . . . . . . . . . . . . . . . . 62
1985+ 4.5.3.1. Size Limits and Minimums . . . . . . . . . . . . . 62
1986+ 4.5.3.1.1. Local-part . . . . . . . . . . . . . . . . . . 63
1987+ 4.5.3.1.2. Domain . . . . . . . . . . . . . . . . . . . . 63
1988+ 4.5.3.1.3. Path . . . . . . . . . . . . . . . . . . . . . 63
1989+ 4.5.3.1.4. Command Line . . . . . . . . . . . . . . . . . 63
1990+ 4.5.3.1.5. Reply Line . . . . . . . . . . . . . . . . . . 63
1991+ 4.5.3.1.6. Text Line . . . . . . . . . . . . . . . . . . 63
1992+ 4.5.3.1.7. Message Content . . . . . . . . . . . . . . . 63
1993+ 4.5.3.1.8. Recipients Buffer . . . . . . . . . . . . . . 64
1994+ 4.5.3.1.9. Treatment When Limits Exceeded . . . . . . . . 64
1995+ 4.5.3.1.10. Too Many Recipients Code . . . . . . . . . . . 64
1996+ 4.5.3.2. Timeouts . . . . . . . . . . . . . . . . . . . . . 65
1997+ 4.5.3.2.1. Initial 220 Message: 5 Minutes . . . . . . . . 65
1998+ 4.5.3.2.2. MAIL Command: 5 Minutes . . . . . . . . . . . 65
1999+ 4.5.3.2.3. RCPT Command: 5 Minutes . . . . . . . . . . . 65
2000+ 4.5.3.2.4. DATA Initiation: 2 Minutes . . . . . . . . . . 66
2001+ 4.5.3.2.5. Data Block: 3 Minutes . . . . . . . . . . . . 66
2002+ 4.5.3.2.6. DATA Termination: 10 Minutes. . . . . . . . . 66
2003+ 4.5.3.2.7. Server Timeout: 5 Minutes. . . . . . . . . . . 66
2004+ 4.5.4. Retry Strategies . . . . . . . . . . . . . . . . . . . 66
2005+ 4.5.5. Messages with a Null Reverse-Path . . . . . . . . . . 68
2006+ 5. Address Resolution and Mail Handling . . . . . . . . . . . . . 69
2007+ 5.1. Locating the Target Host . . . . . . . . . . . . . . . . . 69
2008+ 5.2. IPv6 and MX Records . . . . . . . . . . . . . . . . . . . 71
2009+ 6. Problem Detection and Handling . . . . . . . . . . . . . . . . 71
2010+
2011+
2012+
2013+ Klensin Standards Track [Page 3]
2014+
2015+ RFC 5321 SMTP October 2008
2016+
2017+
2018+ 6.1. Reliable Delivery and Replies by Email . . . . . . . . . . 71
2019+ 6.2. Unwanted, Unsolicited, and "Attack" Messages . . . . . . . 72
2020+ 6.3. Loop Detection . . . . . . . . . . . . . . . . . . . . . . 73
2021+ 6.4. Compensating for Irregularities . . . . . . . . . . . . . 73
2022+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 75
2023+ 7.1. Mail Security and Spoofing . . . . . . . . . . . . . . . . 75
2024+ 7.2. "Blind" Copies . . . . . . . . . . . . . . . . . . . . . . 76
2025+ 7.3. VRFY, EXPN, and Security . . . . . . . . . . . . . . . . . 76
2026+ 7.4. Mail Rerouting Based on the 251 and 551 Response Codes . . 77
2027+ 7.5. Information Disclosure in Announcements . . . . . . . . . 77
2028+ 7.6. Information Disclosure in Trace Fields . . . . . . . . . . 78
2029+ 7.7. Information Disclosure in Message Forwarding . . . . . . . 78
2030+ 7.8. Resistance to Attacks . . . . . . . . . . . . . . . . . . 78
2031+ 7.9. Scope of Operation of SMTP Servers . . . . . . . . . . . . 78
2032+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 79
2033+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 80
2034+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 81
2035+ 10.1. Normative References . . . . . . . . . . . . . . . . . . . 81
2036+ 10.2. Informative References . . . . . . . . . . . . . . . . . . 82
2037+ Appendix A. TCP Transport Service . . . . . . . . . . . . . . . . 85
2038+ Appendix B. Generating SMTP Commands from RFC 822 Header
2039+ Fields . . . . . . . . . . . . . . . . . . . . . . . 85
2040+ Appendix C. Source Routes . . . . . . . . . . . . . . . . . . . . 86
2041+ Appendix D. Scenarios . . . . . . . . . . . . . . . . . . . . . . 87
2042+ D.1. A Typical SMTP Transaction Scenario . . . . . . . . . . . 88
2043+ D.2. Aborted SMTP Transaction Scenario . . . . . . . . . . . . 89
2044+ D.3. Relayed Mail Scenario . . . . . . . . . . . . . . . . . . 90
2045+ D.4. Verifying and Sending Scenario . . . . . . . . . . . . . . 92
2046+ Appendix E. Other Gateway Issues . . . . . . . . . . . . . . . . 92
2047+ Appendix F. Deprecated Features of RFC 821 . . . . . . . . . . . 93
2048+ F.1. TURN . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
2049+ F.2. Source Routing . . . . . . . . . . . . . . . . . . . . . . 93
2050+ F.3. HELO . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
2051+ F.4. #-literals . . . . . . . . . . . . . . . . . . . . . . . . 94
2052+ F.5. Dates and Years . . . . . . . . . . . . . . . . . . . . . 94
2053+ F.6. Sending versus Mailing . . . . . . . . . . . . . . . . . . 94
2054+
2055+
2056+
2057+
2058+
2059+
2060+
2061+
2062+
2063+
2064+
2065+
2066+
2067+
2068+
2069+ Klensin Standards Track [Page 4]
2070+
2071+ RFC 5321 SMTP October 2008
2072+
2073+
2074+ 1. Introduction
2075+
2076+ 1.1. Transport of Electronic Mail
2077+
2078+ The objective of the Simple Mail Transfer Protocol (SMTP) is to
2079+ transfer mail reliably and efficiently.
2080+
2081+ SMTP is independent of the particular transmission subsystem and
2082+ requires only a reliable ordered data stream channel. While this
2083+ document specifically discusses transport over TCP, other transports
2084+ are possible. Appendices to RFC 821 [1] describe some of them.
2085+
2086+ An important feature of SMTP is its capability to transport mail
2087+ across multiple networks, usually referred to as "SMTP mail relaying"
2088+ (see Section 3.6). A network consists of the mutually-TCP-accessible
2089+ hosts on the public Internet, the mutually-TCP-accessible hosts on a
2090+ firewall-isolated TCP/IP Intranet, or hosts in some other LAN or WAN
2091+ environment utilizing a non-TCP transport-level protocol. Using
2092+ SMTP, a process can transfer mail to another process on the same
2093+ network or to some other network via a relay or gateway process
2094+ accessible to both networks.
2095+
2096+ In this way, a mail message may pass through a number of intermediate
2097+ relay or gateway hosts on its path from sender to ultimate recipient.
2098+ The Mail eXchanger mechanisms of the domain name system (RFC 1035
2099+ [2], RFC 974 [12], and Section 5 of this document) are used to
2100+ identify the appropriate next-hop destination for a message being
2101+ transported.
2102+
2103+ 1.2. History and Context for This Document
2104+
2105+ This document is a specification of the basic protocol for the
2106+ Internet electronic mail transport. It consolidates, updates and
2107+ clarifies, but does not add new or change existing functionality of
2108+ the following:
2109+
2110+ o the original SMTP (Simple Mail Transfer Protocol) specification of
2111+ RFC 821 [1],
2112+
2113+ o domain name system requirements and implications for mail
2114+ transport from RFC 1035 [2] and RFC 974 [12],
2115+
2116+ o the clarifications and applicability statements in RFC 1123 [3],
2117+ and
2118+
2119+ o material drawn from the SMTP Extension mechanisms in RFC 1869
2120+ [13].
2121+
2122+
2123+
2124+
2125+ Klensin Standards Track [Page 5]
2126+
2127+ RFC 5321 SMTP October 2008
2128+
2129+
2130+ o Editorial and clarification changes to RFC 2821 [14] to bring that
2131+ specification to Draft Standard.
2132+
2133+ It obsoletes RFC 821, RFC 974, RFC 1869, and RFC 2821 and updates RFC
2134+ 1123 (replacing the mail transport materials of RFC 1123). However,
2135+ RFC 821 specifies some features that were not in significant use in
2136+ the Internet by the mid-1990s and (in appendices) some additional
2137+ transport models. Those sections are omitted here in the interest of
2138+ clarity and brevity; readers needing them should refer to RFC 821.
2139+
2140+ It also includes some additional material from RFC 1123 that required
2141+ amplification. This material has been identified in multiple ways,
2142+ mostly by tracking flaming on various lists and newsgroups and
2143+ problems of unusual readings or interpretations that have appeared as
2144+ the SMTP extensions have been deployed. Where this specification
2145+ moves beyond consolidation and actually differs from earlier
2146+ documents, it supersedes them technically as well as textually.
2147+
2148+ Although SMTP was designed as a mail transport and delivery protocol,
2149+ this specification also contains information that is important to its
2150+ use as a "mail submission" protocol, as recommended for Post Office
2151+ Protocol (POP) (RFC 937 [15], RFC 1939 [16]) and IMAP (RFC 3501
2152+ [17]). In general, the separate mail submission protocol specified
2153+ in RFC 4409 [18] is now preferred to direct use of SMTP; more
2154+ discussion of that subject appears in that document.
2155+
2156+ Section 2.3 provides definitions of terms specific to this document.
2157+ Except when the historical terminology is necessary for clarity, this
2158+ document uses the current 'client' and 'server' terminology to
2159+ identify the sending and receiving SMTP processes, respectively.
2160+
2161+ A companion document, RFC 5322 [4], discusses message header sections
2162+ and bodies and specifies formats and structures for them.
2163+
2164+ 1.3. Document Conventions
2165+
2166+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
2167+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
2168+ document are to be interpreted as described in RFC 2119 [5]. As each
2169+ of these terms was intentionally and carefully chosen to improve the
2170+ interoperability of email, each use of these terms is to be treated
2171+ as a conformance requirement.
2172+
2173+ Because this document has a long history and to avoid the risk of
2174+ various errors and of confusing readers and documents that point to
2175+ this one, most examples and the domain names they contain are
2176+ preserved from RFC 2821. Readers are cautioned that these are
2177+
2178+
2179+
2180+
2181+ Klensin Standards Track [Page 6]
2182+
2183+ RFC 5321 SMTP October 2008
2184+
2185+
2186+ illustrative examples that should not actually be used in either code
2187+ or configuration files.
2188+
2189+ 2. The SMTP Model
2190+
2191+ 2.1. Basic Structure
2192+
2193+ The SMTP design can be pictured as:
2194+
2195+ +----------+ +----------+
2196+ +------+ | | | |
2197+ | User |<-->| | SMTP | |
2198+ +------+ | Client- |Commands/Replies| Server- |
2199+ +------+ | SMTP |<-------------->| SMTP | +------+
2200+ | File |<-->| | and Mail | |<-->| File |
2201+ |System| | | | | |System|
2202+ +------+ +----------+ +----------+ +------+
2203+ SMTP client SMTP server
2204+
2205+ When an SMTP client has a message to transmit, it establishes a two-
2206+ way transmission channel to an SMTP server. The responsibility of an
2207+ SMTP client is to transfer mail messages to one or more SMTP servers,
2208+ or report its failure to do so.
2209+
2210+ The means by which a mail message is presented to an SMTP client, and
2211+ how that client determines the identifier(s) ("names") of the
2212+ domain(s) to which mail messages are to be transferred, is a local
2213+ matter, and is not addressed by this document. In some cases, the
2214+ designated domain(s), or those determined by an SMTP client, will
2215+ identify the final destination(s) of the mail message. In other
2216+ cases, common with SMTP clients associated with implementations of
2217+ the POP (RFC 937 [15], RFC 1939 [16]) or IMAP (RFC 3501 [17])
2218+ protocols, or when the SMTP client is inside an isolated transport
2219+ service environment, the domain determined will identify an
2220+ intermediate destination through which all mail messages are to be
2221+ relayed. SMTP clients that transfer all traffic regardless of the
2222+ target domains associated with the individual messages, or that do
2223+ not maintain queues for retrying message transmissions that initially
2224+ cannot be completed, may otherwise conform to this specification but
2225+ are not considered fully-capable. Fully-capable SMTP
2226+ implementations, including the relays used by these less capable
2227+ ones, and their destinations, are expected to support all of the
2228+ queuing, retrying, and alternate address functions discussed in this
2229+ specification. In many situations and configurations, the less-
2230+ capable clients discussed above SHOULD be using the message
2231+ submission protocol (RFC 4409 [18]) rather than SMTP.
2232+
2233+
2234+
2235+
2236+
2237+ Klensin Standards Track [Page 7]
2238+
2239+ RFC 5321 SMTP October 2008
2240+
2241+
2242+ The means by which an SMTP client, once it has determined a target
2243+ domain, determines the identity of an SMTP server to which a copy of
2244+ a message is to be transferred, and then performs that transfer, is
2245+ covered by this document. To effect a mail transfer to an SMTP
2246+ server, an SMTP client establishes a two-way transmission channel to
2247+ that SMTP server. An SMTP client determines the address of an
2248+ appropriate host running an SMTP server by resolving a destination
2249+ domain name to either an intermediate Mail eXchanger host or a final
2250+ target host.
2251+
2252+ An SMTP server may be either the ultimate destination or an
2253+ intermediate "relay" (that is, it may assume the role of an SMTP
2254+ client after receiving the message) or "gateway" (that is, it may
2255+ transport the message further using some protocol other than SMTP).
2256+ SMTP commands are generated by the SMTP client and sent to the SMTP
2257+ server. SMTP replies are sent from the SMTP server to the SMTP
2258+ client in response to the commands.
2259+
2260+ In other words, message transfer can occur in a single connection
2261+ between the original SMTP-sender and the final SMTP-recipient, or can
2262+ occur in a series of hops through intermediary systems. In either
2263+ case, once the server has issued a success response at the end of the
2264+ mail data, a formal handoff of responsibility for the message occurs:
2265+ the protocol requires that a server MUST accept responsibility for
2266+ either delivering the message or properly reporting the failure to do
2267+ so (see Sections 6.1, 6.2, and 7.8, below).
2268+
2269+ Once the transmission channel is established and initial handshaking
2270+ is completed, the SMTP client normally initiates a mail transaction.
2271+ Such a transaction consists of a series of commands to specify the
2272+ originator and destination of the mail and transmission of the
2273+ message content (including any lines in the header section or other
2274+ structure) itself. When the same message is sent to multiple
2275+ recipients, this protocol encourages the transmission of only one
2276+ copy of the data for all recipients at the same destination (or
2277+ intermediate relay) host.
2278+
2279+ The server responds to each command with a reply; replies may
2280+ indicate that the command was accepted, that additional commands are
2281+ expected, or that a temporary or permanent error condition exists.
2282+ Commands specifying the sender or recipients may include server-
2283+ permitted SMTP service extension requests, as discussed in
2284+ Section 2.2. The dialog is purposely lock-step, one-at-a-time,
2285+ although this can be modified by mutually agreed upon extension
2286+ requests such as command pipelining (RFC 2920 [19]).
2287+
2288+ Once a given mail message has been transmitted, the client may either
2289+ request that the connection be shut down or may initiate other mail
2290+
2291+
2292+
2293+ Klensin Standards Track [Page 8]
2294+
2295+ RFC 5321 SMTP October 2008
2296+
2297+
2298+ transactions. In addition, an SMTP client may use a connection to an
2299+ SMTP server for ancillary services such as verification of email
2300+ addresses or retrieval of mailing list subscriber addresses.
2301+
2302+ As suggested above, this protocol provides mechanisms for the
2303+ transmission of mail. Historically, this transmission normally
2304+ occurred directly from the sending user's host to the receiving
2305+ user's host when the two hosts are connected to the same transport
2306+ service. When they are not connected to the same transport service,
2307+ transmission occurs via one or more relay SMTP servers. A very
2308+ common case in the Internet today involves submission of the original
2309+ message to an intermediate, "message submission" server, which is
2310+ similar to a relay but has some additional properties; such servers
2311+ are discussed in Section 2.3.10 and at some length in RFC 4409 [18].
2312+ An intermediate host that acts as either an SMTP relay or as a
2313+ gateway into some other transmission environment is usually selected
2314+ through the use of the domain name service (DNS) Mail eXchanger
2315+ mechanism.
2316+
2317+ Usually, intermediate hosts are determined via the DNS MX record, not
2318+ by explicit "source" routing (see Section 5 and Appendix C and
2319+ Appendix F.2).
2320+
2321+ 2.2. The Extension Model
2322+
2323+ 2.2.1. Background
2324+
2325+ In an effort that started in 1990, approximately a decade after RFC
2326+ 821 was completed, the protocol was modified with a "service
2327+ extensions" model that permits the client and server to agree to
2328+ utilize shared functionality beyond the original SMTP requirements.
2329+ The SMTP extension mechanism defines a means whereby an extended SMTP
2330+ client and server may recognize each other, and the server can inform
2331+ the client as to the service extensions that it supports.
2332+
2333+ Contemporary SMTP implementations MUST support the basic extension
2334+ mechanisms. For instance, servers MUST support the EHLO command even
2335+ if they do not implement any specific extensions and clients SHOULD
2336+ preferentially utilize EHLO rather than HELO. (However, for
2337+ compatibility with older conforming implementations, SMTP clients and
2338+ servers MUST support the original HELO mechanisms as a fallback.)
2339+ Unless the different characteristics of HELO must be identified for
2340+ interoperability purposes, this document discusses only EHLO.
2341+
2342+ SMTP is widely deployed and high-quality implementations have proven
2343+ to be very robust. However, the Internet community now considers
2344+ some services to be important that were not anticipated when the
2345+ protocol was first designed. If support for those services is to be
2346+
2347+
2348+
2349+ Klensin Standards Track [Page 9]
2350+
2351+ RFC 5321 SMTP October 2008
2352+
2353+
2354+ added, it must be done in a way that permits older implementations to
2355+ continue working acceptably. The extension framework consists of:
2356+
2357+ o The SMTP command EHLO, superseding the earlier HELO,
2358+
2359+ o a registry of SMTP service extensions,
2360+
2361+ o additional parameters to the SMTP MAIL and RCPT commands, and
2362+
2363+ o optional replacements for commands defined in this protocol, such
2364+ as for DATA in non-ASCII transmissions (RFC 3030 [20]).
2365+
2366+ SMTP's strength comes primarily from its simplicity. Experience with
2367+ many protocols has shown that protocols with few options tend towards
2368+ ubiquity, whereas protocols with many options tend towards obscurity.
2369+
2370+ Each and every extension, regardless of its benefits, must be
2371+ carefully scrutinized with respect to its implementation, deployment,
2372+ and interoperability costs. In many cases, the cost of extending the
2373+ SMTP service will likely outweigh the benefit.
2374+
2375+ 2.2.2. Definition and Registration of Extensions
2376+
2377+ The IANA maintains a registry of SMTP service extensions. A
2378+ corresponding EHLO keyword value is associated with each extension.
2379+ Each service extension registered with the IANA must be defined in a
2380+ formal Standards-Track or IESG-approved Experimental protocol
2381+ document. The definition must include:
2382+
2383+ o the textual name of the SMTP service extension;
2384+
2385+ o the EHLO keyword value associated with the extension;
2386+
2387+ o the syntax and possible values of parameters associated with the
2388+ EHLO keyword value;
2389+
2390+ o any additional SMTP verbs associated with the extension
2391+ (additional verbs will usually be, but are not required to be, the
2392+ same as the EHLO keyword value);
2393+
2394+ o any new parameters the extension associates with the MAIL or RCPT
2395+ verbs;
2396+
2397+ o a description of how support for the extension affects the
2398+ behavior of a server and client SMTP; and
2399+
2400+
2401+
2402+
2403+
2404+
2405+ Klensin Standards Track [Page 10]
2406+
2407+ RFC 5321 SMTP October 2008
2408+
2409+
2410+ o the increment by which the extension is increasing the maximum
2411+ length of the commands MAIL and/or RCPT, over that specified in
2412+ this Standard.
2413+
2414+ In addition, any EHLO keyword value starting with an upper or lower
2415+ case "X" refers to a local SMTP service extension used exclusively
2416+ through bilateral agreement. Keywords beginning with "X" MUST NOT be
2417+ used in a registered service extension. Conversely, keyword values
2418+ presented in the EHLO response that do not begin with "X" MUST
2419+ correspond to a Standard, Standards-Track, or IESG-approved
2420+ Experimental SMTP service extension registered with IANA. A
2421+ conforming server MUST NOT offer non-"X"-prefixed keyword values that
2422+ are not described in a registered extension.
2423+
2424+ Additional verbs and parameter names are bound by the same rules as
2425+ EHLO keywords; specifically, verbs beginning with "X" are local
2426+ extensions that may not be registered or standardized. Conversely,
2427+ verbs not beginning with "X" must always be registered.
2428+
2429+ 2.2.3. Special Issues with Extensions
2430+
2431+ Extensions that change fairly basic properties of SMTP operation are
2432+ permitted. The text in other sections of this document must be
2433+ understood in that context. In particular, extensions can change the
2434+ minimum limits specified in Section 4.5.3, can change the ASCII
2435+ character set requirement as mentioned above, or can introduce some
2436+ optional modes of message handling.
2437+
2438+ In particular, if an extension implies that the delivery path
2439+ normally supports special features of that extension, and an
2440+ intermediate SMTP system finds a next hop that does not support the
2441+ required extension, it MAY choose, based on the specific extension
2442+ and circumstances, to requeue the message and try later and/or try an
2443+ alternate MX host. If this strategy is employed, the timeout to fall
2444+ back to an unextended format (if one is available) SHOULD be less
2445+ than the normal timeout for bouncing as undeliverable (e.g., if
2446+ normal timeout is three days, the requeue timeout before attempting
2447+ to transmit the mail without the extension might be one day).
2448+
2449+ 2.3. SMTP Terminology
2450+
2451+ 2.3.1. Mail Objects
2452+
2453+ SMTP transports a mail object. A mail object contains an envelope
2454+ and content.
2455+
2456+ The SMTP envelope is sent as a series of SMTP protocol units
2457+ (described in Section 3). It consists of an originator address (to
2458+
2459+
2460+
2461+ Klensin Standards Track [Page 11]
2462+
2463+ RFC 5321 SMTP October 2008
2464+
2465+
2466+ which error reports should be directed), one or more recipient
2467+ addresses, and optional protocol extension material. Historically,
2468+ variations on the reverse-path (originator) address specification
2469+ command (MAIL) could be used to specify alternate delivery modes,
2470+ such as immediate display; those variations have now been deprecated
2471+ (see Appendix F and Appendix F.6).
2472+
2473+ The SMTP content is sent in the SMTP DATA protocol unit and has two
2474+ parts: the header section and the body. If the content conforms to
2475+ other contemporary standards, the header section consists of a
2476+ collection of header fields, each consisting of a header name, a
2477+ colon, and data, structured as in the message format specification
2478+ (RFC 5322 [4]); the body, if structured, is defined according to MIME
2479+ (RFC 2045 [21]). The content is textual in nature, expressed using
2480+ the US-ASCII repertoire [6]. Although SMTP extensions (such as
2481+ "8BITMIME", RFC 1652 [22]) may relax this restriction for the content
2482+ body, the content header fields are always encoded using the US-ASCII
2483+ repertoire. Two MIME extensions (RFC 2047 [23] and RFC 2231 [24])
2484+ define an algorithm for representing header values outside the US-
2485+ ASCII repertoire, while still encoding them using the US-ASCII
2486+ repertoire.
2487+
2488+ 2.3.2. Senders and Receivers
2489+
2490+ In RFC 821, the two hosts participating in an SMTP transaction were
2491+ described as the "SMTP-sender" and "SMTP-receiver". This document
2492+ has been changed to reflect current industry terminology and hence
2493+ refers to them as the "SMTP client" (or sometimes just "the client")
2494+ and "SMTP server" (or just "the server"), respectively. Since a
2495+ given host may act both as server and client in a relay situation,
2496+ "receiver" and "sender" terminology is still used where needed for
2497+ clarity.
2498+
2499+ 2.3.3. Mail Agents and Message Stores
2500+
2501+ Additional mail system terminology became common after RFC 821 was
2502+ published and, where convenient, is used in this specification. In
2503+ particular, SMTP servers and clients provide a mail transport service
2504+ and therefore act as "Mail Transfer Agents" (MTAs). "Mail User
2505+ Agents" (MUAs or UAs) are normally thought of as the sources and
2506+ targets of mail. At the source, an MUA might collect mail to be
2507+ transmitted from a user and hand it off to an MTA; the final
2508+ ("delivery") MTA would be thought of as handing the mail off to an
2509+ MUA (or at least transferring responsibility to it, e.g., by
2510+ depositing the message in a "message store"). However, while these
2511+ terms are used with at least the appearance of great precision in
2512+ other environments, the implied boundaries between MUAs and MTAs
2513+ often do not accurately match common, and conforming, practices with
2514+
2515+
2516+
2517+ Klensin Standards Track [Page 12]
2518+
2519+ RFC 5321 SMTP October 2008
2520+
2521+
2522+ Internet mail. Hence, the reader should be cautious about inferring
2523+ the strong relationships and responsibilities that might be implied
2524+ if these terms were used elsewhere.
2525+
2526+ 2.3.4. Host
2527+
2528+ For the purposes of this specification, a host is a computer system
2529+ attached to the Internet (or, in some cases, to a private TCP/IP
2530+ network) and supporting the SMTP protocol. Hosts are known by names
2531+ (see the next section); they SHOULD NOT be identified by numerical
2532+ addresses, i.e., by address literals as described in Section 4.1.2.
2533+
2534+ 2.3.5. Domain Names
2535+
2536+ A domain name (or often just a "domain") consists of one or more
2537+ components, separated by dots if more than one appears. In the case
2538+ of a top-level domain used by itself in an email address, a single
2539+ string is used without any dots. This makes the requirement,
2540+ described in more detail below, that only fully-qualified domain
2541+ names appear in SMTP transactions on the public Internet,
2542+ particularly important where top-level domains are involved. These
2543+ components ("labels" in DNS terminology, RFC 1035 [2]) are restricted
2544+ for SMTP purposes to consist of a sequence of letters, digits, and
2545+ hyphens drawn from the ASCII character set [6]. Domain names are
2546+ used as names of hosts and of other entities in the domain name
2547+ hierarchy. For example, a domain may refer to an alias (label of a
2548+ CNAME RR) or the label of Mail eXchanger records to be used to
2549+ deliver mail instead of representing a host name. See RFC 1035 [2]
2550+ and Section 5 of this specification.
2551+
2552+ The domain name, as described in this document and in RFC 1035 [2],
2553+ is the entire, fully-qualified name (often referred to as an "FQDN").
2554+ A domain name that is not in FQDN form is no more than a local alias.
2555+ Local aliases MUST NOT appear in any SMTP transaction.
2556+
2557+ Only resolvable, fully-qualified domain names (FQDNs) are permitted
2558+ when domain names are used in SMTP. In other words, names that can
2559+ be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
2560+ in Section 5) are permitted, as are CNAME RRs whose targets can be
2561+ resolved, in turn, to MX or address RRs. Local nicknames or
2562+ unqualified names MUST NOT be used. There are two exceptions to the
2563+ rule requiring FQDNs:
2564+
2565+ o The domain name given in the EHLO command MUST be either a primary
2566+ host name (a domain name that resolves to an address RR) or, if
2567+ the host has no name, an address literal, as described in
2568+ Section 4.1.3 and discussed further in the EHLO discussion of
2569+ Section 4.1.4.
2570+
2571+
2572+
2573+ Klensin Standards Track [Page 13]
2574+
2575+ RFC 5321 SMTP October 2008
2576+
2577+
2578+ o The reserved mailbox name "postmaster" may be used in a RCPT
2579+ command without domain qualification (see Section 4.1.1.3) and
2580+ MUST be accepted if so used.
2581+
2582+ 2.3.6. Buffer and State Table
2583+
2584+ SMTP sessions are stateful, with both parties carefully maintaining a
2585+ common view of the current state. In this document, we model this
2586+ state by a virtual "buffer" and a "state table" on the server that
2587+ may be used by the client to, for example, "clear the buffer" or
2588+ "reset the state table", causing the information in the buffer to be
2589+ discarded and the state to be returned to some previous state.
2590+
2591+ 2.3.7. Commands and Replies
2592+
2593+ SMTP commands and, unless altered by a service extension, message
2594+ data, are transmitted from the sender to the receiver via the
2595+ transmission channel in "lines".
2596+
2597+ An SMTP reply is an acknowledgment (positive or negative) sent in
2598+ "lines" from receiver to sender via the transmission channel in
2599+ response to a command. The general form of a reply is a numeric
2600+ completion code (indicating failure or success) usually followed by a
2601+ text string. The codes are for use by programs and the text is
2602+ usually intended for human users. RFC 3463 [25], specifies further
2603+ structuring of the reply strings, including the use of supplemental
2604+ and more specific completion codes (see also RFC 5248 [26]).
2605+
2606+ 2.3.8. Lines
2607+
2608+ Lines consist of zero or more data characters terminated by the
2609+ sequence ASCII character "CR" (hex value 0D) followed immediately by
2610+ ASCII character "LF" (hex value 0A). This termination sequence is
2611+ denoted as <CRLF> in this document. Conforming implementations MUST
2612+ NOT recognize or generate any other character or character sequence
2613+ as a line terminator. Limits MAY be imposed on line lengths by
2614+ servers (see Section 4).
2615+
2616+ In addition, the appearance of "bare" "CR" or "LF" characters in text
2617+ (i.e., either without the other) has a long history of causing
2618+ problems in mail implementations and applications that use the mail
2619+ system as a tool. SMTP client implementations MUST NOT transmit
2620+ these characters except when they are intended as line terminators
2621+ and then MUST, as indicated above, transmit them only as a <CRLF>
2622+ sequence.
2623+
2624+
2625+
2626+
2627+
2628+
2629+ Klensin Standards Track [Page 14]
2630+
2631+ RFC 5321 SMTP October 2008
2632+
2633+
2634+ 2.3.9. Message Content and Mail Data
2635+
2636+ The terms "message content" and "mail data" are used interchangeably
2637+ in this document to describe the material transmitted after the DATA
2638+ command is accepted and before the end of data indication is
2639+ transmitted. Message content includes the message header section and
2640+ the possibly structured message body. The MIME specification (RFC
2641+ 2045 [21]) provides the standard mechanisms for structured message
2642+ bodies.
2643+
2644+ 2.3.10. Originator, Delivery, Relay, and Gateway Systems
2645+
2646+ This specification makes a distinction among four types of SMTP
2647+ systems, based on the role those systems play in transmitting
2648+ electronic mail. An "originating" system (sometimes called an SMTP
2649+ originator) introduces mail into the Internet or, more generally,
2650+ into a transport service environment. A "delivery" SMTP system is
2651+ one that receives mail from a transport service environment and
2652+ passes it to a mail user agent or deposits it in a message store that
2653+ a mail user agent is expected to subsequently access. A "relay" SMTP
2654+ system (usually referred to just as a "relay") receives mail from an
2655+ SMTP client and transmits it, without modification to the message
2656+ data other than adding trace information, to another SMTP server for
2657+ further relaying or for delivery.
2658+
2659+ A "gateway" SMTP system (usually referred to just as a "gateway")
2660+ receives mail from a client system in one transport environment and
2661+ transmits it to a server system in another transport environment.
2662+ Differences in protocols or message semantics between the transport
2663+ environments on either side of a gateway may require that the gateway
2664+ system perform transformations to the message that are not permitted
2665+ to SMTP relay systems. For the purposes of this specification,
2666+ firewalls that rewrite addresses should be considered as gateways,
2667+ even if SMTP is used on both sides of them (see RFC 2979 [27]).
2668+
2669+ 2.3.11. Mailbox and Address
2670+
2671+ As used in this specification, an "address" is a character string
2672+ that identifies a user to whom mail will be sent or a location into
2673+ which mail will be deposited. The term "mailbox" refers to that
2674+ depository. The two terms are typically used interchangeably unless
2675+ the distinction between the location in which mail is placed (the
2676+ mailbox) and a reference to it (the address) is important. An
2677+ address normally consists of user and domain specifications. The
2678+ standard mailbox naming convention is defined to be
2679+ "local-part@domain"; contemporary usage permits a much broader set of
2680+ applications than simple "user names". Consequently, and due to a
2681+ long history of problems when intermediate hosts have attempted to
2682+
2683+
2684+
2685+ Klensin Standards Track [Page 15]
2686+
2687+ RFC 5321 SMTP October 2008
2688+
2689+
2690+ optimize transport by modifying them, the local-part MUST be
2691+ interpreted and assigned semantics only by the host specified in the
2692+ domain part of the address.
2693+
2694+ 2.4. General Syntax Principles and Transaction Model
2695+
2696+ SMTP commands and replies have a rigid syntax. All commands begin
2697+ with a command verb. All replies begin with a three digit numeric
2698+ code. In some commands and replies, arguments are required following
2699+ the verb or reply code. Some commands do not accept arguments (after
2700+ the verb), and some reply codes are followed, sometimes optionally,
2701+ by free form text. In both cases, where text appears, it is
2702+ separated from the verb or reply code by a space character. Complete
2703+ definitions of commands and replies appear in Section 4.
2704+
2705+ Verbs and argument values (e.g., "TO:" or "to:" in the RCPT command
2706+ and extension name keywords) are not case sensitive, with the sole
2707+ exception in this specification of a mailbox local-part (SMTP
2708+ Extensions may explicitly specify case-sensitive elements). That is,
2709+ a command verb, an argument value other than a mailbox local-part,
2710+ and free form text MAY be encoded in upper case, lower case, or any
2711+ mixture of upper and lower case with no impact on its meaning. The
2712+ local-part of a mailbox MUST BE treated as case sensitive.
2713+ Therefore, SMTP implementations MUST take care to preserve the case
2714+ of mailbox local-parts. In particular, for some hosts, the user
2715+ "smith" is different from the user "Smith". However, exploiting the
2716+ case sensitivity of mailbox local-parts impedes interoperability and
2717+ is discouraged. Mailbox domains follow normal DNS rules and are
2718+ hence not case sensitive.
2719+
2720+ A few SMTP servers, in violation of this specification (and RFC 821)
2721+ require that command verbs be encoded by clients in upper case.
2722+ Implementations MAY wish to employ this encoding to accommodate those
2723+ servers.
2724+
2725+ The argument clause consists of a variable-length character string
2726+ ending with the end of the line, i.e., with the character sequence
2727+ <CRLF>. The receiver will take no action until this sequence is
2728+ received.
2729+
2730+ The syntax for each command is shown with the discussion of that
2731+ command. Common elements and parameters are shown in Section 4.1.2.
2732+
2733+ Commands and replies are composed of characters from the ASCII
2734+ character set [6]. When the transport service provides an 8-bit byte
2735+ (octet) transmission channel, each 7-bit character is transmitted,
2736+ right justified, in an octet with the high-order bit cleared to zero.
2737+ More specifically, the unextended SMTP service provides 7-bit
2738+
2739+
2740+
2741+ Klensin Standards Track [Page 16]
2742+
2743+ RFC 5321 SMTP October 2008
2744+
2745+
2746+ transport only. An originating SMTP client that has not successfully
2747+ negotiated an appropriate extension with a particular server (see the
2748+ next paragraph) MUST NOT transmit messages with information in the
2749+ high-order bit of octets. If such messages are transmitted in
2750+ violation of this rule, receiving SMTP servers MAY clear the high-
2751+ order bit or reject the message as invalid. In general, a relay SMTP
2752+ SHOULD assume that the message content it has received is valid and,
2753+ assuming that the envelope permits doing so, relay it without
2754+ inspecting that content. Of course, if the content is mislabeled and
2755+ the data path cannot accept the actual content, this may result in
2756+ the ultimate delivery of a severely garbled message to the recipient.
2757+ Delivery SMTP systems MAY reject such messages, or return them as
2758+ undeliverable, rather than deliver them. In the absence of a server-
2759+ offered extension explicitly permitting it, a sending SMTP system is
2760+ not permitted to send envelope commands in any character set other
2761+ than US-ASCII. Receiving systems SHOULD reject such commands,
2762+ normally using "500 syntax error - invalid character" replies.
2763+
2764+ 8-bit message content transmission MAY be requested of the server by
2765+ a client using extended SMTP facilities, notably the "8BITMIME"
2766+ extension, RFC 1652 [22]. 8BITMIME SHOULD be supported by SMTP
2767+ servers. However, it MUST NOT be construed as authorization to
2768+ transmit unrestricted 8-bit material, nor does 8BITMIME authorize
2769+ transmission of any envelope material in other than ASCII. 8BITMIME
2770+ MUST NOT be requested by senders for material with the high bit on
2771+ that is not in MIME format with an appropriate content-transfer
2772+ encoding; servers MAY reject such messages.
2773+
2774+ The metalinguistic notation used in this document corresponds to the
2775+ "Augmented BNF" used in other Internet mail system documents. The
2776+ reader who is not familiar with that syntax should consult the ABNF
2777+ specification in RFC 5234 [7]. Metalanguage terms used in running
2778+ text are surrounded by pointed brackets (e.g., <CRLF>) for clarity.
2779+ The reader is cautioned that the grammar expressed in the
2780+ metalanguage is not comprehensive. There are many instances in which
2781+ provisions in the text constrain or otherwise modify the syntax or
2782+ semantics implied by the grammar.
2783+
2784+ 3. The SMTP Procedures: An Overview
2785+
2786+ This section contains descriptions of the procedures used in SMTP:
2787+ session initiation, mail transaction, forwarding mail, verifying
2788+ mailbox names and expanding mailing lists, and opening and closing
2789+ exchanges. Comments on relaying, a note on mail domains, and a
2790+ discussion of changing roles are included at the end of this section.
2791+ Several complete scenarios are presented in Appendix D.
2792+
2793+
2794+
2795+
2796+
2797+ Klensin Standards Track [Page 17]
2798+
2799+ RFC 5321 SMTP October 2008
2800+
2801+
2802+ 3.1. Session Initiation
2803+
2804+ An SMTP session is initiated when a client opens a connection to a
2805+ server and the server responds with an opening message.
2806+
2807+ SMTP server implementations MAY include identification of their
2808+ software and version information in the connection greeting reply
2809+ after the 220 code, a practice that permits more efficient isolation
2810+ and repair of any problems. Implementations MAY make provision for
2811+ SMTP servers to disable the software and version announcement where
2812+ it causes security concerns. While some systems also identify their
2813+ contact point for mail problems, this is not a substitute for
2814+ maintaining the required "postmaster" address (see Section 4).
2815+
2816+ The SMTP protocol allows a server to formally reject a mail session
2817+ while still allowing the initial connection as follows: a 554
2818+ response MAY be given in the initial connection opening message
2819+ instead of the 220. A server taking this approach MUST still wait
2820+ for the client to send a QUIT (see Section 4.1.1.10) before closing
2821+ the connection and SHOULD respond to any intervening commands with
2822+ "503 bad sequence of commands". Since an attempt to make an SMTP
2823+ connection to such a system is probably in error, a server returning
2824+ a 554 response on connection opening SHOULD provide enough
2825+ information in the reply text to facilitate debugging of the sending
2826+ system.
2827+
2828+ 3.2. Client Initiation
2829+
2830+ Once the server has sent the greeting (welcoming) message and the
2831+ client has received it, the client normally sends the EHLO command to
2832+ the server, indicating the client's identity. In addition to opening
2833+ the session, use of EHLO indicates that the client is able to process
2834+ service extensions and requests that the server provide a list of the
2835+ extensions it supports. Older SMTP systems that are unable to
2836+ support service extensions, and contemporary clients that do not
2837+ require service extensions in the mail session being initiated, MAY
2838+ use HELO instead of EHLO. Servers MUST NOT return the extended EHLO-
2839+ style response to a HELO command. For a particular connection
2840+ attempt, if the server returns a "command not recognized" response to
2841+ EHLO, the client SHOULD be able to fall back and send HELO.
2842+
2843+ In the EHLO command, the host sending the command identifies itself;
2844+ the command may be interpreted as saying "Hello, I am <domain>" (and,
2845+ in the case of EHLO, "and I support service extension requests").
2846+
2847+
2848+
2849+
2850+
2851+
2852+
2853+ Klensin Standards Track [Page 18]
2854+
2855+ RFC 5321 SMTP October 2008
2856+
2857+
2858+ 3.3. Mail Transactions
2859+
2860+ There are three steps to SMTP mail transactions. The transaction
2861+ starts with a MAIL command that gives the sender identification. (In
2862+ general, the MAIL command may be sent only when no mail transaction
2863+ is in progress; see Section 4.1.4.) A series of one or more RCPT
2864+ commands follows, giving the receiver information. Then, a DATA
2865+ command initiates transfer of the mail data and is terminated by the
2866+ "end of mail" data indicator, which also confirms the transaction.
2867+
2868+ The first step in the procedure is the MAIL command.
2869+
2870+ MAIL FROM:<reverse-path> [SP <mail-parameters> ] <CRLF>
2871+
2872+ This command tells the SMTP-receiver that a new mail transaction is
2873+ starting and to reset all its state tables and buffers, including any
2874+ recipients or mail data. The <reverse-path> portion of the first or
2875+ only argument contains the source mailbox (between "<" and ">"
2876+ brackets), which can be used to report errors (see Section 4.2 for a
2877+ discussion of error reporting). If accepted, the SMTP server returns
2878+ a "250 OK" reply. If the mailbox specification is not acceptable for
2879+ some reason, the server MUST return a reply indicating whether the
2880+ failure is permanent (i.e., will occur again if the client tries to
2881+ send the same address again) or temporary (i.e., the address might be
2882+ accepted if the client tries again later). Despite the apparent
2883+ scope of this requirement, there are circumstances in which the
2884+ acceptability of the reverse-path may not be determined until one or
2885+ more forward-paths (in RCPT commands) can be examined. In those
2886+ cases, the server MAY reasonably accept the reverse-path (with a 250
2887+ reply) and then report problems after the forward-paths are received
2888+ and examined. Normally, failures produce 550 or 553 replies.
2889+
2890+ Historically, the <reverse-path> was permitted to contain more than
2891+ just a mailbox; however, contemporary systems SHOULD NOT use source
2892+ routing (see Appendix C).
2893+
2894+ The optional <mail-parameters> are associated with negotiated SMTP
2895+ service extensions (see Section 2.2).
2896+
2897+ The second step in the procedure is the RCPT command. This step of
2898+ the procedure can be repeated any number of times.
2899+
2900+ RCPT TO:<forward-path> [ SP <rcpt-parameters> ] <CRLF>
2901+
2902+ The first or only argument to this command includes a forward-path
2903+ (normally a mailbox and domain, always surrounded by "<" and ">"
2904+ brackets) identifying one recipient. If accepted, the SMTP server
2905+ returns a "250 OK" reply and stores the forward-path. If the
2906+
2907+
2908+
2909+ Klensin Standards Track [Page 19]
2910+
2911+ RFC 5321 SMTP October 2008
2912+
2913+
2914+ recipient is known not to be a deliverable address, the SMTP server
2915+ returns a 550 reply, typically with a string such as "no such user -
2916+ " and the mailbox name (other circumstances and reply codes are
2917+ possible).
2918+
2919+ The <forward-path> can contain more than just a mailbox.
2920+ Historically, the <forward-path> was permitted to contain a source
2921+ routing list of hosts and the destination mailbox; however,
2922+ contemporary SMTP clients SHOULD NOT utilize source routes (see
2923+ Appendix C). Servers MUST be prepared to encounter a list of source
2924+ routes in the forward-path, but they SHOULD ignore the routes or MAY
2925+ decline to support the relaying they imply. Similarly, servers MAY
2926+ decline to accept mail that is destined for other hosts or systems.
2927+ These restrictions make a server useless as a relay for clients that
2928+ do not support full SMTP functionality. Consequently, restricted-
2929+ capability clients MUST NOT assume that any SMTP server on the
2930+ Internet can be used as their mail processing (relaying) site. If a
2931+ RCPT command appears without a previous MAIL command, the server MUST
2932+ return a 503 "Bad sequence of commands" response. The optional
2933+ <rcpt-parameters> are associated with negotiated SMTP service
2934+ extensions (see Section 2.2).
2935+
2936+ Since it has been a common source of errors, it is worth noting that
2937+ spaces are not permitted on either side of the colon following FROM
2938+ in the MAIL command or TO in the RCPT command. The syntax is exactly
2939+ as given above.
2940+
2941+ The third step in the procedure is the DATA command (or some
2942+ alternative specified in a service extension).
2943+
2944+ DATA <CRLF>
2945+
2946+ If accepted, the SMTP server returns a 354 Intermediate reply and
2947+ considers all succeeding lines up to but not including the end of
2948+ mail data indicator to be the message text. When the end of text is
2949+ successfully received and stored, the SMTP-receiver sends a "250 OK"
2950+ reply.
2951+
2952+ Since the mail data is sent on the transmission channel, the end of
2953+ mail data must be indicated so that the command and reply dialog can
2954+ be resumed. SMTP indicates the end of the mail data by sending a
2955+ line containing only a "." (period or full stop). A transparency
2956+ procedure is used to prevent this from interfering with the user's
2957+ text (see Section 4.5.2).
2958+
2959+ The end of mail data indicator also confirms the mail transaction and
2960+ tells the SMTP server to now process the stored recipients and mail
2961+
2962+
2963+
2964+
2965+ Klensin Standards Track [Page 20]
2966+
2967+ RFC 5321 SMTP October 2008
2968+
2969+
2970+ data. If accepted, the SMTP server returns a "250 OK" reply. The
2971+ DATA command can fail at only two points in the protocol exchange:
2972+
2973+ If there was no MAIL, or no RCPT, command, or all such commands were
2974+ rejected, the server MAY return a "command out of sequence" (503) or
2975+ "no valid recipients" (554) reply in response to the DATA command.
2976+ If one of those replies (or any other 5yz reply) is received, the
2977+ client MUST NOT send the message data; more generally, message data
2978+ MUST NOT be sent unless a 354 reply is received.
2979+
2980+ If the verb is initially accepted and the 354 reply issued, the DATA
2981+ command should fail only if the mail transaction was incomplete (for
2982+ example, no recipients), if resources were unavailable (including, of
2983+ course, the server unexpectedly becoming unavailable), or if the
2984+ server determines that the message should be rejected for policy or
2985+ other reasons.
2986+
2987+ However, in practice, some servers do not perform recipient
2988+ verification until after the message text is received. These servers
2989+ SHOULD treat a failure for one or more recipients as a "subsequent
2990+ failure" and return a mail message as discussed in Section 6 and, in
2991+ particular, in Section 6.1. Using a "550 mailbox not found" (or
2992+ equivalent) reply code after the data are accepted makes it difficult
2993+ or impossible for the client to determine which recipients failed.
2994+
2995+ When the RFC 822 format ([28], [4]) is being used, the mail data
2996+ include the header fields such as those named Date, Subject, To, Cc,
2997+ and From. Server SMTP systems SHOULD NOT reject messages based on
2998+ perceived defects in the RFC 822 or MIME (RFC 2045 [21]) message
2999+ header section or message body. In particular, they MUST NOT reject
3000+ messages in which the numbers of Resent-header fields do not match or
3001+ Resent-to appears without Resent-from and/or Resent-date.
3002+
3003+ Mail transaction commands MUST be used in the order discussed above.
3004+
3005+ 3.4. Forwarding for Address Correction or Updating
3006+
3007+ Forwarding support is most often required to consolidate and simplify
3008+ addresses within, or relative to, some enterprise and less frequently
3009+ to establish addresses to link a person's prior address with a
3010+ current one. Silent forwarding of messages (without server
3011+ notification to the sender), for security or non-disclosure purposes,
3012+ is common in the contemporary Internet.
3013+
3014+ In both the enterprise and the "new address" cases, information
3015+ hiding (and sometimes security) considerations argue against exposure
3016+ of the "final" address through the SMTP protocol as a side effect of
3017+ the forwarding activity. This may be especially important when the
3018+
3019+
3020+
3021+ Klensin Standards Track [Page 21]
3022+
3023+ RFC 5321 SMTP October 2008
3024+
3025+
3026+ final address may not even be reachable by the sender. Consequently,
3027+ the "forwarding" mechanisms described in Section 3.2 of RFC 821, and
3028+ especially the 251 (corrected destination) and 551 reply codes from
3029+ RCPT must be evaluated carefully by implementers and, when they are
3030+ available, by those configuring systems (see also Section 7.4).
3031+
3032+ In particular:
3033+
3034+ o Servers MAY forward messages when they are aware of an address
3035+ change. When they do so, they MAY either provide address-updating
3036+ information with a 251 code, or may forward "silently" and return
3037+ a 250 code. However, if a 251 code is used, they MUST NOT assume
3038+ that the client will actually update address information or even
3039+ return that information to the user.
3040+
3041+ Alternately,
3042+
3043+ o Servers MAY reject messages or return them as non-deliverable when
3044+ they cannot be delivered precisely as addressed. When they do so,
3045+ they MAY either provide address-updating information with a 551
3046+ code, or may reject the message as undeliverable with a 550 code
3047+ and no address-specific information. However, if a 551 code is
3048+ used, they MUST NOT assume that the client will actually update
3049+ address information or even return that information to the user.
3050+
3051+ SMTP server implementations that support the 251 and/or 551 reply
3052+ codes SHOULD provide configuration mechanisms so that sites that
3053+ conclude that they would undesirably disclose information can disable
3054+ or restrict their use.
3055+
3056+ 3.5. Commands for Debugging Addresses
3057+
3058+ 3.5.1. Overview
3059+
3060+ SMTP provides commands to verify a user name or obtain the content of
3061+ a mailing list. This is done with the VRFY and EXPN commands, which
3062+ have character string arguments. Implementations SHOULD support VRFY
3063+ and EXPN (however, see Section 3.5.2 and Section 7.3).
3064+
3065+ For the VRFY command, the string is a user name or a user name and
3066+ domain (see below). If a normal (i.e., 250) response is returned,
3067+ the response MAY include the full name of the user and MUST include
3068+ the mailbox of the user. It MUST be in either of the following
3069+ forms:
3070+
3071+ User Name <local-part@domain>
3072+ local-part@domain
3073+
3074+
3075+
3076+
3077+ Klensin Standards Track [Page 22]
3078+
3079+ RFC 5321 SMTP October 2008
3080+
3081+
3082+ When a name that is the argument to VRFY could identify more than one
3083+ mailbox, the server MAY either note the ambiguity or identify the
3084+ alternatives. In other words, any of the following are legitimate
3085+ responses to VRFY:
3086+
3087+ 553 User ambiguous
3088+
3089+ or
3090+
3091+ 553- Ambiguous; Possibilities are
3092+ 553-Joe Smith <jsmith@foo.com>
3093+ 553-Harry Smith <hsmith@foo.com>
3094+ 553 Melvin Smith <dweep@foo.com>
3095+
3096+ or
3097+
3098+ 553-Ambiguous; Possibilities
3099+ 553- <jsmith@foo.com>
3100+ 553- <hsmith@foo.com>
3101+ 553 <dweep@foo.com>
3102+
3103+ Under normal circumstances, a client receiving a 553 reply would be
3104+ expected to expose the result to the user. Use of exactly the forms
3105+ given, and the "user ambiguous" or "ambiguous" keywords, possibly
3106+ supplemented by extended reply codes, such as those described in RFC
3107+ 3463 [25], will facilitate automated translation into other languages
3108+ as needed. Of course, a client that was highly automated or that was
3109+ operating in another language than English might choose to try to
3110+ translate the response to return some other indication to the user
3111+ than the literal text of the reply, or to take some automated action
3112+ such as consulting a directory service for additional information
3113+ before reporting to the user.
3114+
3115+ For the EXPN command, the string identifies a mailing list, and the
3116+ successful (i.e., 250) multiline response MAY include the full name
3117+ of the users and MUST give the mailboxes on the mailing list.
3118+
3119+ In some hosts, the distinction between a mailing list and an alias
3120+ for a single mailbox is a bit fuzzy, since a common data structure
3121+ may hold both types of entries, and it is possible to have mailing
3122+ lists containing only one mailbox. If a request is made to apply
3123+ VRFY to a mailing list, a positive response MAY be given if a message
3124+ so addressed would be delivered to everyone on the list, otherwise an
3125+ error SHOULD be reported (e.g., "550 That is a mailing list, not a
3126+ user" or "252 Unable to verify members of mailing list"). If a
3127+ request is made to expand a user name, the server MAY return a
3128+
3129+
3130+
3131+
3132+
3133+ Klensin Standards Track [Page 23]
3134+
3135+ RFC 5321 SMTP October 2008
3136+
3137+
3138+ positive response consisting of a list containing one name, or an
3139+ error MAY be reported (e.g., "550 That is a user name, not a mailing
3140+ list").
3141+
3142+ In the case of a successful multiline reply (normal for EXPN),
3143+ exactly one mailbox is to be specified on each line of the reply.
3144+ The case of an ambiguous request is discussed above.
3145+
3146+ "User name" is a fuzzy term and has been used deliberately. An
3147+ implementation of the VRFY or EXPN commands MUST include at least
3148+ recognition of local mailboxes as "user names". However, since
3149+ current Internet practice often results in a single host handling
3150+ mail for multiple domains, hosts, especially hosts that provide this
3151+ functionality, SHOULD accept the "local-part@domain" form as a "user
3152+ name"; hosts MAY also choose to recognize other strings as "user
3153+ names".
3154+
3155+ The case of expanding a mailbox list requires a multiline reply, such
3156+ as:
3157+
3158+ C: EXPN Example-People
3159+ S: 250-Jon Postel <Postel@isi.edu>
3160+ S: 250-Fred Fonebone <Fonebone@physics.foo-u.edu>
3161+ S: 250 Sam Q. Smith <SQSmith@specific.generic.com>
3162+
3163+ or
3164+
3165+ C: EXPN Executive-Washroom-List
3166+ S: 550 Access Denied to You.
3167+
3168+ The character string arguments of the VRFY and EXPN commands cannot
3169+ be further restricted due to the variety of implementations of the
3170+ user name and mailbox list concepts. On some systems, it may be
3171+ appropriate for the argument of the EXPN command to be a file name
3172+ for a file containing a mailing list, but again there are a variety
3173+ of file naming conventions in the Internet. Similarly, historical
3174+ variations in what is returned by these commands are such that the
3175+ response SHOULD be interpreted very carefully, if at all, and SHOULD
3176+ generally only be used for diagnostic purposes.
3177+
3178+ 3.5.2. VRFY Normal Response
3179+
3180+ When normal (2yz or 551) responses are returned from a VRFY or EXPN
3181+ request, the reply MUST include the <Mailbox> name using a
3182+ "<local-part@domain>" construction, where "domain" is a fully-
3183+ qualified domain name. In circumstances exceptional enough to
3184+ justify violating the intent of this specification, free-form text
3185+ MAY be returned. In order to facilitate parsing by both computers
3186+
3187+
3188+
3189+ Klensin Standards Track [Page 24]
3190+
3191+ RFC 5321 SMTP October 2008
3192+
3193+
3194+ and people, addresses SHOULD appear in pointed brackets. When
3195+ addresses, rather than free-form debugging information, are returned,
3196+ EXPN and VRFY MUST return only valid domain addresses that are usable
3197+ in SMTP RCPT commands. Consequently, if an address implies delivery
3198+ to a program or other system, the mailbox name used to reach that
3199+ target MUST be given. Paths (explicit source routes) MUST NOT be
3200+ returned by VRFY or EXPN.
3201+
3202+ Server implementations SHOULD support both VRFY and EXPN. For
3203+ security reasons, implementations MAY provide local installations a
3204+ way to disable either or both of these commands through configuration
3205+ options or the equivalent (see Section 7.3). When these commands are
3206+ supported, they are not required to work across relays when relaying
3207+ is supported. Since they were both optional in RFC 821, but VRFY was
3208+ made mandatory in RFC 1123 [3], if EXPN is supported, it MUST be
3209+ listed as a service extension in an EHLO response. VRFY MAY be
3210+ listed as a convenience but, since support for it is required, SMTP
3211+ clients are not required to check for its presence on the extension
3212+ list before using it.
3213+
3214+ 3.5.3. Meaning of VRFY or EXPN Success Response
3215+
3216+ A server MUST NOT return a 250 code in response to a VRFY or EXPN
3217+ command unless it has actually verified the address. In particular,
3218+ a server MUST NOT return 250 if all it has done is to verify that the
3219+ syntax given is valid. In that case, 502 (Command not implemented)
3220+ or 500 (Syntax error, command unrecognized) SHOULD be returned. As
3221+ stated elsewhere, implementation (in the sense of actually validating
3222+ addresses and returning information) of VRFY and EXPN are strongly
3223+ recommended. Hence, implementations that return 500 or 502 for VRFY
3224+ are not in full compliance with this specification.
3225+
3226+ There may be circumstances where an address appears to be valid but
3227+ cannot reasonably be verified in real time, particularly when a
3228+ server is acting as a mail exchanger for another server or domain.
3229+ "Apparent validity", in this case, would normally involve at least
3230+ syntax checking and might involve verification that any domains
3231+ specified were ones to which the host expected to be able to relay
3232+ mail. In these situations, reply code 252 SHOULD be returned. These
3233+ cases parallel the discussion of RCPT verification in Section 2.1.
3234+ Similarly, the discussion in Section 3.4 applies to the use of reply
3235+ codes 251 and 551 with VRFY (and EXPN) to indicate addresses that are
3236+ recognized but that would be forwarded or rejected were mail received
3237+ for them. Implementations generally SHOULD be more aggressive about
3238+ address verification in the case of VRFY than in the case of RCPT,
3239+ even if it takes a little longer to do so.
3240+
3241+
3242+
3243+
3244+
3245+ Klensin Standards Track [Page 25]
3246+
3247+ RFC 5321 SMTP October 2008
3248+
3249+
3250+ 3.5.4. Semantics and Applications of EXPN
3251+
3252+ EXPN is often very useful in debugging and understanding problems
3253+ with mailing lists and multiple-target-address aliases. Some systems
3254+ have attempted to use source expansion of mailing lists as a means of
3255+ eliminating duplicates. The propagation of aliasing systems with
3256+ mail on the Internet for hosts (typically with MX and CNAME DNS
3257+ records), for mailboxes (various types of local host aliases), and in
3258+ various proxying arrangements has made it nearly impossible for these
3259+ strategies to work consistently, and mail systems SHOULD NOT attempt
3260+ them.
3261+
3262+ 3.6. Relaying and Mail Routing
3263+
3264+ 3.6.1. Source Routes and Relaying
3265+
3266+ In general, the availability of Mail eXchanger records in the domain
3267+ name system (RFC 1035 [2], RFC 974 [12]) makes the use of explicit
3268+ source routes in the Internet mail system unnecessary. Many
3269+ historical problems with the interpretation of explicit source routes
3270+ have made their use undesirable. SMTP clients SHOULD NOT generate
3271+ explicit source routes except under unusual circumstances. SMTP
3272+ servers MAY decline to act as mail relays or to accept addresses that
3273+ specify source routes. When route information is encountered, SMTP
3274+ servers MAY ignore the route information and simply send to the final
3275+ destination specified as the last element in the route and SHOULD do
3276+ so. There has been an invalid practice of using names that do not
3277+ appear in the DNS as destination names, with the senders counting on
3278+ the intermediate hosts specified in source routing to resolve any
3279+ problems. If source routes are stripped, this practice will cause
3280+ failures. This is one of several reasons why SMTP clients MUST NOT
3281+ generate invalid source routes or depend on serial resolution of
3282+ names.
3283+
3284+ When source routes are not used, the process described in RFC 821 for
3285+ constructing a reverse-path from the forward-path is not applicable
3286+ and the reverse-path at the time of delivery will simply be the
3287+ address that appeared in the MAIL command.
3288+
3289+ 3.6.2. Mail eXchange Records and Relaying
3290+
3291+ A relay SMTP server is usually the target of a DNS MX record that
3292+ designates it, rather than the final delivery system. The relay
3293+ server may accept or reject the task of relaying the mail in the same
3294+ way it accepts or rejects mail for a local user. If it accepts the
3295+ task, it then becomes an SMTP client, establishes a transmission
3296+ channel to the next SMTP server specified in the DNS (according to
3297+ the rules in Section 5), and sends it the mail. If it declines to
3298+
3299+
3300+
3301+ Klensin Standards Track [Page 26]
3302+
3303+ RFC 5321 SMTP October 2008
3304+
3305+
3306+ relay mail to a particular address for policy reasons, a 550 response
3307+ SHOULD be returned.
3308+
3309+ This specification does not deal with the verification of return
3310+ paths for use in delivery notifications. Recent work, such as that
3311+ on SPF [29] and DKIM [30] [31], has been done to provide ways to
3312+ ascertain that an address is valid or belongs to the person who
3313+ actually sent the message. A server MAY attempt to verify the return
3314+ path before using its address for delivery notifications, but methods
3315+ of doing so are not defined here nor is any particular method
3316+ recommended at this time.
3317+
3318+ 3.6.3. Message Submission Servers as Relays
3319+
3320+ Many mail-sending clients exist, especially in conjunction with
3321+ facilities that receive mail via POP3 or IMAP, that have limited
3322+ capability to support some of the requirements of this specification,
3323+ such as the ability to queue messages for subsequent delivery
3324+ attempts. For these clients, it is common practice to make private
3325+ arrangements to send all messages to a single server for processing
3326+ and subsequent distribution. SMTP, as specified here, is not ideally
3327+ suited for this role. A standardized mail submission protocol has
3328+ been developed that is gradually superseding practices based on SMTP
3329+ (see RFC 4409 [18]). In any event, because these arrangements are
3330+ private and fall outside the scope of this specification, they are
3331+ not described here.
3332+
3333+ It is important to note that MX records can point to SMTP servers
3334+ that act as gateways into other environments, not just SMTP relays
3335+ and final delivery systems; see Sections 3.7 and 5.
3336+
3337+ If an SMTP server has accepted the task of relaying the mail and
3338+ later finds that the destination is incorrect or that the mail cannot
3339+ be delivered for some other reason, then it MUST construct an
3340+ "undeliverable mail" notification message and send it to the
3341+ originator of the undeliverable mail (as indicated by the reverse-
3342+ path). Formats specified for non-delivery reports by other standards
3343+ (see, for example, RFC 3461 [32] and RFC 3464 [33]) SHOULD be used if
3344+ possible.
3345+
3346+ This notification message must be from the SMTP server at the relay
3347+ host or the host that first determines that delivery cannot be
3348+ accomplished. Of course, SMTP servers MUST NOT send notification
3349+ messages about problems transporting notification messages. One way
3350+ to prevent loops in error reporting is to specify a null reverse-path
3351+ in the MAIL command of a notification message. When such a message
3352+ is transmitted, the reverse-path MUST be set to null (see
3353+
3354+
3355+
3356+
3357+ Klensin Standards Track [Page 27]
3358+
3359+ RFC 5321 SMTP October 2008
3360+
3361+
3362+ Section 4.5.5 for additional discussion). A MAIL command with a null
3363+ reverse-path appears as follows:
3364+
3365+ MAIL FROM:<>
3366+
3367+ As discussed in Section 6.4, a relay SMTP has no need to inspect or
3368+ act upon the header section or body of the message data and MUST NOT
3369+ do so except to add its own "Received:" header field (Section 4.4)
3370+ and, optionally, to attempt to detect looping in the mail system (see
3371+ Section 6.3). Of course, this prohibition also applies to any
3372+ modifications of these header fields or text (see also Section 7.9).
3373+
3374+ 3.7. Mail Gatewaying
3375+
3376+ While the relay function discussed above operates within the Internet
3377+ SMTP transport service environment, MX records or various forms of
3378+ explicit routing may require that an intermediate SMTP server perform
3379+ a translation function between one transport service and another. As
3380+ discussed in Section 2.3.10, when such a system is at the boundary
3381+ between two transport service environments, we refer to it as a
3382+ "gateway" or "gateway SMTP".
3383+
3384+ Gatewaying mail between different mail environments, such as
3385+ different mail formats and protocols, is complex and does not easily
3386+ yield to standardization. However, some general requirements may be
3387+ given for a gateway between the Internet and another mail
3388+ environment.
3389+
3390+ 3.7.1. Header Fields in Gatewaying
3391+
3392+ Header fields MAY be rewritten when necessary as messages are
3393+ gatewayed across mail environment boundaries. This may involve
3394+ inspecting the message body or interpreting the local-part of the
3395+ destination address in spite of the prohibitions in Section 6.4.
3396+
3397+ Other mail systems gatewayed to the Internet often use a subset of
3398+ the RFC 822 header section or provide similar functionality with a
3399+ different syntax, but some of these mail systems do not have an
3400+ equivalent to the SMTP envelope. Therefore, when a message leaves
3401+ the Internet environment, it may be necessary to fold the SMTP
3402+ envelope information into the message header section. A possible
3403+ solution would be to create new header fields to carry the envelope
3404+ information (e.g., "X-SMTP-MAIL:" and "X-SMTP-RCPT:"); however, this
3405+ would require changes in mail programs in foreign environments and
3406+ might risk disclosure of private information (see Section 7.2).
3407+
3408+
3409+
3410+
3411+
3412+
3413+ Klensin Standards Track [Page 28]
3414+
3415+ RFC 5321 SMTP October 2008
3416+
3417+
3418+ 3.7.2. Received Lines in Gatewaying
3419+
3420+ When forwarding a message into or out of the Internet environment, a
3421+ gateway MUST prepend a Received: line, but it MUST NOT alter in any
3422+ way a Received: line that is already in the header section.
3423+
3424+ "Received:" header fields of messages originating from other
3425+ environments may not conform exactly to this specification. However,
3426+ the most important use of Received: lines is for debugging mail
3427+ faults, and this debugging can be severely hampered by well-meaning
3428+ gateways that try to "fix" a Received: line. As another consequence
3429+ of trace header fields arising in non-SMTP environments, receiving
3430+ systems MUST NOT reject mail based on the format of a trace header
3431+ field and SHOULD be extremely robust in the light of unexpected
3432+ information or formats in those header fields.
3433+
3434+ The gateway SHOULD indicate the environment and protocol in the "via"
3435+ clauses of Received header field(s) that it supplies.
3436+
3437+ 3.7.3. Addresses in Gatewaying
3438+
3439+ From the Internet side, the gateway SHOULD accept all valid address
3440+ formats in SMTP commands and in the RFC 822 header section, and all
3441+ valid RFC 822 messages. Addresses and header fields generated by
3442+ gateways MUST conform to applicable standards (including this one and
3443+ RFC 5322 [4]). Gateways are, of course, subject to the same rules
3444+ for handling source routes as those described for other SMTP systems
3445+ in Section 3.3.
3446+
3447+ 3.7.4. Other Header Fields in Gatewaying
3448+
3449+ The gateway MUST ensure that all header fields of a message that it
3450+ forwards into the Internet mail environment meet the requirements for
3451+ Internet mail. In particular, all addresses in "From:", "To:",
3452+ "Cc:", etc., header fields MUST be transformed (if necessary) to
3453+ satisfy the standard header syntax of RFC 5322 [4], MUST reference
3454+ only fully-qualified domain names, and MUST be effective and useful
3455+ for sending replies. The translation algorithm used to convert mail
3456+ from the Internet protocols to another environment's protocol SHOULD
3457+ ensure that error messages from the foreign mail environment are
3458+ delivered to the reverse-path from the SMTP envelope, not to an
3459+ address in the "From:", "Sender:", or similar header fields of the
3460+ message.
3461+
3462+
3463+
3464+
3465+
3466+
3467+
3468+
3469+ Klensin Standards Track [Page 29]
3470+
3471+ RFC 5321 SMTP October 2008
3472+
3473+
3474+ 3.7.5. Envelopes in Gatewaying
3475+
3476+ Similarly, when forwarding a message from another environment into
3477+ the Internet, the gateway SHOULD set the envelope return path in
3478+ accordance with an error message return address, if supplied by the
3479+ foreign environment. If the foreign environment has no equivalent
3480+ concept, the gateway must select and use a best approximation, with
3481+ the message originator's address as the default of last resort.
3482+
3483+ 3.8. Terminating Sessions and Connections
3484+
3485+ An SMTP connection is terminated when the client sends a QUIT
3486+ command. The server responds with a positive reply code, after which
3487+ it closes the connection.
3488+
3489+ An SMTP server MUST NOT intentionally close the connection under
3490+ normal operational circumstances (see Section 7.8) except:
3491+
3492+ o After receiving a QUIT command and responding with a 221 reply.
3493+
3494+ o After detecting the need to shut down the SMTP service and
3495+ returning a 421 response code. This response code can be issued
3496+ after the server receives any command or, if necessary,
3497+ asynchronously from command receipt (on the assumption that the
3498+ client will receive it after the next command is issued).
3499+
3500+ o After a timeout, as specified in Section 4.5.3.2, occurs waiting
3501+ for the client to send a command or data.
3502+
3503+ In particular, a server that closes connections in response to
3504+ commands that are not understood is in violation of this
3505+ specification. Servers are expected to be tolerant of unknown
3506+ commands, issuing a 500 reply and awaiting further instructions from
3507+ the client.
3508+
3509+ An SMTP server that is forcibly shut down via external means SHOULD
3510+ attempt to send a line containing a 421 response code to the SMTP
3511+ client before exiting. The SMTP client will normally read the 421
3512+ response code after sending its next command.
3513+
3514+ SMTP clients that experience a connection close, reset, or other
3515+ communications failure due to circumstances not under their control
3516+ (in violation of the intent of this specification but sometimes
3517+ unavoidable) SHOULD, to maintain the robustness of the mail system,
3518+ treat the mail transaction as if a 451 response had been received and
3519+ act accordingly.
3520+
3521+
3522+
3523+
3524+
3525+ Klensin Standards Track [Page 30]
3526+
3527+ RFC 5321 SMTP October 2008
3528+
3529+
3530+ 3.9. Mailing Lists and Aliases
3531+
3532+ An SMTP-capable host SHOULD support both the alias and the list
3533+ models of address expansion for multiple delivery. When a message is
3534+ delivered or forwarded to each address of an expanded list form, the
3535+ return address in the envelope ("MAIL FROM:") MUST be changed to be
3536+ the address of a person or other entity who administers the list.
3537+ However, in this case, the message header section (RFC 5322 [4]) MUST
3538+ be left unchanged; in particular, the "From" field of the header
3539+ section is unaffected.
3540+
3541+ An important mail facility is a mechanism for multi-destination
3542+ delivery of a single message, by transforming (or "expanding" or
3543+ "exploding") a pseudo-mailbox address into a list of destination
3544+ mailbox addresses. When a message is sent to such a pseudo-mailbox
3545+ (sometimes called an "exploder"), copies are forwarded or
3546+ redistributed to each mailbox in the expanded list. Servers SHOULD
3547+ simply utilize the addresses on the list; application of heuristics
3548+ or other matching rules to eliminate some addresses, such as that of
3549+ the originator, is strongly discouraged. We classify such a pseudo-
3550+ mailbox as an "alias" or a "list", depending upon the expansion
3551+ rules.
3552+
3553+ 3.9.1. Alias
3554+
3555+ To expand an alias, the recipient mailer simply replaces the pseudo-
3556+ mailbox address in the envelope with each of the expanded addresses
3557+ in turn; the rest of the envelope and the message body are left
3558+ unchanged. The message is then delivered or forwarded to each
3559+ expanded address.
3560+
3561+ 3.9.2. List
3562+
3563+ A mailing list may be said to operate by "redistribution" rather than
3564+ by "forwarding". To expand a list, the recipient mailer replaces the
3565+ pseudo-mailbox address in the envelope with each of the expanded
3566+ addresses in turn. The return (backward-pointing) address in the
3567+ envelope is changed so that all error messages generated by the final
3568+ deliveries will be returned to a list administrator, not to the
3569+ message originator, who generally has no control over the contents of
3570+ the list and will typically find error messages annoying. Note that
3571+ the key difference between handling aliases (Section 3.9.1) and
3572+ forwarding (this subsection) is the change to the backward-pointing
3573+ address in this case. When a list constrains its processing to the
3574+ very limited set of modifications and actions described here, it is
3575+ attempting to emulate an MTA; such lists can be treated as a
3576+ continuation in email transit.
3577+
3578+
3579+
3580+
3581+ Klensin Standards Track [Page 31]
3582+
3583+ RFC 5321 SMTP October 2008
3584+
3585+
3586+ There exist mailing lists that perform additional, sometimes
3587+ extensive, modifications to a message and its envelope. Such mailing
3588+ lists need to be viewed as full MUAs, which accept a delivery and
3589+ post a new message.
3590+
3591+ 4. The SMTP Specifications
3592+
3593+ 4.1. SMTP Commands
3594+
3595+ 4.1.1. Command Semantics and Syntax
3596+
3597+ The SMTP commands define the mail transfer or the mail system
3598+ function requested by the user. SMTP commands are character strings
3599+ terminated by <CRLF>. The commands themselves are alphabetic
3600+ characters terminated by <SP> if parameters follow and <CRLF>
3601+ otherwise. (In the interest of improved interoperability, SMTP
3602+ receivers SHOULD tolerate trailing white space before the terminating
3603+ <CRLF>.) The syntax of the local part of a mailbox MUST conform to
3604+ receiver site conventions and the syntax specified in Section 4.1.2.
3605+ The SMTP commands are discussed below. The SMTP replies are
3606+ discussed in Section 4.2.
3607+
3608+ A mail transaction involves several data objects that are
3609+ communicated as arguments to different commands. The reverse-path is
3610+ the argument of the MAIL command, the forward-path is the argument of
3611+ the RCPT command, and the mail data is the argument of the DATA
3612+ command. These arguments or data objects must be transmitted and
3613+ held, pending the confirmation communicated by the end of mail data
3614+ indication that finalizes the transaction. The model for this is
3615+ that distinct buffers are provided to hold the types of data objects;
3616+ that is, there is a reverse-path buffer, a forward-path buffer, and a
3617+ mail data buffer. Specific commands cause information to be appended
3618+ to a specific buffer, or cause one or more buffers to be cleared.
3619+
3620+ Several commands (RSET, DATA, QUIT) are specified as not permitting
3621+ parameters. In the absence of specific extensions offered by the
3622+ server and accepted by the client, clients MUST NOT send such
3623+ parameters and servers SHOULD reject commands containing them as
3624+ having invalid syntax.
3625+
3626+ 4.1.1.1. Extended HELLO (EHLO) or HELLO (HELO)
3627+
3628+ These commands are used to identify the SMTP client to the SMTP
3629+ server. The argument clause contains the fully-qualified domain name
3630+ of the SMTP client, if one is available. In situations in which the
3631+ SMTP client system does not have a meaningful domain name (e.g., when
3632+ its address is dynamically allocated and no reverse mapping record is
3633+
3634+
3635+
3636+
3637+ Klensin Standards Track [Page 32]
3638+
3639+ RFC 5321 SMTP October 2008
3640+
3641+
3642+ available), the client SHOULD send an address literal (see
3643+ Section 4.1.3).
3644+
3645+ RFC 2821, and some earlier informal practices, encouraged following
3646+ the literal by information that would help to identify the client
3647+ system. That convention was not widely supported, and many SMTP
3648+ servers considered it an error. In the interest of interoperability,
3649+ it is probably wise for servers to be prepared for this string to
3650+ occur, but SMTP clients SHOULD NOT send it.
3651+
3652+ The SMTP server identifies itself to the SMTP client in the
3653+ connection greeting reply and in the response to this command.
3654+
3655+ A client SMTP SHOULD start an SMTP session by issuing the EHLO
3656+ command. If the SMTP server supports the SMTP service extensions, it
3657+ will give a successful response, a failure response, or an error
3658+ response. If the SMTP server, in violation of this specification,
3659+ does not support any SMTP service extensions, it will generate an
3660+ error response. Older client SMTP systems MAY, as discussed above,
3661+ use HELO (as specified in RFC 821) instead of EHLO, and servers MUST
3662+ support the HELO command and reply properly to it. In any event, a
3663+ client MUST issue HELO or EHLO before starting a mail transaction.
3664+
3665+ These commands, and a "250 OK" reply to one of them, confirm that
3666+ both the SMTP client and the SMTP server are in the initial state,
3667+ that is, there is no transaction in progress and all state tables and
3668+ buffers are cleared.
3669+
3670+ Syntax:
3671+
3672+ ehlo = "EHLO" SP ( Domain / address-literal ) CRLF
3673+
3674+ helo = "HELO" SP Domain CRLF
3675+
3676+ Normally, the response to EHLO will be a multiline reply. Each line
3677+ of the response contains a keyword and, optionally, one or more
3678+ parameters. Following the normal syntax for multiline replies, these
3679+ keywords follow the code (250) and a hyphen for all but the last
3680+ line, and the code and a space for the last line. The syntax for a
3681+ positive response, using the ABNF notation and terminal symbols of
3682+ RFC 5234 [7], is:
3683+
3684+ ehlo-ok-rsp = ( "250" SP Domain [ SP ehlo-greet ] CRLF )
3685+ / ( "250-" Domain [ SP ehlo-greet ] CRLF
3686+ *( "250-" ehlo-line CRLF )
3687+ "250" SP ehlo-line CRLF )
3688+
3689+
3690+
3691+
3692+
3693+ Klensin Standards Track [Page 33]
3694+
3695+ RFC 5321 SMTP October 2008
3696+
3697+
3698+ ehlo-greet = 1*(%d0-9 / %d11-12 / %d14-127)
3699+ ; string of any characters other than CR or LF
3700+
3701+ ehlo-line = ehlo-keyword *( SP ehlo-param )
3702+
3703+ ehlo-keyword = (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
3704+ ; additional syntax of ehlo-params depends on
3705+ ; ehlo-keyword
3706+
3707+ ehlo-param = 1*(%d33-126)
3708+ ; any CHAR excluding <SP> and all
3709+ ; control characters (US-ASCII 0-31 and 127
3710+ ; inclusive)
3711+
3712+ Although EHLO keywords may be specified in upper, lower, or mixed
3713+ case, they MUST always be recognized and processed in a case-
3714+ insensitive manner. This is simply an extension of practices
3715+ specified in RFC 821 and Section 2.4.
3716+
3717+ The EHLO response MUST contain keywords (and associated parameters if
3718+ required) for all commands not listed as "required" in Section 4.5.1
3719+ excepting only private-use commands as described in Section 4.1.5.
3720+ Private-use commands MAY be listed.
3721+
3722+ 4.1.1.2. MAIL (MAIL)
3723+
3724+ This command is used to initiate a mail transaction in which the mail
3725+ data is delivered to an SMTP server that may, in turn, deliver it to
3726+ one or more mailboxes or pass it on to another system (possibly using
3727+ SMTP). The argument clause contains a reverse-path and may contain
3728+ optional parameters. In general, the MAIL command may be sent only
3729+ when no mail transaction is in progress, see Section 4.1.4.
3730+
3731+ The reverse-path consists of the sender mailbox. Historically, that
3732+ mailbox might optionally have been preceded by a list of hosts, but
3733+ that behavior is now deprecated (see Appendix C). In some types of
3734+ reporting messages for which a reply is likely to cause a mail loop
3735+ (for example, mail delivery and non-delivery notifications), the
3736+ reverse-path may be null (see Section 3.6).
3737+
3738+ This command clears the reverse-path buffer, the forward-path buffer,
3739+ and the mail data buffer, and it inserts the reverse-path information
3740+ from its argument clause into the reverse-path buffer.
3741+
3742+ If service extensions were negotiated, the MAIL command may also
3743+ carry parameters associated with a particular service extension.
3744+
3745+
3746+
3747+
3748+
3749+ Klensin Standards Track [Page 34]
3750+
3751+ RFC 5321 SMTP October 2008
3752+
3753+
3754+ Syntax:
3755+
3756+ mail = "MAIL FROM:" Reverse-path
3757+ [SP Mail-parameters] CRLF
3758+
3759+ 4.1.1.3. RECIPIENT (RCPT)
3760+
3761+ This command is used to identify an individual recipient of the mail
3762+ data; multiple recipients are specified by multiple uses of this
3763+ command. The argument clause contains a forward-path and may contain
3764+ optional parameters.
3765+
3766+ The forward-path normally consists of the required destination
3767+ mailbox. Sending systems SHOULD NOT generate the optional list of
3768+ hosts known as a source route. Receiving systems MUST recognize
3769+ source route syntax but SHOULD strip off the source route
3770+ specification and utilize the domain name associated with the mailbox
3771+ as if the source route had not been provided.
3772+
3773+ Similarly, relay hosts SHOULD strip or ignore source routes, and
3774+ names MUST NOT be copied into the reverse-path. When mail reaches
3775+ its ultimate destination (the forward-path contains only a
3776+ destination mailbox), the SMTP server inserts it into the destination
3777+ mailbox in accordance with its host mail conventions.
3778+
3779+ This command appends its forward-path argument to the forward-path
3780+ buffer; it does not change the reverse-path buffer nor the mail data
3781+ buffer.
3782+
3783+ For example, mail received at relay host xyz.com with envelope
3784+ commands
3785+
3786+ MAIL FROM:<userx@y.foo.org>
3787+ RCPT TO:<@hosta.int,@jkl.org:userc@d.bar.org>
3788+
3789+ will normally be sent directly on to host d.bar.org with envelope
3790+ commands
3791+
3792+ MAIL FROM:<userx@y.foo.org>
3793+ RCPT TO:<userc@d.bar.org>
3794+
3795+ As provided in Appendix C, xyz.com MAY also choose to relay the
3796+ message to hosta.int, using the envelope commands
3797+
3798+ MAIL FROM:<userx@y.foo.org>
3799+ RCPT TO:<@hosta.int,@jkl.org:userc@d.bar.org>
3800+
3801+
3802+
3803+
3804+
3805+ Klensin Standards Track [Page 35]
3806+
3807+ RFC 5321 SMTP October 2008
3808+
3809+
3810+ or to jkl.org, using the envelope commands
3811+
3812+ MAIL FROM:<userx@y.foo.org>
3813+ RCPT TO:<@jkl.org:userc@d.bar.org>
3814+
3815+ Attempting to use relaying this way is now strongly discouraged.
3816+ Since hosts are not required to relay mail at all, xyz.com MAY also
3817+ reject the message entirely when the RCPT command is received, using
3818+ a 550 code (since this is a "policy reason").
3819+
3820+ If service extensions were negotiated, the RCPT command may also
3821+ carry parameters associated with a particular service extension
3822+ offered by the server. The client MUST NOT transmit parameters other
3823+ than those associated with a service extension offered by the server
3824+ in its EHLO response.
3825+
3826+ Syntax:
3827+
3828+ rcpt = "RCPT TO:" ( "<Postmaster@" Domain ">" / "<Postmaster>" /
3829+ Forward-path ) [SP Rcpt-parameters] CRLF
3830+
3831+ Note that, in a departure from the usual rules for
3832+ local-parts, the "Postmaster" string shown above is
3833+ treated as case-insensitive.
3834+
3835+ 4.1.1.4. DATA (DATA)
3836+
3837+ The receiver normally sends a 354 response to DATA, and then treats
3838+ the lines (strings ending in <CRLF> sequences, as described in
3839+ Section 2.3.7) following the command as mail data from the sender.
3840+ This command causes the mail data to be appended to the mail data
3841+ buffer. The mail data may contain any of the 128 ASCII character
3842+ codes, although experience has indicated that use of control
3843+ characters other than SP, HT, CR, and LF may cause problems and
3844+ SHOULD be avoided when possible.
3845+
3846+ The mail data are terminated by a line containing only a period, that
3847+ is, the character sequence "<CRLF>.<CRLF>", where the first <CRLF> is
3848+ actually the terminator of the previous line (see Section 4.5.2).
3849+ This is the end of mail data indication. The first <CRLF> of this
3850+ terminating sequence is also the <CRLF> that ends the final line of
3851+ the data (message text) or, if there was no mail data, ends the DATA
3852+ command itself (the "no mail data" case does not conform to this
3853+ specification since it would require that neither the trace header
3854+ fields required by this specification nor the message header section
3855+ required by RFC 5322 [4] be transmitted). An extra <CRLF> MUST NOT
3856+ be added, as that would cause an empty line to be added to the
3857+ message. The only exception to this rule would arise if the message
3858+
3859+
3860+
3861+ Klensin Standards Track [Page 36]
3862+
3863+ RFC 5321 SMTP October 2008
3864+
3865+
3866+ body were passed to the originating SMTP-sender with a final "line"
3867+ that did not end in <CRLF>; in that case, the originating SMTP system
3868+ MUST either reject the message as invalid or add <CRLF> in order to
3869+ have the receiving SMTP server recognize the "end of data" condition.
3870+
3871+ The custom of accepting lines ending only in <LF>, as a concession to
3872+ non-conforming behavior on the part of some UNIX systems, has proven
3873+ to cause more interoperability problems than it solves, and SMTP
3874+ server systems MUST NOT do this, even in the name of improved
3875+ robustness. In particular, the sequence "<LF>.<LF>" (bare line
3876+ feeds, without carriage returns) MUST NOT be treated as equivalent to
3877+ <CRLF>.<CRLF> as the end of mail data indication.
3878+
3879+ Receipt of the end of mail data indication requires the server to
3880+ process the stored mail transaction information. This processing
3881+ consumes the information in the reverse-path buffer, the forward-path
3882+ buffer, and the mail data buffer, and on the completion of this
3883+ command these buffers are cleared. If the processing is successful,
3884+ the receiver MUST send an OK reply. If the processing fails, the
3885+ receiver MUST send a failure reply. The SMTP model does not allow
3886+ for partial failures at this point: either the message is accepted by
3887+ the server for delivery and a positive response is returned or it is
3888+ not accepted and a failure reply is returned. In sending a positive
3889+ "250 OK" completion reply to the end of data indication, the receiver
3890+ takes full responsibility for the message (see Section 6.1). Errors
3891+ that are diagnosed subsequently MUST be reported in a mail message,
3892+ as discussed in Section 4.4.
3893+
3894+ When the SMTP server accepts a message either for relaying or for
3895+ final delivery, it inserts a trace record (also referred to
3896+ interchangeably as a "time stamp line" or "Received" line) at the top
3897+ of the mail data. This trace record indicates the identity of the
3898+ host that sent the message, the identity of the host that received
3899+ the message (and is inserting this time stamp), and the date and time
3900+ the message was received. Relayed messages will have multiple time
3901+ stamp lines. Details for formation of these lines, including their
3902+ syntax, is specified in Section 4.4.
3903+
3904+ Additional discussion about the operation of the DATA command appears
3905+ in Section 3.3.
3906+
3907+ Syntax:
3908+
3909+ data = "DATA" CRLF
3910+
3911+
3912+
3913+
3914+
3915+
3916+
3917+ Klensin Standards Track [Page 37]
3918+
3919+ RFC 5321 SMTP October 2008
3920+
3921+
3922+ 4.1.1.5. RESET (RSET)
3923+
3924+ This command specifies that the current mail transaction will be
3925+ aborted. Any stored sender, recipients, and mail data MUST be
3926+ discarded, and all buffers and state tables cleared. The receiver
3927+ MUST send a "250 OK" reply to a RSET command with no arguments. A
3928+ reset command may be issued by the client at any time. It is
3929+ effectively equivalent to a NOOP (i.e., it has no effect) if issued
3930+ immediately after EHLO, before EHLO is issued in the session, after
3931+ an end of data indicator has been sent and acknowledged, or
3932+ immediately before a QUIT. An SMTP server MUST NOT close the
3933+ connection as the result of receiving a RSET; that action is reserved
3934+ for QUIT (see Section 4.1.1.10).
3935+
3936+ Since EHLO implies some additional processing and response by the
3937+ server, RSET will normally be more efficient than reissuing that
3938+ command, even though the formal semantics are the same.
3939+
3940+ There are circumstances, contrary to the intent of this
3941+ specification, in which an SMTP server may receive an indication that
3942+ the underlying TCP connection has been closed or reset. To preserve
3943+ the robustness of the mail system, SMTP servers SHOULD be prepared
3944+ for this condition and SHOULD treat it as if a QUIT had been received
3945+ before the connection disappeared.
3946+
3947+ Syntax:
3948+
3949+ rset = "RSET" CRLF
3950+
3951+ 4.1.1.6. VERIFY (VRFY)
3952+
3953+ This command asks the receiver to confirm that the argument
3954+ identifies a user or mailbox. If it is a user name, information is
3955+ returned as specified in Section 3.5.
3956+
3957+ This command has no effect on the reverse-path buffer, the forward-
3958+ path buffer, or the mail data buffer.
3959+
3960+ Syntax:
3961+
3962+ vrfy = "VRFY" SP String CRLF
3963+
3964+
3965+
3966+
3967+
3968+
3969+
3970+
3971+
3972+
3973+ Klensin Standards Track [Page 38]
3974+
3975+ RFC 5321 SMTP October 2008
3976+
3977+
3978+ 4.1.1.7. EXPAND (EXPN)
3979+
3980+ This command asks the receiver to confirm that the argument
3981+ identifies a mailing list, and if so, to return the membership of
3982+ that list. If the command is successful, a reply is returned
3983+ containing information as described in Section 3.5. This reply will
3984+ have multiple lines except in the trivial case of a one-member list.
3985+
3986+ This command has no effect on the reverse-path buffer, the forward-
3987+ path buffer, or the mail data buffer, and it may be issued at any
3988+ time.
3989+
3990+ Syntax:
3991+
3992+ expn = "EXPN" SP String CRLF
3993+
3994+ 4.1.1.8. HELP (HELP)
3995+
3996+ This command causes the server to send helpful information to the
3997+ client. The command MAY take an argument (e.g., any command name)
3998+ and return more specific information as a response.
3999+
4000+ This command has no effect on the reverse-path buffer, the forward-
4001+ path buffer, or the mail data buffer, and it may be issued at any
4002+ time.
4003+
4004+ SMTP servers SHOULD support HELP without arguments and MAY support it
4005+ with arguments.
4006+
4007+ Syntax:
4008+
4009+ help = "HELP" [ SP String ] CRLF
4010+
4011+
4012+
4013+
4014+
4015+
4016+
4017+
4018+
4019+
4020+
4021+
4022+
4023+
4024+
4025+
4026+
4027+
4028+
4029+ Klensin Standards Track [Page 39]
4030+
4031+ RFC 5321 SMTP October 2008
4032+
4033+
4034+ 4.1.1.9. NOOP (NOOP)
4035+
4036+ This command does not affect any parameters or previously entered
4037+ commands. It specifies no action other than that the receiver send a
4038+ "250 OK" reply.
4039+
4040+ This command has no effect on the reverse-path buffer, the forward-
4041+ path buffer, or the mail data buffer, and it may be issued at any
4042+ time. If a parameter string is specified, servers SHOULD ignore it.
4043+
4044+ Syntax:
4045+
4046+ noop = "NOOP" [ SP String ] CRLF
4047+
4048+ 4.1.1.10. QUIT (QUIT)
4049+
4050+ This command specifies that the receiver MUST send a "221 OK" reply,
4051+ and then close the transmission channel.
4052+
4053+ The receiver MUST NOT intentionally close the transmission channel
4054+ until it receives and replies to a QUIT command (even if there was an
4055+ error). The sender MUST NOT intentionally close the transmission
4056+ channel until it sends a QUIT command, and it SHOULD wait until it
4057+ receives the reply (even if there was an error response to a previous
4058+ command). If the connection is closed prematurely due to violations
4059+ of the above or system or network failure, the server MUST cancel any
4060+ pending transaction, but not undo any previously completed
4061+ transaction, and generally MUST act as if the command or transaction
4062+ in progress had received a temporary error (i.e., a 4yz response).
4063+
4064+ The QUIT command may be issued at any time. Any current uncompleted
4065+ mail transaction will be aborted.
4066+
4067+ Syntax:
4068+
4069+ quit = "QUIT" CRLF
4070+
4071+ 4.1.1.11. Mail-Parameter and Rcpt-Parameter Error Responses
4072+
4073+ If the server SMTP does not recognize or cannot implement one or more
4074+ of the parameters associated with a particular MAIL FROM or RCPT TO
4075+ command, it will return code 555.
4076+
4077+ If, for some reason, the server is temporarily unable to accommodate
4078+ one or more of the parameters associated with a MAIL FROM or RCPT TO
4079+ command, and if the definition of the specific parameter does not
4080+ mandate the use of another code, it should return code 455.
4081+
4082+
4083+
4084+
4085+ Klensin Standards Track [Page 40]
4086+
4087+ RFC 5321 SMTP October 2008
4088+
4089+
4090+ Errors specific to particular parameters and their values will be
4091+ specified in the parameter's defining RFC.
4092+
4093+ 4.1.2. Command Argument Syntax
4094+
4095+ The syntax of the argument clauses of the above commands (using the
4096+ syntax specified in RFC 5234 [7] where applicable) is given below.
4097+ Some of the productions given below are used only in conjunction with
4098+ source routes as described in Appendix C. Terminals not defined in
4099+ this document, such as ALPHA, DIGIT, SP, CR, LF, CRLF, are as defined
4100+ in the "core" syntax in Section 6 of RFC 5234 [7] or in the message
4101+ format syntax in RFC 5322 [4].
4102+
4103+ Reverse-path = Path / "<>"
4104+
4105+ Forward-path = Path
4106+
4107+ Path = "<" [ A-d-l ":" ] Mailbox ">"
4108+
4109+ A-d-l = At-domain *( "," At-domain )
4110+ ; Note that this form, the so-called "source
4111+ ; route", MUST BE accepted, SHOULD NOT be
4112+ ; generated, and SHOULD be ignored.
4113+
4114+ At-domain = "@" Domain
4115+
4116+ Mail-parameters = esmtp-param *(SP esmtp-param)
4117+
4118+ Rcpt-parameters = esmtp-param *(SP esmtp-param)
4119+
4120+ esmtp-param = esmtp-keyword ["=" esmtp-value]
4121+
4122+ esmtp-keyword = (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
4123+
4124+ esmtp-value = 1*(%d33-60 / %d62-126)
4125+ ; any CHAR excluding "=", SP, and control
4126+ ; characters. If this string is an email address,
4127+ ; i.e., a Mailbox, then the "xtext" syntax [32]
4128+ ; SHOULD be used.
4129+
4130+ Keyword = Ldh-str
4131+
4132+ Argument = Atom
4133+
4134+ Domain = sub-domain *("." sub-domain)
4135+
4136+
4137+
4138+
4139+
4140+
4141+ Klensin Standards Track [Page 41]
4142+
4143+ RFC 5321 SMTP October 2008
4144+
4145+
4146+ sub-domain = Let-dig [Ldh-str]
4147+
4148+ Let-dig = ALPHA / DIGIT
4149+
4150+ Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
4151+
4152+ address-literal = "[" ( IPv4-address-literal /
4153+ IPv6-address-literal /
4154+ General-address-literal ) "]"
4155+ ; See Section 4.1.3
4156+
4157+ Mailbox = Local-part "@" ( Domain / address-literal )
4158+
4159+ Local-part = Dot-string / Quoted-string
4160+ ; MAY be case-sensitive
4161+
4162+
4163+ Dot-string = Atom *("." Atom)
4164+
4165+ Atom = 1*atext
4166+
4167+ Quoted-string = DQUOTE *QcontentSMTP DQUOTE
4168+
4169+ QcontentSMTP = qtextSMTP / quoted-pairSMTP
4170+
4171+ quoted-pairSMTP = %d92 %d32-126
4172+ ; i.e., backslash followed by any ASCII
4173+ ; graphic (including itself) or SPace
4174+
4175+ qtextSMTP = %d32-33 / %d35-91 / %d93-126
4176+ ; i.e., within a quoted string, any
4177+ ; ASCII graphic or space is permitted
4178+ ; without blackslash-quoting except
4179+ ; double-quote and the backslash itself.
4180+
4181+ String = Atom / Quoted-string
4182+
4183+ While the above definition for Local-part is relatively permissive,
4184+ for maximum interoperability, a host that expects to receive mail
4185+ SHOULD avoid defining mailboxes where the Local-part requires (or
4186+ uses) the Quoted-string form or where the Local-part is case-
4187+ sensitive. For any purposes that require generating or comparing
4188+ Local-parts (e.g., to specific mailbox names), all quoted forms MUST
4189+ be treated as equivalent, and the sending system SHOULD transmit the
4190+ form that uses the minimum quoting possible.
4191+
4192+ Systems MUST NOT define mailboxes in such a way as to require the use
4193+ in SMTP of non-ASCII characters (octets with the high order bit set
4194+
4195+
4196+
4197+ Klensin Standards Track [Page 42]
4198+
4199+ RFC 5321 SMTP October 2008
4200+
4201+
4202+ to one) or ASCII "control characters" (decimal value 0-31 and 127).
4203+ These characters MUST NOT be used in MAIL or RCPT commands or other
4204+ commands that require mailbox names.
4205+
4206+ Note that the backslash, "\", is a quote character, which is used to
4207+ indicate that the next character is to be used literally (instead of
4208+ its normal interpretation). For example, "Joe\,Smith" indicates a
4209+ single nine-character user name string with the comma being the
4210+ fourth character of that string.
4211+
4212+ To promote interoperability and consistent with long-standing
4213+ guidance about conservative use of the DNS in naming and applications
4214+ (e.g., see Section 2.3.1 of the base DNS document, RFC 1035 [2]),
4215+ characters outside the set of alphabetic characters, digits, and
4216+ hyphen MUST NOT appear in domain name labels for SMTP clients or
4217+ servers. In particular, the underscore character is not permitted.
4218+ SMTP servers that receive a command in which invalid character codes
4219+ have been employed, and for which there are no other reasons for
4220+ rejection, MUST reject that command with a 501 response (this rule,
4221+ like others, could be overridden by appropriate SMTP extensions).
4222+
4223+ 4.1.3. Address Literals
4224+
4225+ Sometimes a host is not known to the domain name system and
4226+ communication (and, in particular, communication to report and repair
4227+ the error) is blocked. To bypass this barrier, a special literal
4228+ form of the address is allowed as an alternative to a domain name.
4229+ For IPv4 addresses, this form uses four small decimal integers
4230+ separated by dots and enclosed by brackets such as [123.255.37.2],
4231+ which indicates an (IPv4) Internet Address in sequence-of-octets
4232+ form. For IPv6 and other forms of addressing that might eventually
4233+ be standardized, the form consists of a standardized "tag" that
4234+ identifies the address syntax, a colon, and the address itself, in a
4235+ format specified as part of the relevant standards (i.e., RFC 4291
4236+ [8] for IPv6).
4237+
4238+ Specifically:
4239+
4240+ IPv4-address-literal = Snum 3("." Snum)
4241+
4242+ IPv6-address-literal = "IPv6:" IPv6-addr
4243+
4244+ General-address-literal = Standardized-tag ":" 1*dcontent
4245+
4246+ Standardized-tag = Ldh-str
4247+ ; Standardized-tag MUST be specified in a
4248+ ; Standards-Track RFC and registered with IANA
4249+
4250+
4251+
4252+
4253+ Klensin Standards Track [Page 43]
4254+
4255+ RFC 5321 SMTP October 2008
4256+
4257+
4258+ dcontent = %d33-90 / ; Printable US-ASCII
4259+ %d94-126 ; excl. "[", "\", "]"
4260+
4261+ Snum = 1*3DIGIT
4262+ ; representing a decimal integer
4263+ ; value in the range 0 through 255
4264+
4265+ IPv6-addr = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp
4266+
4267+ IPv6-hex = 1*4HEXDIG
4268+
4269+ IPv6-full = IPv6-hex 7(":" IPv6-hex)
4270+
4271+ IPv6-comp = [IPv6-hex *5(":" IPv6-hex)] "::"
4272+ [IPv6-hex *5(":" IPv6-hex)]
4273+ ; The "::" represents at least 2 16-bit groups of
4274+ ; zeros. No more than 6 groups in addition to the
4275+ ; "::" may be present.
4276+
4277+ IPv6v4-full = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal
4278+
4279+ IPv6v4-comp = [IPv6-hex *3(":" IPv6-hex)] "::"
4280+ [IPv6-hex *3(":" IPv6-hex) ":"]
4281+ IPv4-address-literal
4282+ ; The "::" represents at least 2 16-bit groups of
4283+ ; zeros. No more than 4 groups in addition to the
4284+ ; "::" and IPv4-address-literal may be present.
4285+
4286+ 4.1.4. Order of Commands
4287+
4288+ There are restrictions on the order in which these commands may be
4289+ used.
4290+
4291+ A session that will contain mail transactions MUST first be
4292+ initialized by the use of the EHLO command. An SMTP server SHOULD
4293+ accept commands for non-mail transactions (e.g., VRFY or EXPN)
4294+ without this initialization.
4295+
4296+ An EHLO command MAY be issued by a client later in the session. If
4297+ it is issued after the session begins and the EHLO command is
4298+ acceptable to the SMTP server, the SMTP server MUST clear all buffers
4299+ and reset the state exactly as if a RSET command had been issued. In
4300+ other words, the sequence of RSET followed immediately by EHLO is
4301+ redundant, but not harmful other than in the performance cost of
4302+ executing unnecessary commands.
4303+
4304+ If the EHLO command is not acceptable to the SMTP server, 501, 500,
4305+ 502, or 550 failure replies MUST be returned as appropriate. The
4306+
4307+
4308+
4309+ Klensin Standards Track [Page 44]
4310+
4311+ RFC 5321 SMTP October 2008
4312+
4313+
4314+ SMTP server MUST stay in the same state after transmitting these
4315+ replies that it was in before the EHLO was received.
4316+
4317+ The SMTP client MUST, if possible, ensure that the domain parameter
4318+ to the EHLO command is a primary host name as specified for this
4319+ command in Section 2.3.5. If this is not possible (e.g., when the
4320+ client's address is dynamically assigned and the client does not have
4321+ an obvious name), an address literal SHOULD be substituted for the
4322+ domain name.
4323+
4324+ An SMTP server MAY verify that the domain name argument in the EHLO
4325+ command actually corresponds to the IP address of the client.
4326+ However, if the verification fails, the server MUST NOT refuse to
4327+ accept a message on that basis. Information captured in the
4328+ verification attempt is for logging and tracing purposes. Note that
4329+ this prohibition applies to the matching of the parameter to its IP
4330+ address only; see Section 7.9 for a more extensive discussion of
4331+ rejecting incoming connections or mail messages.
4332+
4333+ The NOOP, HELP, EXPN, VRFY, and RSET commands can be used at any time
4334+ during a session, or without previously initializing a session. SMTP
4335+ servers SHOULD process these normally (that is, not return a 503
4336+ code) even if no EHLO command has yet been received; clients SHOULD
4337+ open a session with EHLO before sending these commands.
4338+
4339+ If these rules are followed, the example in RFC 821 that shows "550
4340+ access denied to you" in response to an EXPN command is incorrect
4341+ unless an EHLO command precedes the EXPN or the denial of access is
4342+ based on the client's IP address or other authentication or
4343+ authorization-determining mechanisms.
4344+
4345+ The MAIL command (or the obsolete SEND, SOML, or SAML commands)
4346+ begins a mail transaction. Once started, a mail transaction consists
4347+ of a transaction beginning command, one or more RCPT commands, and a
4348+ DATA command, in that order. A mail transaction may be aborted by
4349+ the RSET, a new EHLO, or the QUIT command. There may be zero or more
4350+ transactions in a session. MAIL (or SEND, SOML, or SAML) MUST NOT be
4351+ sent if a mail transaction is already open, i.e., it should be sent
4352+ only if no mail transaction had been started in the session, or if
4353+ the previous one successfully concluded with a successful DATA
4354+ command, or if the previous one was aborted, e.g., with a RSET or new
4355+ EHLO.
4356+
4357+ If the transaction beginning command argument is not acceptable, a
4358+ 501 failure reply MUST be returned and the SMTP server MUST stay in
4359+ the same state. If the commands in a transaction are out of order to
4360+ the degree that they cannot be processed by the server, a 503 failure
4361+
4362+
4363+
4364+
4365+ Klensin Standards Track [Page 45]
4366+
4367+ RFC 5321 SMTP October 2008
4368+
4369+
4370+ reply MUST be returned and the SMTP server MUST stay in the same
4371+ state.
4372+
4373+ The last command in a session MUST be the QUIT command. The QUIT
4374+ command SHOULD be used by the client SMTP to request connection
4375+ closure, even when no session opening command was sent and accepted.
4376+
4377+ 4.1.5. Private-Use Commands
4378+
4379+ As specified in Section 2.2.2, commands starting in "X" may be used
4380+ by bilateral agreement between the client (sending) and server
4381+ (receiving) SMTP agents. An SMTP server that does not recognize such
4382+ a command is expected to reply with "500 Command not recognized". An
4383+ extended SMTP server MAY list the feature names associated with these
4384+ private commands in the response to the EHLO command.
4385+
4386+ Commands sent or accepted by SMTP systems that do not start with "X"
4387+ MUST conform to the requirements of Section 2.2.2.
4388+
4389+ 4.2. SMTP Replies
4390+
4391+ Replies to SMTP commands serve to ensure the synchronization of
4392+ requests and actions in the process of mail transfer and to guarantee
4393+ that the SMTP client always knows the state of the SMTP server.
4394+ Every command MUST generate exactly one reply.
4395+
4396+ The details of the command-reply sequence are described in
4397+ Section 4.3.
4398+
4399+ An SMTP reply consists of a three digit number (transmitted as three
4400+ numeric characters) followed by some text unless specified otherwise
4401+ in this document. The number is for use by automata to determine
4402+ what state to enter next; the text is for the human user. The three
4403+ digits contain enough encoded information that the SMTP client need
4404+ not examine the text and may either discard it or pass it on to the
4405+ user, as appropriate. Exceptions are as noted elsewhere in this
4406+ document. In particular, the 220, 221, 251, 421, and 551 reply codes
4407+ are associated with message text that must be parsed and interpreted
4408+ by machines. In the general case, the text may be receiver dependent
4409+ and context dependent, so there are likely to be varying texts for
4410+ each reply code. A discussion of the theory of reply codes is given
4411+ in Section 4.2.1. Formally, a reply is defined to be the sequence: a
4412+ three-digit code, <SP>, one line of text, and <CRLF>, or a multiline
4413+ reply (as defined in the same section). Since, in violation of this
4414+ specification, the text is sometimes not sent, clients that do not
4415+ receive it SHOULD be prepared to process the code alone (with or
4416+ without a trailing space character). Only the EHLO, EXPN, and HELP
4417+ commands are expected to result in multiline replies in normal
4418+
4419+
4420+
4421+ Klensin Standards Track [Page 46]
4422+
4423+ RFC 5321 SMTP October 2008
4424+
4425+
4426+ circumstances; however, multiline replies are allowed for any
4427+ command.
4428+
4429+ In ABNF, server responses are:
4430+
4431+ Greeting = ( "220 " (Domain / address-literal)
4432+ [ SP textstring ] CRLF ) /
4433+ ( "220-" (Domain / address-literal)
4434+ [ SP textstring ] CRLF
4435+ *( "220-" [ textstring ] CRLF )
4436+ "220" [ SP textstring ] CRLF )
4437+
4438+ textstring = 1*(%d09 / %d32-126) ; HT, SP, Printable US-ASCII
4439+
4440+ Reply-line = *( Reply-code "-" [ textstring ] CRLF )
4441+ Reply-code [ SP textstring ] CRLF
4442+
4443+ Reply-code = %x32-35 %x30-35 %x30-39
4444+
4445+ where "Greeting" appears only in the 220 response that announces that
4446+ the server is opening its part of the connection. (Other possible
4447+ server responses upon connection follow the syntax of Reply-line.)
4448+
4449+ An SMTP server SHOULD send only the reply codes listed in this
4450+ document. An SMTP server SHOULD use the text shown in the examples
4451+ whenever appropriate.
4452+
4453+ An SMTP client MUST determine its actions only by the reply code, not
4454+ by the text (except for the "change of address" 251 and 551 and, if
4455+ necessary, 220, 221, and 421 replies); in the general case, any text,
4456+ including no text at all (although senders SHOULD NOT send bare
4457+ codes), MUST be acceptable. The space (blank) following the reply
4458+ code is considered part of the text. Whenever possible, a receiver-
4459+ SMTP SHOULD test the first digit (severity indication) of the reply
4460+ code.
4461+
4462+ The list of codes that appears below MUST NOT be construed as
4463+ permanent. While the addition of new codes should be a rare and
4464+ significant activity, with supplemental information in the textual
4465+ part of the response being preferred, new codes may be added as the
4466+ result of new Standards or Standards-Track specifications.
4467+ Consequently, a sender-SMTP MUST be prepared to handle codes not
4468+ specified in this document and MUST do so by interpreting the first
4469+ digit only.
4470+
4471+ In the absence of extensions negotiated with the client, SMTP servers
4472+ MUST NOT send reply codes whose first digits are other than 2, 3, 4,
4473+
4474+
4475+
4476+
4477+ Klensin Standards Track [Page 47]
4478+
4479+ RFC 5321 SMTP October 2008
4480+
4481+
4482+ or 5. Clients that receive such out-of-range codes SHOULD normally
4483+ treat them as fatal errors and terminate the mail transaction.
4484+
4485+ 4.2.1. Reply Code Severities and Theory
4486+
4487+ The three digits of the reply each have a special significance. The
4488+ first digit denotes whether the response is good, bad, or incomplete.
4489+ An unsophisticated SMTP client, or one that receives an unexpected
4490+ code, will be able to determine its next action (proceed as planned,
4491+ redo, retrench, etc.) by examining this first digit. An SMTP client
4492+ that wants to know approximately what kind of error occurred (e.g.,
4493+ mail system error, command syntax error) may examine the second
4494+ digit. The third digit and any supplemental information that may be
4495+ present is reserved for the finest gradation of information.
4496+
4497+ There are four values for the first digit of the reply code:
4498+
4499+ 2yz Positive Completion reply
4500+ The requested action has been successfully completed. A new
4501+ request may be initiated.
4502+
4503+ 3yz Positive Intermediate reply
4504+ The command has been accepted, but the requested action is being
4505+ held in abeyance, pending receipt of further information. The
4506+ SMTP client should send another command specifying this
4507+ information. This reply is used in command sequence groups (i.e.,
4508+ in DATA).
4509+
4510+ 4yz Transient Negative Completion reply
4511+ The command was not accepted, and the requested action did not
4512+ occur. However, the error condition is temporary, and the action
4513+ may be requested again. The sender should return to the beginning
4514+ of the command sequence (if any). It is difficult to assign a
4515+ meaning to "transient" when two different sites (receiver- and
4516+ sender-SMTP agents) must agree on the interpretation. Each reply
4517+ in this category might have a different time value, but the SMTP
4518+ client SHOULD try again. A rule of thumb to determine whether a
4519+ reply fits into the 4yz or the 5yz category (see below) is that
4520+ replies are 4yz if they can be successful if repeated without any
4521+ change in command form or in properties of the sender or receiver
4522+ (that is, the command is repeated identically and the receiver
4523+ does not put up a new implementation).
4524+
4525+ 5yz Permanent Negative Completion reply
4526+ The command was not accepted and the requested action did not
4527+ occur. The SMTP client SHOULD NOT repeat the exact request (in
4528+ the same sequence). Even some "permanent" error conditions can be
4529+ corrected, so the human user may want to direct the SMTP client to
4530+
4531+
4532+
4533+ Klensin Standards Track [Page 48]
4534+
4535+ RFC 5321 SMTP October 2008
4536+
4537+
4538+ reinitiate the command sequence by direct action at some point in
4539+ the future (e.g., after the spelling has been changed, or the user
4540+ has altered the account status).
4541+
4542+ It is worth noting that the file transfer protocol (FTP) [34] uses a
4543+ very similar code architecture and that the SMTP codes are based on
4544+ the FTP model. However, SMTP uses a one-command, one-response model
4545+ (while FTP is asynchronous) and FTP's 1yz codes are not part of the
4546+ SMTP model.
4547+
4548+ The second digit encodes responses in specific categories:
4549+
4550+ x0z Syntax: These replies refer to syntax errors, syntactically
4551+ correct commands that do not fit any functional category, and
4552+ unimplemented or superfluous commands.
4553+
4554+ x1z Information: These are replies to requests for information, such
4555+ as status or help.
4556+
4557+ x2z Connections: These are replies referring to the transmission
4558+ channel.
4559+
4560+ x3z Unspecified.
4561+
4562+ x4z Unspecified.
4563+
4564+ x5z Mail system: These replies indicate the status of the receiver
4565+ mail system vis-a-vis the requested transfer or other mail system
4566+ action.
4567+
4568+ The third digit gives a finer gradation of meaning in each category
4569+ specified by the second digit. The list of replies illustrates this.
4570+ Each reply text is recommended rather than mandatory, and may even
4571+ change according to the command with which it is associated. On the
4572+ other hand, the reply codes must strictly follow the specifications
4573+ in this section. Receiver implementations should not invent new
4574+ codes for slightly different situations from the ones described here,
4575+ but rather adapt codes already defined.
4576+
4577+ For example, a command such as NOOP, whose successful execution does
4578+ not offer the SMTP client any new information, will return a 250
4579+ reply. The reply is 502 when the command requests an unimplemented
4580+ non-site-specific action. A refinement of that is the 504 reply for
4581+ a command that is implemented, but that requests an unimplemented
4582+ parameter.
4583+
4584+
4585+
4586+
4587+
4588+
4589+ Klensin Standards Track [Page 49]
4590+
4591+ RFC 5321 SMTP October 2008
4592+
4593+
4594+ The reply text may be longer than a single line; in these cases the
4595+ complete text must be marked so the SMTP client knows when it can
4596+ stop reading the reply. This requires a special format to indicate a
4597+ multiple line reply.
4598+
4599+ The format for multiline replies requires that every line, except the
4600+ last, begin with the reply code, followed immediately by a hyphen,
4601+ "-" (also known as minus), followed by text. The last line will
4602+ begin with the reply code, followed immediately by <SP>, optionally
4603+ some text, and <CRLF>. As noted above, servers SHOULD send the <SP>
4604+ if subsequent text is not sent, but clients MUST be prepared for it
4605+ to be omitted.
4606+
4607+ For example:
4608+
4609+ 250-First line
4610+ 250-Second line
4611+ 250-234 Text beginning with numbers
4612+ 250 The last line
4613+
4614+ In a multiline reply, the reply code on each of the lines MUST be the
4615+ same. It is reasonable for the client to rely on this, so it can
4616+ make processing decisions based on the code in any line, assuming
4617+ that all others will be the same. In a few cases, there is important
4618+ data for the client in the reply "text". The client will be able to
4619+ identify these cases from the current context.
4620+
4621+ 4.2.2. Reply Codes by Function Groups
4622+
4623+ 500 Syntax error, command unrecognized (This may include errors such
4624+ as command line too long)
4625+
4626+ 501 Syntax error in parameters or arguments
4627+
4628+ 502 Command not implemented (see Section 4.2.4)
4629+
4630+ 503 Bad sequence of commands
4631+
4632+ 504 Command parameter not implemented
4633+
4634+
4635+ 211 System status, or system help reply
4636+
4637+ 214 Help message (Information on how to use the receiver or the
4638+ meaning of a particular non-standard command; this reply is useful
4639+ only to the human user)
4640+
4641+
4642+
4643+
4644+
4645+ Klensin Standards Track [Page 50]
4646+
4647+ RFC 5321 SMTP October 2008
4648+
4649+
4650+ 220 <domain> Service ready
4651+
4652+ 221 <domain> Service closing transmission channel
4653+
4654+ 421 <domain> Service not available, closing transmission channel
4655+ (This may be a reply to any command if the service knows it must
4656+ shut down)
4657+
4658+
4659+ 250 Requested mail action okay, completed
4660+
4661+ 251 User not local; will forward to <forward-path> (See Section 3.4)
4662+
4663+ 252 Cannot VRFY user, but will accept message and attempt delivery
4664+ (See Section 3.5.3)
4665+
4666+ 455 Server unable to accommodate parameters
4667+
4668+ 555 MAIL FROM/RCPT TO parameters not recognized or not implemented
4669+
4670+ 450 Requested mail action not taken: mailbox unavailable (e.g.,
4671+ mailbox busy or temporarily blocked for policy reasons)
4672+
4673+ 550 Requested action not taken: mailbox unavailable (e.g., mailbox
4674+ not found, no access, or command rejected for policy reasons)
4675+
4676+ 451 Requested action aborted: error in processing
4677+
4678+ 551 User not local; please try <forward-path> (See Section 3.4)
4679+
4680+ 452 Requested action not taken: insufficient system storage
4681+
4682+ 552 Requested mail action aborted: exceeded storage allocation
4683+
4684+ 553 Requested action not taken: mailbox name not allowed (e.g.,
4685+ mailbox syntax incorrect)
4686+
4687+ 354 Start mail input; end with <CRLF>.<CRLF>
4688+
4689+ 554 Transaction failed (Or, in the case of a connection-opening
4690+ response, "No SMTP service here")
4691+
4692+
4693+
4694+
4695+
4696+
4697+
4698+
4699+
4700+
4701+ Klensin Standards Track [Page 51]
4702+
4703+ RFC 5321 SMTP October 2008
4704+
4705+
4706+ 4.2.3. Reply Codes in Numeric Order
4707+
4708+ 211 System status, or system help reply
4709+
4710+ 214 Help message (Information on how to use the receiver or the
4711+ meaning of a particular non-standard command; this reply is useful
4712+ only to the human user)
4713+
4714+ 220 <domain> Service ready
4715+
4716+ 221 <domain> Service closing transmission channel
4717+
4718+ 250 Requested mail action okay, completed
4719+
4720+ 251 User not local; will forward to <forward-path> (See Section 3.4)
4721+
4722+ 252 Cannot VRFY user, but will accept message and attempt delivery
4723+ (See Section 3.5.3)
4724+
4725+ 354 Start mail input; end with <CRLF>.<CRLF>
4726+
4727+ 421 <domain> Service not available, closing transmission channel
4728+ (This may be a reply to any command if the service knows it must
4729+ shut down)
4730+
4731+ 450 Requested mail action not taken: mailbox unavailable (e.g.,
4732+ mailbox busy or temporarily blocked for policy reasons)
4733+
4734+ 451 Requested action aborted: local error in processing
4735+
4736+ 452 Requested action not taken: insufficient system storage
4737+
4738+ 455 Server unable to accommodate parameters
4739+
4740+ 500 Syntax error, command unrecognized (This may include errors such
4741+ as command line too long)
4742+
4743+ 501 Syntax error in parameters or arguments
4744+
4745+ 502 Command not implemented (see Section 4.2.4)
4746+
4747+ 503 Bad sequence of commands
4748+
4749+ 504 Command parameter not implemented
4750+
4751+ 550 Requested action not taken: mailbox unavailable (e.g., mailbox
4752+ not found, no access, or command rejected for policy reasons)
4753+
4754+
4755+
4756+
4757+ Klensin Standards Track [Page 52]
4758+
4759+ RFC 5321 SMTP October 2008
4760+
4761+
4762+ 551 User not local; please try <forward-path> (See Section 3.4)
4763+
4764+ 552 Requested mail action aborted: exceeded storage allocation
4765+
4766+ 553 Requested action not taken: mailbox name not allowed (e.g.,
4767+ mailbox syntax incorrect)
4768+
4769+ 554 Transaction failed (Or, in the case of a connection-opening
4770+ response, "No SMTP service here")
4771+
4772+ 555 MAIL FROM/RCPT TO parameters not recognized or not implemented
4773+
4774+ 4.2.4. Reply Code 502
4775+
4776+ Questions have been raised as to when reply code 502 (Command not
4777+ implemented) SHOULD be returned in preference to other codes. 502
4778+ SHOULD be used when the command is actually recognized by the SMTP
4779+ server, but not implemented. If the command is not recognized, code
4780+ 500 SHOULD be returned. Extended SMTP systems MUST NOT list
4781+ capabilities in response to EHLO for which they will return 502 (or
4782+ 500) replies.
4783+
4784+ 4.2.5. Reply Codes after DATA and the Subsequent <CRLF>.<CRLF>
4785+
4786+ When an SMTP server returns a positive completion status (2yz code)
4787+ after the DATA command is completed with <CRLF>.<CRLF>, it accepts
4788+ responsibility for:
4789+
4790+ o delivering the message (if the recipient mailbox exists), or
4791+
4792+ o if attempts to deliver the message fail due to transient
4793+ conditions, retrying delivery some reasonable number of times at
4794+ intervals as specified in Section 4.5.4.
4795+
4796+ o if attempts to deliver the message fail due to permanent
4797+ conditions, or if repeated attempts to deliver the message fail
4798+ due to transient conditions, returning appropriate notification to
4799+ the sender of the original message (using the address in the SMTP
4800+ MAIL command).
4801+
4802+ When an SMTP server returns a temporary error status (4yz) code after
4803+ the DATA command is completed with <CRLF>.<CRLF>, it MUST NOT make a
4804+ subsequent attempt to deliver that message. The SMTP client retains
4805+ responsibility for the delivery of that message and may either return
4806+ it to the user or requeue it for a subsequent attempt (see
4807+ Section 4.5.4.1).
4808+
4809+
4810+
4811+
4812+
4813+ Klensin Standards Track [Page 53]
4814+
4815+ RFC 5321 SMTP October 2008
4816+
4817+
4818+ The user who originated the message SHOULD be able to interpret the
4819+ return of a transient failure status (by mail message or otherwise)
4820+ as a non-delivery indication, just as a permanent failure would be
4821+ interpreted. If the client SMTP successfully handles these
4822+ conditions, the user will not receive such a reply.
4823+
4824+ When an SMTP server returns a permanent error status (5yz) code after
4825+ the DATA command is completed with <CRLF>.<CRLF>, it MUST NOT make
4826+ any subsequent attempt to deliver the message. As with temporary
4827+ error status codes, the SMTP client retains responsibility for the
4828+ message, but SHOULD not again attempt delivery to the same server
4829+ without user review of the message and response and appropriate
4830+ intervention.
4831+
4832+ 4.3. Sequencing of Commands and Replies
4833+
4834+ 4.3.1. Sequencing Overview
4835+
4836+ The communication between the sender and receiver is an alternating
4837+ dialogue, controlled by the sender. As such, the sender issues a
4838+ command and the receiver responds with a reply. Unless other
4839+ arrangements are negotiated through service extensions, the sender
4840+ MUST wait for this response before sending further commands. One
4841+ important reply is the connection greeting. Normally, a receiver
4842+ will send a 220 "Service ready" reply when the connection is
4843+ completed. The sender SHOULD wait for this greeting message before
4844+ sending any commands.
4845+
4846+ Note: all the greeting-type replies have the official name (the
4847+ fully-qualified primary domain name) of the server host as the first
4848+ word following the reply code. Sometimes the host will have no
4849+ meaningful name. See Section 4.1.3 for a discussion of alternatives
4850+ in these situations.
4851+
4852+ For example,
4853+
4854+ 220 ISIF.USC.EDU Service ready
4855+
4856+ or
4857+
4858+ 220 mail.example.com SuperSMTP v 6.1.2 Service ready
4859+
4860+ or
4861+
4862+ 220 [10.0.0.1] Clueless host service ready
4863+
4864+ The table below lists alternative success and failure replies for
4865+ each command. These SHOULD be strictly adhered to. A receiver MAY
4866+
4867+
4868+
4869+ Klensin Standards Track [Page 54]
4870+
4871+ RFC 5321 SMTP October 2008
4872+
4873+
4874+ substitute text in the replies, but the meanings and actions implied
4875+ by the code numbers and by the specific command reply sequence MUST
4876+ be preserved.
4877+
4878+ 4.3.2. Command-Reply Sequences
4879+
4880+ Each command is listed with its usual possible replies. The prefixes
4881+ used before the possible replies are "I" for intermediate, "S" for
4882+ success, and "E" for error. Since some servers may generate other
4883+ replies under special circumstances, and to allow for future
4884+ extension, SMTP clients SHOULD, when possible, interpret only the
4885+ first digit of the reply and MUST be prepared to deal with
4886+ unrecognized reply codes by interpreting the first digit only.
4887+ Unless extended using the mechanisms described in Section 2.2, SMTP
4888+ servers MUST NOT transmit reply codes to an SMTP client that are
4889+ other than three digits or that do not start in a digit between 2 and
4890+ 5 inclusive.
4891+
4892+ These sequencing rules and, in principle, the codes themselves, can
4893+ be extended or modified by SMTP extensions offered by the server and
4894+ accepted (requested) by the client. However, if the target is more
4895+ precise granularity in the codes, rather than codes for completely
4896+ new purposes, the system described in RFC 3463 [25] SHOULD be used in
4897+ preference to the invention of new codes.
4898+
4899+ In addition to the codes listed below, any SMTP command can return
4900+ any of the following codes if the corresponding unusual circumstances
4901+ are encountered:
4902+
4903+ 500 For the "command line too long" case or if the command name was
4904+ not recognized. Note that producing a "command not recognized"
4905+ error in response to the required subset of these commands is a
4906+ violation of this specification. Similarly, producing a "command
4907+ too long" message for a command line shorter than 512 characters
4908+ would violate the provisions of Section 4.5.3.1.4.
4909+
4910+ 501 Syntax error in command or arguments. In order to provide for
4911+ future extensions, commands that are specified in this document as
4912+ not accepting arguments (DATA, RSET, QUIT) SHOULD return a 501
4913+ message if arguments are supplied in the absence of EHLO-
4914+ advertised extensions.
4915+
4916+ 421 Service shutting down and closing transmission channel
4917+
4918+
4919+
4920+
4921+
4922+
4923+
4924+
4925+ Klensin Standards Track [Page 55]
4926+
4927+ RFC 5321 SMTP October 2008
4928+
4929+
4930+ Specific sequences are:
4931+
4932+ CONNECTION ESTABLISHMENT
4933+
4934+ S: 220
4935+ E: 554
4936+
4937+ EHLO or HELO
4938+
4939+ S: 250
4940+ E: 504 (a conforming implementation could return this code only
4941+ in fairly obscure cases), 550, 502 (permitted only with an old-
4942+ style server that does not support EHLO)
4943+
4944+ MAIL
4945+
4946+ S: 250
4947+ E: 552, 451, 452, 550, 553, 503, 455, 555
4948+
4949+ RCPT
4950+
4951+ S: 250, 251 (but see Section 3.4 for discussion of 251 and 551)
4952+ E: 550, 551, 552, 553, 450, 451, 452, 503, 455, 555
4953+
4954+ DATA
4955+
4956+ I: 354 -> data -> S: 250
4957+
4958+ E: 552, 554, 451, 452
4959+
4960+ E: 450, 550 (rejections for policy reasons)
4961+
4962+ E: 503, 554
4963+
4964+ RSET
4965+
4966+ S: 250
4967+
4968+ VRFY
4969+
4970+ S: 250, 251, 252
4971+ E: 550, 551, 553, 502, 504
4972+
4973+ EXPN
4974+
4975+ S: 250, 252
4976+ E: 550, 500, 502, 504
4977+
4978+
4979+
4980+
4981+ Klensin Standards Track [Page 56]
4982+
4983+ RFC 5321 SMTP October 2008
4984+
4985+
4986+ HELP
4987+
4988+ S: 211, 214
4989+ E: 502, 504
4990+
4991+ NOOP
4992+
4993+ S: 250
4994+
4995+ QUIT
4996+
4997+ S: 221
4998+
4999+ 4.4. Trace Information
5000+
5001+ When an SMTP server receives a message for delivery or further
5002+ processing, it MUST insert trace ("time stamp" or "Received")
5003+ information at the beginning of the message content, as discussed in
5004+ Section 4.1.1.4.
5005+
5006+ This line MUST be structured as follows:
5007+
5008+ o The FROM clause, which MUST be supplied in an SMTP environment,
5009+ SHOULD contain both (1) the name of the source host as presented
5010+ in the EHLO command and (2) an address literal containing the IP
5011+ address of the source, determined from the TCP connection.
5012+
5013+ o The ID clause MAY contain an "@" as suggested in RFC 822, but this
5014+ is not required.
5015+
5016+ o If the FOR clause appears, it MUST contain exactly one <path>
5017+ entry, even when multiple RCPT commands have been given. Multiple
5018+ <path>s raise some security issues and have been deprecated, see
5019+ Section 7.2.
5020+
5021+ An Internet mail program MUST NOT change or delete a Received: line
5022+ that was previously added to the message header section. SMTP
5023+ servers MUST prepend Received lines to messages; they MUST NOT change
5024+ the order of existing lines or insert Received lines in any other
5025+ location.
5026+
5027+ As the Internet grows, comparability of Received header fields is
5028+ important for detecting problems, especially slow relays. SMTP
5029+ servers that create Received header fields SHOULD use explicit
5030+ offsets in the dates (e.g., -0800), rather than time zone names of
5031+ any type. Local time (with an offset) SHOULD be used rather than UT
5032+ when feasible. This formulation allows slightly more information
5033+ about local circumstances to be specified. If UT is needed, the
5034+
5035+
5036+
5037+ Klensin Standards Track [Page 57]
5038+
5039+ RFC 5321 SMTP October 2008
5040+
5041+
5042+ receiver need merely do some simple arithmetic to convert the values.
5043+ Use of UT loses information about the time zone-location of the
5044+ server. If it is desired to supply a time zone name, it SHOULD be
5045+ included in a comment.
5046+
5047+ When the delivery SMTP server makes the "final delivery" of a
5048+ message, it inserts a return-path line at the beginning of the mail
5049+ data. This use of return-path is required; mail systems MUST support
5050+ it. The return-path line preserves the information in the <reverse-
5051+ path> from the MAIL command. Here, final delivery means the message
5052+ has left the SMTP environment. Normally, this would mean it had been
5053+ delivered to the destination user or an associated mail drop, but in
5054+ some cases it may be further processed and transmitted by another
5055+ mail system.
5056+
5057+ It is possible for the mailbox in the return path to be different
5058+ from the actual sender's mailbox, for example, if error responses are
5059+ to be delivered to a special error handling mailbox rather than to
5060+ the message sender. When mailing lists are involved, this
5061+ arrangement is common and useful as a means of directing errors to
5062+ the list maintainer rather than the message originator.
5063+
5064+ The text above implies that the final mail data will begin with a
5065+ return path line, followed by one or more time stamp lines. These
5066+ lines will be followed by the rest of the mail data: first the
5067+ balance of the mail header section and then the body (RFC 5322 [4]).
5068+
5069+ It is sometimes difficult for an SMTP server to determine whether or
5070+ not it is making final delivery since forwarding or other operations
5071+ may occur after the message is accepted for delivery. Consequently,
5072+ any further (forwarding, gateway, or relay) systems MAY remove the
5073+ return path and rebuild the MAIL command as needed to ensure that
5074+ exactly one such line appears in a delivered message.
5075+
5076+ A message-originating SMTP system SHOULD NOT send a message that
5077+ already contains a Return-path header field. SMTP servers performing
5078+ a relay function MUST NOT inspect the message data, and especially
5079+ not to the extent needed to determine if Return-path header fields
5080+ are present. SMTP servers making final delivery MAY remove Return-
5081+ path header fields before adding their own.
5082+
5083+ The primary purpose of the Return-path is to designate the address to
5084+ which messages indicating non-delivery or other mail system failures
5085+ are to be sent. For this to be unambiguous, exactly one return path
5086+ SHOULD be present when the message is delivered. Systems using RFC
5087+ 822 syntax with non-SMTP transports SHOULD designate an unambiguous
5088+ address, associated with the transport envelope, to which error
5089+ reports (e.g., non-delivery messages) should be sent.
5090+
5091+
5092+
5093+ Klensin Standards Track [Page 58]
5094+
5095+ RFC 5321 SMTP October 2008
5096+
5097+
5098+ Historical note: Text in RFC 822 that appears to contradict the use
5099+ of the Return-path header field (or the envelope reverse-path address
5100+ from the MAIL command) as the destination for error messages is not
5101+ applicable on the Internet. The reverse-path address (as copied into
5102+ the Return-path) MUST be used as the target of any mail containing
5103+ delivery error messages.
5104+
5105+ In particular:
5106+ o a gateway from SMTP -> elsewhere SHOULD insert a return-path
5107+ header field, unless it is known that the "elsewhere" transport
5108+ also uses Internet domain addresses and maintains the envelope
5109+ sender address separately.
5110+
5111+ o a gateway from elsewhere -> SMTP SHOULD delete any return-path
5112+ header field present in the message, and either copy that
5113+ information to the SMTP envelope or combine it with information
5114+ present in the envelope of the other transport system to construct
5115+ the reverse-path argument to the MAIL command in the SMTP
5116+ envelope.
5117+
5118+ The server must give special treatment to cases in which the
5119+ processing following the end of mail data indication is only
5120+ partially successful. This could happen if, after accepting several
5121+ recipients and the mail data, the SMTP server finds that the mail
5122+ data could be successfully delivered to some, but not all, of the
5123+ recipients. In such cases, the response to the DATA command MUST be
5124+ an OK reply. However, the SMTP server MUST compose and send an
5125+ "undeliverable mail" notification message to the originator of the
5126+ message.
5127+
5128+ A single notification listing all of the failed recipients or
5129+ separate notification messages MUST be sent for each failed
5130+ recipient. For economy of processing by the sender, the former
5131+ SHOULD be used when possible. Note that the key difference between
5132+ handling aliases (Section 3.9.1) and forwarding (this subsection) is
5133+ the change to the backward-pointing address in this case. All
5134+ notification messages about undeliverable mail MUST be sent using the
5135+ MAIL command (even if they result from processing the obsolete SEND,
5136+ SOML, or SAML commands) and MUST use a null return path as discussed
5137+ in Section 3.6.
5138+
5139+ The time stamp line and the return path line are formally defined as
5140+ follows (the definitions for "FWS" and "CFWS" appear in RFC 5322
5141+ [4]):
5142+
5143+ Return-path-line = "Return-Path:" FWS Reverse-path <CRLF>
5144+
5145+ Time-stamp-line = "Received:" FWS Stamp <CRLF>
5146+
5147+
5148+
5149+ Klensin Standards Track [Page 59]
5150+
5151+ RFC 5321 SMTP October 2008
5152+
5153+
5154+ Stamp = From-domain By-domain Opt-info [CFWS] ";"
5155+ FWS date-time
5156+ ; where "date-time" is as defined in RFC 5322 [4]
5157+ ; but the "obs-" forms, especially two-digit
5158+ ; years, are prohibited in SMTP and MUST NOT be used.
5159+
5160+ From-domain = "FROM" FWS Extended-Domain
5161+
5162+ By-domain = CFWS "BY" FWS Extended-Domain
5163+
5164+ Extended-Domain = Domain /
5165+ ( Domain FWS "(" TCP-info ")" ) /
5166+ ( address-literal FWS "(" TCP-info ")" )
5167+
5168+ TCP-info = address-literal / ( Domain FWS address-literal )
5169+ ; Information derived by server from TCP connection
5170+ ; not client EHLO.
5171+
5172+ Opt-info = [Via] [With] [ID] [For]
5173+ [Additional-Registered-Clauses]
5174+
5175+ Via = CFWS "VIA" FWS Link
5176+
5177+ With = CFWS "WITH" FWS Protocol
5178+
5179+ ID = CFWS "ID" FWS ( Atom / msg-id )
5180+ ; msg-id is defined in RFC 5322 [4]
5181+
5182+ For = CFWS "FOR" FWS ( Path / Mailbox )
5183+
5184+ Additional-Registered-Clauses = CFWS Atom FWS String
5185+ ; Additional standard clauses may be
5186+ added in this
5187+ ; location by future standards and
5188+ registration with
5189+ ; IANA. SMTP servers SHOULD NOT use
5190+ unregistered
5191+ ; names. See Section 8.
5192+
5193+ Link = "TCP" / Addtl-Link
5194+
5195+ Addtl-Link = Atom
5196+ ; Additional standard names for links are
5197+ ; registered with the Internet Assigned Numbers
5198+ ; Authority (IANA). "Via" is primarily of value
5199+ ; with non-Internet transports. SMTP servers
5200+ ; SHOULD NOT use unregistered names.
5201+
5202+
5203+
5204+
5205+ Klensin Standards Track [Page 60]
5206+
5207+ RFC 5321 SMTP October 2008
5208+
5209+
5210+ Protocol = "ESMTP" / "SMTP" / Attdl-Protocol
5211+
5212+ Attdl-Protocol = Atom
5213+ ; Additional standard names for protocols are
5214+ ; registered with the Internet Assigned Numbers
5215+ ; Authority (IANA) in the "mail parameters"
5216+ ; registry [9]. SMTP servers SHOULD NOT
5217+ ; use unregistered names.
5218+
5219+ 4.5. Additional Implementation Issues
5220+
5221+ 4.5.1. Minimum Implementation
5222+
5223+ In order to make SMTP workable, the following minimum implementation
5224+ MUST be provided by all receivers. The following commands MUST be
5225+ supported to conform to this specification:
5226+
5227+ EHLO
5228+ HELO
5229+ MAIL
5230+ RCPT
5231+ DATA
5232+ RSET
5233+ NOOP
5234+ QUIT
5235+ VRFY
5236+
5237+ Any system that includes an SMTP server supporting mail relaying or
5238+ delivery MUST support the reserved mailbox "postmaster" as a case-
5239+ insensitive local name. This postmaster address is not strictly
5240+ necessary if the server always returns 554 on connection opening (as
5241+ described in Section 3.1). The requirement to accept mail for
5242+ postmaster implies that RCPT commands that specify a mailbox for
5243+ postmaster at any of the domains for which the SMTP server provides
5244+ mail service, as well as the special case of "RCPT TO:<Postmaster>"
5245+ (with no domain specification), MUST be supported.
5246+
5247+ SMTP systems are expected to make every reasonable effort to accept
5248+ mail directed to Postmaster from any other system on the Internet.
5249+ In extreme cases -- such as to contain a denial of service attack or
5250+ other breach of security -- an SMTP server may block mail directed to
5251+ Postmaster. However, such arrangements SHOULD be narrowly tailored
5252+ so as to avoid blocking messages that are not part of such attacks.
5253+
5254+
5255+
5256+
5257+
5258+
5259+
5260+
5261+ Klensin Standards Track [Page 61]
5262+
5263+ RFC 5321 SMTP October 2008
5264+
5265+
5266+ 4.5.2. Transparency
5267+
5268+ Without some provision for data transparency, the character sequence
5269+ "<CRLF>.<CRLF>" ends the mail text and cannot be sent by the user.
5270+ In general, users are not aware of such "forbidden" sequences. To
5271+ allow all user composed text to be transmitted transparently, the
5272+ following procedures are used:
5273+
5274+ o Before sending a line of mail text, the SMTP client checks the
5275+ first character of the line. If it is a period, one additional
5276+ period is inserted at the beginning of the line.
5277+
5278+ o When a line of mail text is received by the SMTP server, it checks
5279+ the line. If the line is composed of a single period, it is
5280+ treated as the end of mail indicator. If the first character is a
5281+ period and there are other characters on the line, the first
5282+ character is deleted.
5283+
5284+ The mail data may contain any of the 128 ASCII characters. All
5285+ characters are to be delivered to the recipient's mailbox, including
5286+ spaces, vertical and horizontal tabs, and other control characters.
5287+ If the transmission channel provides an 8-bit byte (octet) data
5288+ stream, the 7-bit ASCII codes are transmitted, right justified, in
5289+ the octets, with the high-order bits cleared to zero. See
5290+ Section 3.6 for special treatment of these conditions in SMTP systems
5291+ serving a relay function.
5292+
5293+ In some systems, it may be necessary to transform the data as it is
5294+ received and stored. This may be necessary for hosts that use a
5295+ different character set than ASCII as their local character set, that
5296+ store data in records rather than strings, or which use special
5297+ character sequences as delimiters inside mailboxes. If such
5298+ transformations are necessary, they MUST be reversible, especially if
5299+ they are applied to mail being relayed.
5300+
5301+ 4.5.3. Sizes and Timeouts
5302+
5303+ 4.5.3.1. Size Limits and Minimums
5304+
5305+ There are several objects that have required minimum/maximum sizes.
5306+ Every implementation MUST be able to receive objects of at least
5307+ these sizes. Objects larger than these sizes SHOULD be avoided when
5308+ possible. However, some Internet mail constructs such as encoded
5309+ X.400 addresses (RFC 2156 [35]) will often require larger objects.
5310+ Clients MAY attempt to transmit these, but MUST be prepared for a
5311+ server to reject them if they cannot be handled by it. To the
5312+ maximum extent possible, implementation techniques that impose no
5313+ limits on the length of these objects should be used.
5314+
5315+
5316+
5317+ Klensin Standards Track [Page 62]
5318+
5319+ RFC 5321 SMTP October 2008
5320+
5321+
5322+ Extensions to SMTP may involve the use of characters that occupy more
5323+ than a single octet each. This section therefore specifies lengths
5324+ in octets where absolute lengths, rather than character counts, are
5325+ intended.
5326+
5327+ 4.5.3.1.1. Local-part
5328+
5329+ The maximum total length of a user name or other local-part is 64
5330+ octets.
5331+
5332+ 4.5.3.1.2. Domain
5333+
5334+ The maximum total length of a domain name or number is 255 octets.
5335+
5336+ 4.5.3.1.3. Path
5337+
5338+ The maximum total length of a reverse-path or forward-path is 256
5339+ octets (including the punctuation and element separators).
5340+
5341+ 4.5.3.1.4. Command Line
5342+
5343+ The maximum total length of a command line including the command word
5344+ and the <CRLF> is 512 octets. SMTP extensions may be used to
5345+ increase this limit.
5346+
5347+ 4.5.3.1.5. Reply Line
5348+
5349+ The maximum total length of a reply line including the reply code and
5350+ the <CRLF> is 512 octets. More information may be conveyed through
5351+ multiple-line replies.
5352+
5353+ 4.5.3.1.6. Text Line
5354+
5355+ The maximum total length of a text line including the <CRLF> is 1000
5356+ octets (not counting the leading dot duplicated for transparency).
5357+ This number may be increased by the use of SMTP Service Extensions.
5358+
5359+ 4.5.3.1.7. Message Content
5360+
5361+ The maximum total length of a message content (including any message
5362+ header section as well as the message body) MUST BE at least 64K
5363+ octets. Since the introduction of Internet Standards for multimedia
5364+ mail (RFC 2045 [21]), message lengths on the Internet have grown
5365+ dramatically, and message size restrictions should be avoided if at
5366+ all possible. SMTP server systems that must impose restrictions
5367+ SHOULD implement the "SIZE" service extension of RFC 1870 [10], and
5368+ SMTP client systems that will send large messages SHOULD utilize it
5369+ when possible.
5370+
5371+
5372+
5373+ Klensin Standards Track [Page 63]
5374+
5375+ RFC 5321 SMTP October 2008
5376+
5377+
5378+ 4.5.3.1.8. Recipients Buffer
5379+
5380+ The minimum total number of recipients that MUST be buffered is 100
5381+ recipients. Rejection of messages (for excessive recipients) with
5382+ fewer than 100 RCPT commands is a violation of this specification.
5383+ The general principle that relaying SMTP server MUST NOT, and
5384+ delivery SMTP servers SHOULD NOT, perform validation tests on message
5385+ header fields suggests that messages SHOULD NOT be rejected based on
5386+ the total number of recipients shown in header fields. A server that
5387+ imposes a limit on the number of recipients MUST behave in an orderly
5388+ fashion, such as rejecting additional addresses over its limit rather
5389+ than silently discarding addresses previously accepted. A client
5390+ that needs to deliver a message containing over 100 RCPT commands
5391+ SHOULD be prepared to transmit in 100-recipient "chunks" if the
5392+ server declines to accept more than 100 recipients in a single
5393+ message.
5394+
5395+ 4.5.3.1.9. Treatment When Limits Exceeded
5396+
5397+ Errors due to exceeding these limits may be reported by using the
5398+ reply codes. Some examples of reply codes are:
5399+
5400+ 500 Line too long.
5401+
5402+ or
5403+
5404+ 501 Path too long
5405+
5406+ or
5407+
5408+ 452 Too many recipients (see below)
5409+
5410+ or
5411+
5412+ 552 Too much mail data.
5413+
5414+ 4.5.3.1.10. Too Many Recipients Code
5415+
5416+ RFC 821 [1] incorrectly listed the error where an SMTP server
5417+ exhausts its implementation limit on the number of RCPT commands
5418+ ("too many recipients") as having reply code 552. The correct reply
5419+ code for this condition is 452. Clients SHOULD treat a 552 code in
5420+ this case as a temporary, rather than permanent, failure so the logic
5421+ below works.
5422+
5423+ When a conforming SMTP server encounters this condition, it has at
5424+ least 100 successful RCPT commands in its recipients buffer. If the
5425+ server is able to accept the message, then at least these 100
5426+
5427+
5428+
5429+ Klensin Standards Track [Page 64]
5430+
5431+ RFC 5321 SMTP October 2008
5432+
5433+
5434+ addresses will be removed from the SMTP client's queue. When the
5435+ client attempts retransmission of those addresses that received 452
5436+ responses, at least 100 of these will be able to fit in the SMTP
5437+ server's recipients buffer. Each retransmission attempt that is able
5438+ to deliver anything will be able to dispose of at least 100 of these
5439+ recipients.
5440+
5441+ If an SMTP server has an implementation limit on the number of RCPT
5442+ commands and this limit is exhausted, it MUST use a response code of
5443+ 452 (but the client SHOULD also be prepared for a 552, as noted
5444+ above). If the server has a configured site-policy limitation on the
5445+ number of RCPT commands, it MAY instead use a 5yz response code. In
5446+ particular, if the intent is to prohibit messages with more than a
5447+ site-specified number of recipients, rather than merely limit the
5448+ number of recipients in a given mail transaction, it would be
5449+ reasonable to return a 503 response to any DATA command received
5450+ subsequent to the 452 (or 552) code or to simply return the 503 after
5451+ DATA without returning any previous negative response.
5452+
5453+ 4.5.3.2. Timeouts
5454+
5455+ An SMTP client MUST provide a timeout mechanism. It MUST use per-
5456+ command timeouts rather than somehow trying to time the entire mail
5457+ transaction. Timeouts SHOULD be easily reconfigurable, preferably
5458+ without recompiling the SMTP code. To implement this, a timer is set
5459+ for each SMTP command and for each buffer of the data transfer. The
5460+ latter means that the overall timeout is inherently proportional to
5461+ the size of the message.
5462+
5463+ Based on extensive experience with busy mail-relay hosts, the minimum
5464+ per-command timeout values SHOULD be as follows:
5465+
5466+ 4.5.3.2.1. Initial 220 Message: 5 Minutes
5467+
5468+ An SMTP client process needs to distinguish between a failed TCP
5469+ connection and a delay in receiving the initial 220 greeting message.
5470+ Many SMTP servers accept a TCP connection but delay delivery of the
5471+ 220 message until their system load permits more mail to be
5472+ processed.
5473+
5474+ 4.5.3.2.2. MAIL Command: 5 Minutes
5475+
5476+ 4.5.3.2.3. RCPT Command: 5 Minutes
5477+
5478+ A longer timeout is required if processing of mailing lists and
5479+ aliases is not deferred until after the message was accepted.
5480+
5481+
5482+
5483+
5484+
5485+ Klensin Standards Track [Page 65]
5486+
5487+ RFC 5321 SMTP October 2008
5488+
5489+
5490+ 4.5.3.2.4. DATA Initiation: 2 Minutes
5491+
5492+ This is while awaiting the "354 Start Input" reply to a DATA command.
5493+
5494+ 4.5.3.2.5. Data Block: 3 Minutes
5495+
5496+ This is while awaiting the completion of each TCP SEND call
5497+ transmitting a chunk of data.
5498+
5499+ 4.5.3.2.6. DATA Termination: 10 Minutes.
5500+
5501+ This is while awaiting the "250 OK" reply. When the receiver gets
5502+ the final period terminating the message data, it typically performs
5503+ processing to deliver the message to a user mailbox. A spurious
5504+ timeout at this point would be very wasteful and would typically
5505+ result in delivery of multiple copies of the message, since it has
5506+ been successfully sent and the server has accepted responsibility for
5507+ delivery. See Section 6.1 for additional discussion.
5508+
5509+ 4.5.3.2.7. Server Timeout: 5 Minutes.
5510+
5511+ An SMTP server SHOULD have a timeout of at least 5 minutes while it
5512+ is awaiting the next command from the sender.
5513+
5514+ 4.5.4. Retry Strategies
5515+
5516+ The common structure of a host SMTP implementation includes user
5517+ mailboxes, one or more areas for queuing messages in transit, and one
5518+ or more daemon processes for sending and receiving mail. The exact
5519+ structure will vary depending on the needs of the users on the host
5520+ and the number and size of mailing lists supported by the host. We
5521+ describe several optimizations that have proved helpful, particularly
5522+ for mailers supporting high traffic levels.
5523+
5524+ Any queuing strategy MUST include timeouts on all activities on a
5525+ per-command basis. A queuing strategy MUST NOT send error messages
5526+ in response to error messages under any circumstances.
5527+
5528+ 4.5.4.1. Sending Strategy
5529+
5530+ The general model for an SMTP client is one or more processes that
5531+ periodically attempt to transmit outgoing mail. In a typical system,
5532+ the program that composes a message has some method for requesting
5533+ immediate attention for a new piece of outgoing mail, while mail that
5534+ cannot be transmitted immediately MUST be queued and periodically
5535+ retried by the sender. A mail queue entry will include not only the
5536+ message itself but also the envelope information.
5537+
5538+
5539+
5540+
5541+ Klensin Standards Track [Page 66]
5542+
5543+ RFC 5321 SMTP October 2008
5544+
5545+
5546+ The sender MUST delay retrying a particular destination after one
5547+ attempt has failed. In general, the retry interval SHOULD be at
5548+ least 30 minutes; however, more sophisticated and variable strategies
5549+ will be beneficial when the SMTP client can determine the reason for
5550+ non-delivery.
5551+
5552+ Retries continue until the message is transmitted or the sender gives
5553+ up; the give-up time generally needs to be at least 4-5 days. It MAY
5554+ be appropriate to set a shorter maximum number of retries for non-
5555+ delivery notifications and equivalent error messages than for
5556+ standard messages. The parameters to the retry algorithm MUST be
5557+ configurable.
5558+
5559+ A client SHOULD keep a list of hosts it cannot reach and
5560+ corresponding connection timeouts, rather than just retrying queued
5561+ mail items.
5562+
5563+ Experience suggests that failures are typically transient (the target
5564+ system or its connection has crashed), favoring a policy of two
5565+ connection attempts in the first hour the message is in the queue,
5566+ and then backing off to one every two or three hours.
5567+
5568+ The SMTP client can shorten the queuing delay in cooperation with the
5569+ SMTP server. For example, if mail is received from a particular
5570+ address, it is likely that mail queued for that host can now be sent.
5571+ Application of this principle may, in many cases, eliminate the
5572+ requirement for an explicit "send queues now" function such as ETRN,
5573+ RFC 1985 [36].
5574+
5575+ The strategy may be further modified as a result of multiple
5576+ addresses per host (see below) to optimize delivery time versus
5577+ resource usage.
5578+
5579+ An SMTP client may have a large queue of messages for each
5580+ unavailable destination host. If all of these messages were retried
5581+ in every retry cycle, there would be excessive Internet overhead and
5582+ the sending system would be blocked for a long period. Note that an
5583+ SMTP client can generally determine that a delivery attempt has
5584+ failed only after a timeout of several minutes, and even a one-minute
5585+ timeout per connection will result in a very large delay if retries
5586+ are repeated for dozens, or even hundreds, of queued messages to the
5587+ same host.
5588+
5589+ At the same time, SMTP clients SHOULD use great care in caching
5590+ negative responses from servers. In an extreme case, if EHLO is
5591+ issued multiple times during the same SMTP connection, different
5592+ answers may be returned by the server. More significantly, 5yz
5593+ responses to the MAIL command MUST NOT be cached.
5594+
5595+
5596+
5597+ Klensin Standards Track [Page 67]
5598+
5599+ RFC 5321 SMTP October 2008
5600+
5601+
5602+ When a mail message is to be delivered to multiple recipients, and
5603+ the SMTP server to which a copy of the message is to be sent is the
5604+ same for multiple recipients, then only one copy of the message
5605+ SHOULD be transmitted. That is, the SMTP client SHOULD use the
5606+ command sequence: MAIL, RCPT, RCPT, ..., RCPT, DATA instead of the
5607+ sequence: MAIL, RCPT, DATA, ..., MAIL, RCPT, DATA. However, if there
5608+ are very many addresses, a limit on the number of RCPT commands per
5609+ MAIL command MAY be imposed. This efficiency feature SHOULD be
5610+ implemented.
5611+
5612+ Similarly, to achieve timely delivery, the SMTP client MAY support
5613+ multiple concurrent outgoing mail transactions. However, some limit
5614+ may be appropriate to protect the host from devoting all its
5615+ resources to mail.
5616+
5617+ 4.5.4.2. Receiving Strategy
5618+
5619+ The SMTP server SHOULD attempt to keep a pending listen on the SMTP
5620+ port (specified by IANA as port 25) at all times. This requires the
5621+ support of multiple incoming TCP connections for SMTP. Some limit
5622+ MAY be imposed, but servers that cannot handle more than one SMTP
5623+ transaction at a time are not in conformance with the intent of this
5624+ specification.
5625+
5626+ As discussed above, when the SMTP server receives mail from a
5627+ particular host address, it could activate its own SMTP queuing
5628+ mechanisms to retry any mail pending for that host address.
5629+
5630+ 4.5.5. Messages with a Null Reverse-Path
5631+
5632+ There are several types of notification messages that are required by
5633+ existing and proposed Standards to be sent with a null reverse-path,
5634+ namely non-delivery notifications as discussed in Section 3.7, other
5635+ kinds of Delivery Status Notifications (DSNs, RFC 3461 [32]), and
5636+ Message Disposition Notifications (MDNs, RFC 3798 [37]). All of
5637+ these kinds of messages are notifications about a previous message,
5638+ and they are sent to the reverse-path of the previous mail message.
5639+ (If the delivery of such a notification message fails, that usually
5640+ indicates a problem with the mail system of the host to which the
5641+ notification message is addressed. For this reason, at some hosts
5642+ the MTA is set up to forward such failed notification messages to
5643+ someone who is able to fix problems with the mail system, e.g., via
5644+ the postmaster alias.)
5645+
5646+ All other types of messages (i.e., any message which is not required
5647+ by a Standards-Track RFC to have a null reverse-path) SHOULD be sent
5648+ with a valid, non-null reverse-path.
5649+
5650+
5651+
5652+
5653+ Klensin Standards Track [Page 68]
5654+
5655+ RFC 5321 SMTP October 2008
5656+
5657+
5658+ Implementers of automated email processors should be careful to make
5659+ sure that the various kinds of messages with a null reverse-path are
5660+ handled correctly. In particular, such systems SHOULD NOT reply to
5661+ messages with a null reverse-path, and they SHOULD NOT add a non-null
5662+ reverse-path, or change a null reverse-path to a non-null one, to
5663+ such messages when forwarding.
5664+
5665+ 5. Address Resolution and Mail Handling
5666+
5667+ 5.1. Locating the Target Host
5668+
5669+ Once an SMTP client lexically identifies a domain to which mail will
5670+ be delivered for processing (as described in Sections 2.3.5 and 3.6),
5671+ a DNS lookup MUST be performed to resolve the domain name (RFC 1035
5672+ [2]). The names are expected to be fully-qualified domain names
5673+ (FQDNs): mechanisms for inferring FQDNs from partial names or local
5674+ aliases are outside of this specification. Due to a history of
5675+ problems, SMTP servers used for initial submission of messages SHOULD
5676+ NOT make such inferences (Message Submission Servers [18] have
5677+ somewhat more flexibility) and intermediate (relay) SMTP servers MUST
5678+ NOT make them.
5679+
5680+ The lookup first attempts to locate an MX record associated with the
5681+ name. If a CNAME record is found, the resulting name is processed as
5682+ if it were the initial name. If a non-existent domain error is
5683+ returned, this situation MUST be reported as an error. If a
5684+ temporary error is returned, the message MUST be queued and retried
5685+ later (see Section 4.5.4.1). If an empty list of MXs is returned,
5686+ the address is treated as if it was associated with an implicit MX
5687+ RR, with a preference of 0, pointing to that host. If MX records are
5688+ present, but none of them are usable, or the implicit MX is unusable,
5689+ this situation MUST be reported as an error.
5690+
5691+ If one or more MX RRs are found for a given name, SMTP systems MUST
5692+ NOT utilize any address RRs associated with that name unless they are
5693+ located using the MX RRs; the "implicit MX" rule above applies only
5694+ if there are no MX records present. If MX records are present, but
5695+ none of them are usable, this situation MUST be reported as an error.
5696+
5697+ When a domain name associated with an MX RR is looked up and the
5698+ associated data field obtained, the data field of that response MUST
5699+ contain a domain name. That domain name, when queried, MUST return
5700+ at least one address record (e.g., A or AAAA RR) that gives the IP
5701+ address of the SMTP server to which the message should be directed.
5702+ Any other response, specifically including a value that will return a
5703+ CNAME record when queried, lies outside the scope of this Standard.
5704+ The prohibition on labels in the data that resolve to CNAMEs is
5705+ discussed in more detail in RFC 2181, Section 10.3 [38].
5706+
5707+
5708+
5709+ Klensin Standards Track [Page 69]
5710+
5711+ RFC 5321 SMTP October 2008
5712+
5713+
5714+ When the lookup succeeds, the mapping can result in a list of
5715+ alternative delivery addresses rather than a single address, because
5716+ of multiple MX records, multihoming, or both. To provide reliable
5717+ mail transmission, the SMTP client MUST be able to try (and retry)
5718+ each of the relevant addresses in this list in order, until a
5719+ delivery attempt succeeds. However, there MAY also be a configurable
5720+ limit on the number of alternate addresses that can be tried. In any
5721+ case, the SMTP client SHOULD try at least two addresses.
5722+
5723+ Two types of information are used to rank the host addresses:
5724+ multiple MX records, and multihomed hosts.
5725+
5726+ MX records contain a preference indication that MUST be used in
5727+ sorting if more than one such record appears (see below). Lower
5728+ numbers are more preferred than higher ones. If there are multiple
5729+ destinations with the same preference and there is no clear reason to
5730+ favor one (e.g., by recognition of an easily reached address), then
5731+ the sender-SMTP MUST randomize them to spread the load across
5732+ multiple mail exchangers for a specific organization.
5733+
5734+ The destination host (perhaps taken from the preferred MX record) may
5735+ be multihomed, in which case the domain name resolver will return a
5736+ list of alternative IP addresses. It is the responsibility of the
5737+ domain name resolver interface to have ordered this list by
5738+ decreasing preference if necessary, and the SMTP sender MUST try them
5739+ in the order presented.
5740+
5741+ Although the capability to try multiple alternative addresses is
5742+ required, specific installations may want to limit or disable the use
5743+ of alternative addresses. The question of whether a sender should
5744+ attempt retries using the different addresses of a multihomed host
5745+ has been controversial. The main argument for using the multiple
5746+ addresses is that it maximizes the probability of timely delivery,
5747+ and indeed sometimes the probability of any delivery; the counter-
5748+ argument is that it may result in unnecessary resource use. Note
5749+ that resource use is also strongly determined by the sending strategy
5750+ discussed in Section 4.5.4.1.
5751+
5752+ If an SMTP server receives a message with a destination for which it
5753+ is a designated Mail eXchanger, it MAY relay the message (potentially
5754+ after having rewritten the MAIL FROM and/or RCPT TO addresses), make
5755+ final delivery of the message, or hand it off using some mechanism
5756+ outside the SMTP-provided transport environment. Of course, neither
5757+ of the latter require that the list of MX records be examined
5758+ further.
5759+
5760+ If it determines that it should relay the message without rewriting
5761+ the address, it MUST sort the MX records to determine candidates for
5762+
5763+
5764+
5765+ Klensin Standards Track [Page 70]
5766+
5767+ RFC 5321 SMTP October 2008
5768+
5769+
5770+ delivery. The records are first ordered by preference, with the
5771+ lowest-numbered records being most preferred. The relay host MUST
5772+ then inspect the list for any of the names or addresses by which it
5773+ might be known in mail transactions. If a matching record is found,
5774+ all records at that preference level and higher-numbered ones MUST be
5775+ discarded from consideration. If there are no records left at that
5776+ point, it is an error condition, and the message MUST be returned as
5777+ undeliverable. If records do remain, they SHOULD be tried, best
5778+ preference first, as described above.
5779+
5780+ 5.2. IPv6 and MX Records
5781+
5782+ In the contemporary Internet, SMTP clients and servers may be hosted
5783+ on IPv4 systems, IPv6 systems, or dual-stack systems that are
5784+ compatible with either version of the Internet Protocol. The host
5785+ domains to which MX records point may, consequently, contain "A RR"s
5786+ (IPv4), "AAAA RR"s (IPv6), or any combination of them. While RFC
5787+ 3974 [39] discusses some operational experience in mixed
5788+ environments, it was not comprehensive enough to justify
5789+ standardization, and some of its recommendations appear to be
5790+ inconsistent with this specification. The appropriate actions to be
5791+ taken either will depend on local circumstances, such as performance
5792+ of the relevant networks and any conversions that might be necessary,
5793+ or will be obvious (e.g., an IPv6-only client need not attempt to
5794+ look up A RRs or attempt to reach IPv4-only servers). Designers of
5795+ SMTP implementations that might run in IPv6 or dual-stack
5796+ environments should study the procedures above, especially the
5797+ comments about multihomed hosts, and, preferably, provide mechanisms
5798+ to facilitate operational tuning and mail interoperability between
5799+ IPv4 and IPv6 systems while considering local circumstances.
5800+
5801+ 6. Problem Detection and Handling
5802+
5803+ 6.1. Reliable Delivery and Replies by Email
5804+
5805+ When the receiver-SMTP accepts a piece of mail (by sending a "250 OK"
5806+ message in response to DATA), it is accepting responsibility for
5807+ delivering or relaying the message. It must take this responsibility
5808+ seriously. It MUST NOT lose the message for frivolous reasons, such
5809+ as because the host later crashes or because of a predictable
5810+ resource shortage. Some reasons that are not considered frivolous
5811+ are discussed in the next subsection and in Section 7.8.
5812+
5813+ If there is a delivery failure after acceptance of a message, the
5814+ receiver-SMTP MUST formulate and mail a notification message. This
5815+ notification MUST be sent using a null ("<>") reverse-path in the
5816+ envelope. The recipient of this notification MUST be the address
5817+ from the envelope return path (or the Return-Path: line). However,
5818+
5819+
5820+
5821+ Klensin Standards Track [Page 71]
5822+
5823+ RFC 5321 SMTP October 2008
5824+
5825+
5826+ if this address is null ("<>"), the receiver-SMTP MUST NOT send a
5827+ notification. Obviously, nothing in this section can or should
5828+ prohibit local decisions (i.e., as part of the same system
5829+ environment as the receiver-SMTP) to log or otherwise transmit
5830+ information about null address events locally if that is desired. If
5831+ the address is an explicit source route, it MUST be stripped down to
5832+ its final hop.
5833+
5834+ For example, suppose that an error notification must be sent for a
5835+ message that arrived with:
5836+
5837+ MAIL FROM:<@a,@b:user@d>
5838+
5839+ The notification message MUST be sent using:
5840+
5841+ RCPT TO:<user@d>
5842+
5843+ Some delivery failures after the message is accepted by SMTP will be
5844+ unavoidable. For example, it may be impossible for the receiving
5845+ SMTP server to validate all the delivery addresses in RCPT command(s)
5846+ due to a "soft" domain system error, because the target is a mailing
5847+ list (see earlier discussion of RCPT), or because the server is
5848+ acting as a relay and has no immediate access to the delivering
5849+ system.
5850+
5851+ To avoid receiving duplicate messages as the result of timeouts, a
5852+ receiver-SMTP MUST seek to minimize the time required to respond to
5853+ the final <CRLF>.<CRLF> end of data indicator. See RFC 1047 [40] for
5854+ a discussion of this problem.
5855+
5856+ 6.2. Unwanted, Unsolicited, and "Attack" Messages
5857+
5858+ Utility and predictability of the Internet mail system requires that
5859+ messages that can be delivered should be delivered, regardless of any
5860+ syntax or other faults associated with those messages and regardless
5861+ of their content. If they cannot be delivered, and cannot be
5862+ rejected by the SMTP server during the SMTP transaction, they should
5863+ be "bounced" (returned with non-delivery notification messages) as
5864+ described above. In today's world, in which many SMTP server
5865+ operators have discovered that the quantity of undesirable bulk email
5866+ vastly exceeds the quantity of desired mail and in which accepting a
5867+ message may trigger additional undesirable traffic by providing
5868+ verification of the address, those principles may not be practical.
5869+
5870+ As discussed in Section 7.8 and Section 7.9 below, dropping mail
5871+ without notification of the sender is permitted in practice.
5872+ However, it is extremely dangerous and violates a long tradition and
5873+ community expectations that mail is either delivered or returned. If
5874+
5875+
5876+
5877+ Klensin Standards Track [Page 72]
5878+
5879+ RFC 5321 SMTP October 2008
5880+
5881+
5882+ silent message-dropping is misused, it could easily undermine
5883+ confidence in the reliability of the Internet's mail systems. So
5884+ silent dropping of messages should be considered only in those cases
5885+ where there is very high confidence that the messages are seriously
5886+ fraudulent or otherwise inappropriate.
5887+
5888+ To stretch the principle of delivery if possible even further, it may
5889+ be a rational policy to not deliver mail that has an invalid return
5890+ address, although the history of the network is that users are
5891+ typically better served by delivering any message that can be
5892+ delivered. Reliably determining that a return address is invalid can
5893+ be a difficult and time-consuming process, especially if the putative
5894+ sending system is not directly accessible or does not fully and
5895+ accurately support VRFY and, even if a "drop messages with invalid
5896+ return addresses" policy is adopted, it SHOULD be applied only when
5897+ there is near-certainty that the return addresses are, in fact,
5898+ invalid.
5899+
5900+ Conversely, if a message is rejected because it is found to contain
5901+ hostile content (a decision that is outside the scope of an SMTP
5902+ server as defined in this document), rejection ("bounce") messages
5903+ SHOULD NOT be sent unless the receiving site is confident that those
5904+ messages will be usefully delivered. The preference and default in
5905+ these cases is to avoid sending non-delivery messages when the
5906+ incoming message is determined to contain hostile content.
5907+
5908+ 6.3. Loop Detection
5909+
5910+ Simple counting of the number of "Received:" header fields in a
5911+ message has proven to be an effective, although rarely optimal,
5912+ method of detecting loops in mail systems. SMTP servers using this
5913+ technique SHOULD use a large rejection threshold, normally at least
5914+ 100 Received entries. Whatever mechanisms are used, servers MUST
5915+ contain provisions for detecting and stopping trivial loops.
5916+
5917+ 6.4. Compensating for Irregularities
5918+
5919+ Unfortunately, variations, creative interpretations, and outright
5920+ violations of Internet mail protocols do occur; some would suggest
5921+ that they occur quite frequently. The debate as to whether a well-
5922+ behaved SMTP receiver or relay should reject a malformed message,
5923+ attempt to pass it on unchanged, or attempt to repair it to increase
5924+ the odds of successful delivery (or subsequent reply) began almost
5925+ with the dawn of structured network mail and shows no signs of
5926+ abating. Advocates of rejection claim that attempted repairs are
5927+ rarely completely adequate and that rejection of bad messages is the
5928+ only way to get the offending software repaired. Advocates of
5929+ "repair" or "deliver no matter what" argue that users prefer that
5930+
5931+
5932+
5933+ Klensin Standards Track [Page 73]
5934+
5935+ RFC 5321 SMTP October 2008
5936+
5937+
5938+ mail go through it if at all possible and that there are significant
5939+ market pressures in that direction. In practice, these market
5940+ pressures may be more important to particular vendors than strict
5941+ conformance to the standards, regardless of the preference of the
5942+ actual developers.
5943+
5944+ The problems associated with ill-formed messages were exacerbated by
5945+ the introduction of the split-UA mail reading protocols (Post Office
5946+ Protocol (POP) version 2 [15], Post Office Protocol (POP) version 3
5947+ [16], IMAP version 2 [41], and PCMAIL [42]). These protocols
5948+ encouraged the use of SMTP as a posting (message submission)
5949+ protocol, and SMTP servers as relay systems for these client hosts
5950+ (which are often only intermittently connected to the Internet).
5951+ Historically, many of those client machines lacked some of the
5952+ mechanisms and information assumed by SMTP (and indeed, by the mail
5953+ format protocol, RFC 822 [28]). Some could not keep adequate track
5954+ of time; others had no concept of time zones; still others could not
5955+ identify their own names or addresses; and, of course, none could
5956+ satisfy the assumptions that underlay RFC 822's conception of
5957+ authenticated addresses.
5958+
5959+ In response to these weak SMTP clients, many SMTP systems now
5960+ complete messages that are delivered to them in incomplete or
5961+ incorrect form. This strategy is generally considered appropriate
5962+ when the server can identify or authenticate the client, and there
5963+ are prior agreements between them. By contrast, there is at best
5964+ great concern about fixes applied by a relay or delivery SMTP server
5965+ that has little or no knowledge of the user or client machine. Many
5966+ of these issues are addressed by using a separate protocol, such as
5967+ that defined in RFC 4409 [18], for message submission, rather than
5968+ using originating SMTP servers for that purpose.
5969+
5970+ The following changes to a message being processed MAY be applied
5971+ when necessary by an originating SMTP server, or one used as the
5972+ target of SMTP as an initial posting (message submission) protocol:
5973+
5974+ o Addition of a message-id field when none appears
5975+
5976+ o Addition of a date, time, or time zone when none appears
5977+
5978+ o Correction of addresses to proper FQDN format
5979+
5980+ The less information the server has about the client, the less likely
5981+ these changes are to be correct and the more caution and conservatism
5982+ should be applied when considering whether or not to perform fixes
5983+ and how. These changes MUST NOT be applied by an SMTP server that
5984+ provides an intermediate relay function.
5985+
5986+
5987+
5988+
5989+ Klensin Standards Track [Page 74]
5990+
5991+ RFC 5321 SMTP October 2008
5992+
5993+
5994+ In all cases, properly operating clients supplying correct
5995+ information are preferred to corrections by the SMTP server. In all
5996+ cases, documentation SHOULD be provided in trace header fields and/or
5997+ header field comments for actions performed by the servers.
5998+
5999+ 7. Security Considerations
6000+
6001+ 7.1. Mail Security and Spoofing
6002+
6003+ SMTP mail is inherently insecure in that it is feasible for even
6004+ fairly casual users to negotiate directly with receiving and relaying
6005+ SMTP servers and create messages that will trick a naive recipient
6006+ into believing that they came from somewhere else. Constructing such
6007+ a message so that the "spoofed" behavior cannot be detected by an
6008+ expert is somewhat more difficult, but not sufficiently so as to be a
6009+ deterrent to someone who is determined and knowledgeable.
6010+ Consequently, as knowledge of Internet mail increases, so does the
6011+ knowledge that SMTP mail inherently cannot be authenticated, or
6012+ integrity checks provided, at the transport level. Real mail
6013+ security lies only in end-to-end methods involving the message
6014+ bodies, such as those that use digital signatures (see RFC 1847 [43]
6015+ and, e.g., Pretty Good Privacy (PGP) in RFC 4880 [44] or Secure/
6016+ Multipurpose Internet Mail Extensions (S/MIME) in RFC 3851 [45]).
6017+
6018+ Various protocol extensions and configuration options that provide
6019+ authentication at the transport level (e.g., from an SMTP client to
6020+ an SMTP server) improve somewhat on the traditional situation
6021+ described above. However, in general, they only authenticate one
6022+ server to another rather than a chain of relays and servers, much
6023+ less authenticating users or user machines. Consequently, unless
6024+ they are accompanied by careful handoffs of responsibility in a
6025+ carefully designed trust environment, they remain inherently weaker
6026+ than end-to-end mechanisms that use digitally signed messages rather
6027+ than depending on the integrity of the transport system.
6028+
6029+ Efforts to make it more difficult for users to set envelope return
6030+ path and header "From" fields to point to valid addresses other than
6031+ their own are largely misguided: they frustrate legitimate
6032+ applications in which mail is sent by one user on behalf of another,
6033+ in which error (or normal) replies should be directed to a special
6034+ address, or in which a single message is sent to multiple recipients
6035+ on different hosts. (Systems that provide convenient ways for users
6036+ to alter these header fields on a per-message basis should attempt to
6037+ establish a primary and permanent mailbox address for the user so
6038+ that Sender header fields within the message data can be generated
6039+ sensibly.)
6040+
6041+
6042+
6043+
6044+
6045+ Klensin Standards Track [Page 75]
6046+
6047+ RFC 5321 SMTP October 2008
6048+
6049+
6050+ This specification does not further address the authentication issues
6051+ associated with SMTP other than to advocate that useful functionality
6052+ not be disabled in the hope of providing some small margin of
6053+ protection against a user who is trying to fake mail.
6054+
6055+ 7.2. "Blind" Copies
6056+
6057+ Addresses that do not appear in the message header section may appear
6058+ in the RCPT commands to an SMTP server for a number of reasons. The
6059+ two most common involve the use of a mailing address as a "list
6060+ exploder" (a single address that resolves into multiple addresses)
6061+ and the appearance of "blind copies". Especially when more than one
6062+ RCPT command is present, and in order to avoid defeating some of the
6063+ purpose of these mechanisms, SMTP clients and servers SHOULD NOT copy
6064+ the full set of RCPT command arguments into the header section,
6065+ either as part of trace header fields or as informational or private-
6066+ extension header fields. Since this rule is often violated in
6067+ practice, and cannot be enforced, sending SMTP systems that are aware
6068+ of "bcc" use MAY find it helpful to send each blind copy as a
6069+ separate message transaction containing only a single RCPT command.
6070+
6071+ There is no inherent relationship between either "reverse" (from
6072+ MAIL, SAML, etc., commands) or "forward" (RCPT) addresses in the SMTP
6073+ transaction ("envelope") and the addresses in the header section.
6074+ Receiving systems SHOULD NOT attempt to deduce such relationships and
6075+ use them to alter the header section of the message for delivery.
6076+ The popular "Apparently-to" header field is a violation of this
6077+ principle as well as a common source of unintended information
6078+ disclosure and SHOULD NOT be used.
6079+
6080+ 7.3. VRFY, EXPN, and Security
6081+
6082+ As discussed in Section 3.5, individual sites may want to disable
6083+ either or both of VRFY or EXPN for security reasons (see below). As
6084+ a corollary to the above, implementations that permit this MUST NOT
6085+ appear to have verified addresses that are not, in fact, verified.
6086+ If a site disables these commands for security reasons, the SMTP
6087+ server MUST return a 252 response, rather than a code that could be
6088+ confused with successful or unsuccessful verification.
6089+
6090+ Returning a 250 reply code with the address listed in the VRFY
6091+ command after having checked it only for syntax violates this rule.
6092+ Of course, an implementation that "supports" VRFY by always returning
6093+ 550 whether or not the address is valid is equally not in
6094+ conformance.
6095+
6096+ On the public Internet, the contents of mailing lists have become
6097+ popular as an address information source for so-called "spammers."
6098+
6099+
6100+
6101+ Klensin Standards Track [Page 76]
6102+
6103+ RFC 5321 SMTP October 2008
6104+
6105+
6106+ The use of EXPN to "harvest" addresses has increased as list
6107+ administrators have installed protections against inappropriate uses
6108+ of the lists themselves. However, VRFY and EXPN are still useful for
6109+ authenticated users and within an administrative domain. For
6110+ example, VRFY and EXPN are useful for performing internal audits of
6111+ how email gets routed to check and to make sure no one is
6112+ automatically forwarding sensitive mail outside the organization.
6113+ Sites implementing SMTP authentication may choose to make VRFY and
6114+ EXPN available only to authenticated requestors. Implementations
6115+ SHOULD still provide support for EXPN, but sites SHOULD carefully
6116+ evaluate the tradeoffs.
6117+
6118+ Whether disabling VRFY provides any real marginal security depends on
6119+ a series of other conditions. In many cases, RCPT commands can be
6120+ used to obtain the same information about address validity. On the
6121+ other hand, especially in situations where determination of address
6122+ validity for RCPT commands is deferred until after the DATA command
6123+ is received, RCPT may return no information at all, while VRFY is
6124+ expected to make a serious attempt to determine validity before
6125+ generating a response code (see discussion above).
6126+
6127+ 7.4. Mail Rerouting Based on the 251 and 551 Response Codes
6128+
6129+ Before a client uses the 251 or 551 reply codes from a RCPT command
6130+ to automatically update its future behavior (e.g., updating the
6131+ user's address book), it should be certain of the server's
6132+ authenticity. If it does not, it may be subject to a man in the
6133+ middle attack.
6134+
6135+ 7.5. Information Disclosure in Announcements
6136+
6137+ There has been an ongoing debate about the tradeoffs between the
6138+ debugging advantages of announcing server type and version (and,
6139+ sometimes, even server domain name) in the greeting response or in
6140+ response to the HELP command and the disadvantages of exposing
6141+ information that might be useful in a potential hostile attack. The
6142+ utility of the debugging information is beyond doubt. Those who
6143+ argue for making it available point out that it is far better to
6144+ actually secure an SMTP server rather than hope that trying to
6145+ conceal known vulnerabilities by hiding the server's precise identity
6146+ will provide more protection. Sites are encouraged to evaluate the
6147+ tradeoff with that issue in mind; implementations SHOULD minimally
6148+ provide for making type and version information available in some way
6149+ to other network hosts.
6150+
6151+
6152+
6153+
6154+
6155+
6156+
6157+ Klensin Standards Track [Page 77]
6158+
6159+ RFC 5321 SMTP October 2008
6160+
6161+
6162+ 7.6. Information Disclosure in Trace Fields
6163+
6164+ In some circumstances, such as when mail originates from within a LAN
6165+ whose hosts are not directly on the public Internet, trace
6166+ ("Received") header fields produced in conformance with this
6167+ specification may disclose host names and similar information that
6168+ would not normally be available. This ordinarily does not pose a
6169+ problem, but sites with special concerns about name disclosure should
6170+ be aware of it. Also, the optional FOR clause should be supplied
6171+ with caution or not at all when multiple recipients are involved lest
6172+ it inadvertently disclose the identities of "blind copy" recipients
6173+ to others.
6174+
6175+ 7.7. Information Disclosure in Message Forwarding
6176+
6177+ As discussed in Section 3.4, use of the 251 or 551 reply codes to
6178+ identify the replacement address associated with a mailbox may
6179+ inadvertently disclose sensitive information. Sites that are
6180+ concerned about those issues should ensure that they select and
6181+ configure servers appropriately.
6182+
6183+ 7.8. Resistance to Attacks
6184+
6185+ In recent years, there has been an increase of attacks on SMTP
6186+ servers, either in conjunction with attempts to discover addresses
6187+ for sending unsolicited messages or simply to make the servers
6188+ inaccessible to others (i.e., as an application-level denial of
6189+ service attack). While the means of doing so are beyond the scope of
6190+ this Standard, rational operational behavior requires that servers be
6191+ permitted to detect such attacks and take action to defend
6192+ themselves. For example, if a server determines that a large number
6193+ of RCPT TO commands are being sent, most or all with invalid
6194+ addresses, as part of such an attack, it would be reasonable for the
6195+ server to close the connection after generating an appropriate number
6196+ of 5yz (normally 550) replies.
6197+
6198+ 7.9. Scope of Operation of SMTP Servers
6199+
6200+ It is a well-established principle that an SMTP server may refuse to
6201+ accept mail for any operational or technical reason that makes sense
6202+ to the site providing the server. However, cooperation among sites
6203+ and installations makes the Internet possible. If sites take
6204+ excessive advantage of the right to reject traffic, the ubiquity of
6205+ email availability (one of the strengths of the Internet) will be
6206+ threatened; considerable care should be taken and balance maintained
6207+ if a site decides to be selective about the traffic it will accept
6208+ and process.
6209+
6210+
6211+
6212+
6213+ Klensin Standards Track [Page 78]
6214+
6215+ RFC 5321 SMTP October 2008
6216+
6217+
6218+ In recent years, use of the relay function through arbitrary sites
6219+ has been used as part of hostile efforts to hide the actual origins
6220+ of mail. Some sites have decided to limit the use of the relay
6221+ function to known or identifiable sources, and implementations SHOULD
6222+ provide the capability to perform this type of filtering. When mail
6223+ is rejected for these or other policy reasons, a 550 code SHOULD be
6224+ used in response to EHLO (or HELO), MAIL, or RCPT as appropriate.
6225+
6226+ 8. IANA Considerations
6227+
6228+ IANA maintains three registries in support of this specification, all
6229+ of which were created for RFC 2821 or earlier. This document expands
6230+ the third one as specified below. The registry references listed are
6231+ as of the time of publication; IANA does not guarantee the locations
6232+ associated with the URLs. The registries are as follows:
6233+
6234+ o The first, "Simple Mail Transfer Protocol (SMTP) Service
6235+ Extensions" [46], consists of SMTP service extensions with the
6236+ associated keywords, and, as needed, parameters and verbs. As
6237+ specified in Section 2.2.2, no entry may be made in this registry
6238+ that starts in an "X". Entries may be made only for service
6239+ extensions (and associated keywords, parameters, or verbs) that
6240+ are defined in Standards-Track or Experimental RFCs specifically
6241+ approved by the IESG for this purpose.
6242+
6243+ o The second registry, "Address Literal Tags" [47], consists of
6244+ "tags" that identify forms of domain literals other than those for
6245+ IPv4 addresses (specified in RFC 821 and in this document). The
6246+ initial entry in that registry is for IPv6 addresses (specified in
6247+ this document). Additional literal types require standardization
6248+ before being used; none are anticipated at this time.
6249+
6250+ o The third, "Mail Transmission Types" [46], established by RFC 821
6251+ and renewed by this specification, is a registry of link and
6252+ protocol identifiers to be used with the "via" and "with"
6253+ subclauses of the time stamp ("Received:" header field) described
6254+ in Section 4.4. Link and protocol identifiers in addition to
6255+ those specified in this document may be registered only by
6256+ standardization or by way of an RFC-documented, IESG-approved,
6257+ Experimental protocol extension. This name space is for
6258+ identification and not limited in size: the IESG is encouraged to
6259+ approve on the basis of clear documentation and a distinct method
6260+ rather than preferences about the properties of the method itself.
6261+
6262+ An additional subsection has been added to the "VIA link types"
6263+ and "WITH protocol types" subsections of this registry to contain
6264+ registrations of "Additional-registered-clauses" as described
6265+ above. The registry will contain clause names, a description, a
6266+
6267+
6268+
6269+ Klensin Standards Track [Page 79]
6270+
6271+ RFC 5321 SMTP October 2008
6272+
6273+
6274+ summary of the syntax of the associated String, and a reference.
6275+ As new clauses are defined, they may, in principle, specify
6276+ creation of their own registries if the Strings consist of
6277+ reserved terms or keywords rather than less restricted strings.
6278+ As with link and protocol identifiers, additional clauses may be
6279+ registered only by standardization or by way of an RFC-documented,
6280+ IESG-approved, Experimental protocol extension. The additional
6281+ clause name space is for identification and is not limited in
6282+ size: the IESG is encouraged to approve on the basis of clear
6283+ documentation, actual use or strong signs that the clause will be
6284+ used, and a distinct requirement rather than preferences about the
6285+ properties of the clause itself.
6286+
6287+ In addition, if additional trace header fields (i.e., in addition to
6288+ Return-path and Received) are ever created, those trace fields MUST
6289+ be added to the IANA registry established by BCP 90 (RFC 3864) [11]
6290+ for use with RFC 5322 [4].
6291+
6292+ 9. Acknowledgments
6293+
6294+ Many people contributed to the development of RFC 2821. That
6295+ document should be consulted for those acknowledgments. For the
6296+ present document, the editor and the community owe thanks to Dawn
6297+ Mann and Tony Hansen who assisted in the very painful process of
6298+ editing and converting the internal format of the document from one
6299+ system to another.
6300+
6301+ Neither this document nor RFC 2821 would have been possible without
6302+ the many contribution and insights of the late Jon Postel. Those
6303+ contributions of course include the original specification of SMTP in
6304+ RFC 821. A considerable quantity of text from RFC 821 still appears
6305+ in this document as do several of Jon's original examples that have
6306+ been updated only as needed to reflect other changes in the
6307+ specification.
6308+
6309+ Many people made comments or suggestions on the mailing list or in
6310+ notes to the author. Important corrections or clarifications were
6311+ suggested by several people, including Matti Aarnio, Glenn Anderson,
6312+ Derek J. Balling, Alex van den Bogaerdt, Stephane Bortzmeyer, Vint
6313+ Cerf, Jutta Degener, Steve Dorner, Lisa Dusseault, Frank Ellerman,
6314+ Ned Freed, Randy Gellens, Sabahattin Gucukoglu, Philip Guenther, Arnt
6315+ Gulbrandsen, Eric Hall, Richard O. Hammer, Tony Hansen, Peter J.
6316+ Holzer, Kari Hurtta, Bryon Roche Kain, Valdis Kletnieks, Mathias
6317+ Koerber, John Leslie, Bruce Lilly, Jeff Macdonald, Mark E. Mallett,
6318+ Mark Martinec, S. Moonesamy, Lyndon Nerenberg, Chris Newman, Douglas
6319+ Otis, Pete Resnick, Robert A. Rosenberg, Vince Sabio, Hector Santos,
6320+ David F. Skoll, Paul Smith, and Brett Watson.
6321+
6322+
6323+
6324+
6325+ Klensin Standards Track [Page 80]
6326+
6327+ RFC 5321 SMTP October 2008
6328+
6329+
6330+ The efforts of the Area Directors -- Lisa Dusseault, Ted Hardie, and
6331+ Chris Newman -- to get this effort restarted and keep it moving, and
6332+ of an ad hoc committee with the same purpose, are gratefully
6333+ acknowledged. The members of that committee were (in alphabetical
6334+ order) Dave Crocker, Cyrus Daboo, Tony Finch, Ned Freed, Randall
6335+ Gellens, Tony Hansen, the author, and Alexey Melnikov. Tony Hansen
6336+ also acted as ad hoc chair on the mailing list reviewing this
6337+ document; without his efforts, sense of balance and fairness, and
6338+ patience, it clearly would not have been possible.
6339+
6340+ 10. References
6341+
6342+ 10.1. Normative References
6343+
6344+ [1] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC 821,
6345+ August 1982.
6346+
6347+ [2] Mockapetris, P., "Domain names - implementation and
6348+ specification", STD 13, RFC 1035, November 1987.
6349+
6350+ [3] Braden, R., "Requirements for Internet Hosts - Application and
6351+ Support", STD 3, RFC 1123, October 1989.
6352+
6353+ [4] Resnick, P., "Internet Message Format", RFC 5322, October 2008.
6354+
6355+ [5] Bradner, S., "Key words for use in RFCs to Indicate Requirement
6356+ Levels", BCP 14, RFC 2119, March 1997.
6357+
6358+ [6] American National Standards Institute (formerly United States
6359+ of America Standards Institute), "USA Code for Information
6360+ Interchange", ANSI X3.4-1968, 1968.
6361+
6362+ ANSI X3.4-1968 has been replaced by newer versions with slight
6363+ modifications, but the 1968 version remains definitive for the
6364+ Internet.
6365+
6366+ [7] Crocker, D. and P. Overell, "Augmented BNF for Syntax
6367+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
6368+
6369+ [8] Hinden, R. and S. Deering, "IP Version 6 Addressing
6370+ Architecture", RFC 4291, February 2006.
6371+
6372+ [9] Newman, C., "ESMTP and LMTP Transmission Types Registration",
6373+ RFC 3848, July 2004.
6374+
6375+ [10] Klensin, J., Freed, N., and K. Moore, "SMTP Service Extension
6376+ for Message Size Declaration", STD 10, RFC 1870, November 1995.
6377+
6378+
6379+
6380+
6381+ Klensin Standards Track [Page 81]
6382+
6383+ RFC 5321 SMTP October 2008
6384+
6385+
6386+ [11] Klyne, G., Nottingham, M., and J. Mogul, "Registration
6387+ Procedures for Message Header Fields", BCP 90, RFC 3864,
6388+ September 2004.
6389+
6390+ 10.2. Informative References
6391+
6392+ [12] Partridge, C., "Mail routing and the domain system", RFC 974,
6393+ January 1986.
6394+
6395+ [13] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D.
6396+ Crocker, "SMTP Service Extensions", STD 10, RFC 1869,
6397+ November 1995.
6398+
6399+ [14] Klensin, J., "Simple Mail Transfer Protocol", RFC 2821,
6400+ April 2001.
6401+
6402+ [15] Butler, M., Postel, J., Chase, D., Goldberger, J., and J.
6403+ Reynolds, "Post Office Protocol: Version 2", RFC 937,
6404+ February 1985.
6405+
6406+ [16] Myers, J. and M. Rose, "Post Office Protocol - Version 3",
6407+ STD 53, RFC 1939, May 1996.
6408+
6409+ [17] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION
6410+ 4rev1", RFC 3501, March 2003.
6411+
6412+ [18] Gellens, R. and J. Klensin, "Message Submission for Mail",
6413+ RFC 4409, April 2006.
6414+
6415+ [19] Freed, N., "SMTP Service Extension for Command Pipelining",
6416+ STD 60, RFC 2920, September 2000.
6417+
6418+ [20] Vaudreuil, G., "SMTP Service Extensions for Transmission of
6419+ Large and Binary MIME Messages", RFC 3030, December 2000.
6420+
6421+ [21] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
6422+ Extensions (MIME) Part One: Format of Internet Message Bodies",
6423+ RFC 2045, November 1996.
6424+
6425+ [22] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D.
6426+ Crocker, "SMTP Service Extension for 8bit-MIMEtransport",
6427+ RFC 1652, July 1994.
6428+
6429+ [23] Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part
6430+ Three: Message Header Extensions for Non-ASCII Text", RFC 2047,
6431+ November 1996.
6432+
6433+
6434+
6435+
6436+
6437+ Klensin Standards Track [Page 82]
6438+
6439+ RFC 5321 SMTP October 2008
6440+
6441+
6442+ [24] Freed, N. and K. Moore, "MIME Parameter Value and Encoded Word
6443+ Extensions: Character Sets, Languages, and Continuations",
6444+ RFC 2231, November 1997.
6445+
6446+ [25] Vaudreuil, G., "Enhanced Mail System Status Codes", RFC 3463,
6447+ January 2003.
6448+
6449+ [26] Hansen, T. and J. Klensin, "A Registry for SMTP Enhanced Mail
6450+ System Status Codes", BCP 138, RFC 5248, June 2008.
6451+
6452+ [27] Freed, N., "Behavior of and Requirements for Internet
6453+ Firewalls", RFC 2979, October 2000.
6454+
6455+ [28] Crocker, D., "Standard for the format of ARPA Internet text
6456+ messages", STD 11, RFC 822, August 1982.
6457+
6458+ [29] Wong, M. and W. Schlitt, "Sender Policy Framework (SPF) for
6459+ Authorizing Use of Domains in E-Mail, Version 1", RFC 4408,
6460+ April 2006.
6461+
6462+ [30] Fenton, J., "Analysis of Threats Motivating DomainKeys
6463+ Identified Mail (DKIM)", RFC 4686, September 2006.
6464+
6465+ [31] Allman, E., Callas, J., Delany, M., Libbey, M., Fenton, J., and
6466+ M. Thomas, "DomainKeys Identified Mail (DKIM) Signatures",
6467+ RFC 4871, May 2007.
6468+
6469+ [32] Moore, K., "Simple Mail Transfer Protocol (SMTP) Service
6470+ Extension for Delivery Status Notifications (DSNs)", RFC 3461,
6471+ January 2003.
6472+
6473+ [33] Moore, K. and G. Vaudreuil, "An Extensible Message Format for
6474+ Delivery Status Notifications", RFC 3464, January 2003.
6475+
6476+ [34] Postel, J. and J. Reynolds, "File Transfer Protocol", STD 9,
6477+ RFC 959, October 1985.
6478+
6479+ [35] Kille, S., "MIXER (Mime Internet X.400 Enhanced Relay): Mapping
6480+ between X.400 and RFC 822/MIME", RFC 2156, January 1998.
6481+
6482+ [36] De Winter, J., "SMTP Service Extension for Remote Message Queue
6483+ Starting", RFC 1985, August 1996.
6484+
6485+ [37] Hansen, T. and G. Vaudreuil, "Message Disposition
6486+ Notification", RFC 3798, May 2004.
6487+
6488+ [38] Elz, R. and R. Bush, "Clarifications to the DNS Specification",
6489+ RFC 2181, July 1997.
6490+
6491+
6492+
6493+ Klensin Standards Track [Page 83]
6494+
6495+ RFC 5321 SMTP October 2008
6496+
6497+
6498+ [39] Nakamura, M. and J. Hagino, "SMTP Operational Experience in
6499+ Mixed IPv4/v6 Environments", RFC 3974, January 2005.
6500+
6501+ [40] Partridge, C., "Duplicate messages and SMTP", RFC 1047,
6502+ February 1988.
6503+
6504+ [41] Crispin, M., "Interactive Mail Access Protocol: Version 2",
6505+ RFC 1176, August 1990.
6506+
6507+ [42] Lambert, M., "PCMAIL: A distributed mail system for personal
6508+ computers", RFC 1056, June 1988.
6509+
6510+ [43] Galvin, J., Murphy, S., Crocker, S., and N. Freed, "Security
6511+ Multiparts for MIME: Multipart/Signed and Multipart/Encrypted",
6512+ RFC 1847, October 1995.
6513+
6514+ [44] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R.
6515+ Thayer, "OpenPGP Message Format", RFC 4880, November 2007.
6516+
6517+ [45] Ramsdell, B., "Secure/Multipurpose Internet Mail Extensions
6518+ (S/MIME) Version 3.1 Message Specification", RFC 3851,
6519+ July 2004.
6520+
6521+ [46] Internet Assigned Number Authority (IANA), "IANA Mail
6522+ Parameters", 2007,
6523+ <http://www.iana.org/assignments/mail-parameters>.
6524+
6525+ [47] Internet Assigned Number Authority (IANA), "Address Literal
6526+ Tags", 2007,
6527+ <http://www.iana.org/assignments/address-literal-tags>.
6528+
6529+
6530+
6531+
6532+
6533+
6534+
6535+
6536+
6537+
6538+
6539+
6540+
6541+
6542+
6543+
6544+
6545+
6546+
6547+
6548+
6549+ Klensin Standards Track [Page 84]
6550+
6551+ RFC 5321 SMTP October 2008
6552+
6553+
6554+ Appendix A. TCP Transport Service
6555+
6556+ The TCP connection supports the transmission of 8-bit bytes. The
6557+ SMTP data is 7-bit ASCII characters. Each character is transmitted
6558+ as an 8-bit byte with the high-order bit cleared to zero. Service
6559+ extensions may modify this rule to permit transmission of full 8-bit
6560+ data bytes as part of the message body, or, if specifically designed
6561+ to do so, in SMTP commands or responses.
6562+
6563+ Appendix B. Generating SMTP Commands from RFC 822 Header Fields
6564+
6565+ Some systems use an RFC 822 header section (only) in a mail
6566+ submission protocol, or otherwise generate SMTP commands from RFC 822
6567+ header fields when such a message is handed to an MTA from a UA.
6568+ While the MTA-UA protocol is a private matter, not covered by any
6569+ Internet Standard, there are problems with this approach. For
6570+ example, there have been repeated problems with proper handling of
6571+ "bcc" copies and redistribution lists when information that
6572+ conceptually belongs to the mail envelope is not separated early in
6573+ processing from header field information (and kept separate).
6574+
6575+ It is recommended that the UA provide its initial ("submission
6576+ client") MTA with an envelope separate from the message itself.
6577+ However, if the envelope is not supplied, SMTP commands SHOULD be
6578+ generated as follows:
6579+
6580+ 1. Each recipient address from a TO, CC, or BCC header field SHOULD
6581+ be copied to a RCPT command (generating multiple message copies
6582+ if that is required for queuing or delivery). This includes any
6583+ addresses listed in a RFC 822 "group". Any BCC header fields
6584+ SHOULD then be removed from the header section. Once this
6585+ process is completed, the remaining header fields SHOULD be
6586+ checked to verify that at least one TO, CC, or BCC header field
6587+ remains. If none do, then a BCC header field with no additional
6588+ information SHOULD be inserted as specified in [4].
6589+
6590+ 2. The return address in the MAIL command SHOULD, if possible, be
6591+ derived from the system's identity for the submitting (local)
6592+ user, and the "From:" header field otherwise. If there is a
6593+ system identity available, it SHOULD also be copied to the Sender
6594+ header field if it is different from the address in the From
6595+ header field. (Any Sender header field that was already there
6596+ SHOULD be removed.) Systems may provide a way for submitters to
6597+ override the envelope return address, but may want to restrict
6598+ its use to privileged users. This will not prevent mail forgery,
6599+ but may lessen its incidence; see Section 7.1.
6600+
6601+
6602+
6603+
6604+
6605+ Klensin Standards Track [Page 85]
6606+
6607+ RFC 5321 SMTP October 2008
6608+
6609+
6610+ When an MTA is being used in this way, it bears responsibility for
6611+ ensuring that the message being transmitted is valid. The mechanisms
6612+ for checking that validity, and for handling (or returning) messages
6613+ that are not valid at the time of arrival, are part of the MUA-MTA
6614+ interface and not covered by this specification.
6615+
6616+ A submission protocol based on Standard RFC 822 information alone
6617+ MUST NOT be used to gateway a message from a foreign (non-SMTP) mail
6618+ system into an SMTP environment. Additional information to construct
6619+ an envelope must come from some source in the other environment,
6620+ whether supplemental header fields or the foreign system's envelope.
6621+
6622+ Attempts to gateway messages using only their header "To" and "Cc"
6623+ fields have repeatedly caused mail loops and other behavior adverse
6624+ to the proper functioning of the Internet mail environment. These
6625+ problems have been especially common when the message originates from
6626+ an Internet mailing list and is distributed into the foreign
6627+ environment using envelope information. When these messages are then
6628+ processed by a header-section-only remailer, loops back to the
6629+ Internet environment (and the mailing list) are almost inevitable.
6630+
6631+ Appendix C. Source Routes
6632+
6633+ Historically, the <reverse-path> was a reverse source routing list of
6634+ hosts and a source mailbox. The first host in the <reverse-path> was
6635+ historically the host sending the MAIL command; today, source routes
6636+ SHOULD NOT appear in the reverse-path. Similarly, the <forward-path>
6637+ may be a source routing lists of hosts and a destination mailbox.
6638+ However, in general, the <forward-path> SHOULD contain only a mailbox
6639+ and domain name, relying on the domain name system to supply routing
6640+ information if required. The use of source routes is deprecated (see
6641+ Appendix F.2); while servers MUST be prepared to receive and handle
6642+ them as discussed in Section 3.3 and Appendix F.2, clients SHOULD NOT
6643+ transmit them and this section is included in the current
6644+ specification only to provide context. It has been modified somewhat
6645+ from the material in RFC 821 to prevent server actions that might
6646+ confuse clients or subsequent servers that do not expect a full
6647+ source route implementation.
6648+
6649+ For relay purposes, the forward-path may be a source route of the
6650+ form "@ONE,@TWO:JOE@THREE", where ONE, TWO, and THREE MUST be fully-
6651+ qualified domain names. This form is used to emphasize the
6652+ distinction between an address and a route. The mailbox (here, JOE@
6653+ THREE) is an absolute address, and the route is information about how
6654+ to get there. The two concepts should not be confused.
6655+
6656+ If source routes are used, RFC 821 and the text below should be
6657+ consulted for the mechanisms for constructing and updating the
6658+
6659+
6660+
6661+ Klensin Standards Track [Page 86]
6662+
6663+ RFC 5321 SMTP October 2008
6664+
6665+
6666+ forward-path. A server that is reached by means of a source route
6667+ (e.g., its domain name appears first in the list in the forward-path)
6668+ MUST remove its domain name from any forward-paths in which that
6669+ domain name appears before forwarding the message and MAY remove all
6670+ other source routing information. The reverse-path SHOULD NOT be
6671+ updated by servers conforming to this specification.
6672+
6673+ Notice that the forward-path and reverse-path appear in the SMTP
6674+ commands and replies, but not necessarily in the message. That is,
6675+ there is no need for these paths and especially this syntax to appear
6676+ in the "To:" , "From:", "CC:", etc. fields of the message header
6677+ section. Conversely, SMTP servers MUST NOT derive final message
6678+ routing information from message header fields.
6679+
6680+ When the list of hosts is present despite the recommendations above,
6681+ it is a "reverse" source route and indicates that the mail was
6682+ relayed through each host on the list (the first host in the list was
6683+ the most recent relay). This list is used as a source route to
6684+ return non-delivery notices to the sender. If, contrary to the
6685+ recommendations here, a relay host adds itself to the beginning of
6686+ the list, it MUST use its name as known in the transport environment
6687+ to which it is relaying the mail rather than that of the transport
6688+ environment from which the mail came (if they are different). Note
6689+ that a situation could easily arise in which some relay hosts add
6690+ their names to the reverse source route and others do not, generating
6691+ discontinuities in the routing list. This is another reason why
6692+ servers needing to return a message SHOULD ignore the source route
6693+ entirely and simply use the domain as specified in the Mailbox.
6694+
6695+ Appendix D. Scenarios
6696+
6697+ This section presents complete scenarios of several types of SMTP
6698+ sessions. In the examples, "C:" indicates what is said by the SMTP
6699+ client, and "S:" indicates what is said by the SMTP server.
6700+
6701+
6702+
6703+
6704+
6705+
6706+
6707+
6708+
6709+
6710+
6711+
6712+
6713+
6714+
6715+
6716+
6717+ Klensin Standards Track [Page 87]
6718+
6719+ RFC 5321 SMTP October 2008
6720+
6721+
6722+ D.1. A Typical SMTP Transaction Scenario
6723+
6724+ This SMTP example shows mail sent by Smith at host bar.com, and to
6725+ Jones, Green, and Brown at host foo.com. Here we assume that host
6726+ bar.com contacts host foo.com directly. The mail is accepted for
6727+ Jones and Brown. Green does not have a mailbox at host foo.com.
6728+
6729+ S: 220 foo.com Simple Mail Transfer Service Ready
6730+ C: EHLO bar.com
6731+ S: 250-foo.com greets bar.com
6732+ S: 250-8BITMIME
6733+ S: 250-SIZE
6734+ S: 250-DSN
6735+ S: 250 HELP
6736+ C: MAIL FROM:<Smith@bar.com>
6737+ S: 250 OK
6738+ C: RCPT TO:<Jones@foo.com>
6739+ S: 250 OK
6740+ C: RCPT TO:<Green@foo.com>
6741+ S: 550 No such user here
6742+ C: RCPT TO:<Brown@foo.com>
6743+ S: 250 OK
6744+ C: DATA
6745+ S: 354 Start mail input; end with <CRLF>.<CRLF>
6746+ C: Blah blah blah...
6747+ C: ...etc. etc. etc.
6748+ C: .
6749+ S: 250 OK
6750+ C: QUIT
6751+ S: 221 foo.com Service closing transmission channel
6752+
6753+
6754+
6755+
6756+
6757+
6758+
6759+
6760+
6761+
6762+
6763+
6764+
6765+
6766+
6767+
6768+
6769+
6770+
6771+
6772+
6773+ Klensin Standards Track [Page 88]
6774+
6775+ RFC 5321 SMTP October 2008
6776+
6777+
6778+ D.2. Aborted SMTP Transaction Scenario
6779+
6780+ S: 220 foo.com Simple Mail Transfer Service Ready
6781+ C: EHLO bar.com
6782+ S: 250-foo.com greets bar.com
6783+ S: 250-8BITMIME
6784+ S: 250-SIZE
6785+ S: 250-DSN
6786+ S: 250 HELP
6787+ C: MAIL FROM:<Smith@bar.com>
6788+ S: 250 OK
6789+ C: RCPT TO:<Jones@foo.com>
6790+ S: 250 OK
6791+ C: RCPT TO:<Green@foo.com>
6792+ S: 550 No such user here
6793+ C: RSET
6794+ S: 250 OK
6795+ C: QUIT
6796+ S: 221 foo.com Service closing transmission channel
6797+
6798+
6799+
6800+
6801+
6802+
6803+
6804+
6805+
6806+
6807+
6808+
6809+
6810+
6811+
6812+
6813+
6814+
6815+
6816+
6817+
6818+
6819+
6820+
6821+
6822+
6823+
6824+
6825+
6826+
6827+
6828+
6829+ Klensin Standards Track [Page 89]
6830+
6831+ RFC 5321 SMTP October 2008
6832+
6833+
6834+ D.3. Relayed Mail Scenario
6835+
6836+ Step 1 -- Source Host to Relay Host
6837+
6838+ The source host performs a DNS lookup on XYZ.COM (the destination
6839+ address) and finds DNS MX records specifying xyz.com as the best
6840+ preference and foo.com as a lower preference. It attempts to open a
6841+ connection to xyz.com and fails. It then opens a connection to
6842+ foo.com, with the following dialogue:
6843+
6844+ S: 220 foo.com Simple Mail Transfer Service Ready
6845+ C: EHLO bar.com
6846+ S: 250-foo.com greets bar.com
6847+ S: 250-8BITMIME
6848+ S: 250-SIZE
6849+ S: 250-DSN
6850+ S: 250 HELP
6851+ C: MAIL FROM:<JQP@bar.com>
6852+ S: 250 OK
6853+ C: RCPT TO:<Jones@XYZ.COM>
6854+ S: 250 OK
6855+ C: DATA
6856+ S: 354 Start mail input; end with <CRLF>.<CRLF>
6857+ C: Date: Thu, 21 May 1998 05:33:29 -0700
6858+ C: From: John Q. Public <JQP@bar.com>
6859+ C: Subject: The Next Meeting of the Board
6860+ C: To: Jones@xyz.com
6861+ C:
6862+ C: Bill:
6863+ C: The next meeting of the board of directors will be
6864+ C: on Tuesday.
6865+ C: John.
6866+ C: .
6867+ S: 250 OK
6868+ C: QUIT
6869+ S: 221 foo.com Service closing transmission channel
6870+
6871+
6872+
6873+
6874+
6875+
6876+
6877+
6878+
6879+
6880+
6881+
6882+
6883+
6884+
6885+ Klensin Standards Track [Page 90]
6886+
6887+ RFC 5321 SMTP October 2008
6888+
6889+
6890+ Step 2 -- Relay Host to Destination Host
6891+
6892+ foo.com, having received the message, now does a DNS lookup on
6893+ xyz.com. It finds the same set of MX records, but cannot use the one
6894+ that points to itself (or to any other host as a worse preference).
6895+ It tries to open a connection to xyz.com itself and succeeds. Then
6896+ we have:
6897+
6898+ S: 220 xyz.com Simple Mail Transfer Service Ready
6899+ C: EHLO foo.com
6900+ S: 250 xyz.com is on the air
6901+ C: MAIL FROM:<JQP@bar.com>
6902+ S: 250 OK
6903+ C: RCPT TO:<Jones@XYZ.COM>
6904+ S: 250 OK
6905+ C: DATA
6906+ S: 354 Start mail input; end with <CRLF>.<CRLF>
6907+ C: Received: from bar.com by foo.com ; Thu, 21 May 1998
6908+ C: 05:33:29 -0700
6909+ C: Date: Thu, 21 May 1998 05:33:22 -0700
6910+ C: From: John Q. Public <JQP@bar.com>
6911+ C: Subject: The Next Meeting of the Board
6912+ C: To: Jones@xyz.com
6913+ C:
6914+ C: Bill:
6915+ C: The next meeting of the board of directors will be
6916+ C: on Tuesday.
6917+ C: John.
6918+ C: .
6919+ S: 250 OK
6920+ C: QUIT
6921+ S: 221 foo.com Service closing transmission channel
6922+
6923+
6924+
6925+
6926+
6927+
6928+
6929+
6930+
6931+
6932+
6933+
6934+
6935+
6936+
6937+
6938+
6939+
6940+
6941+ Klensin Standards Track [Page 91]
6942+
6943+ RFC 5321 SMTP October 2008
6944+
6945+
6946+ D.4. Verifying and Sending Scenario
6947+
6948+ S: 220 foo.com Simple Mail Transfer Service Ready
6949+ C: EHLO bar.com
6950+ S: 250-foo.com greets bar.com
6951+ S: 250-8BITMIME
6952+ S: 250-SIZE
6953+ S: 250-DSN
6954+ S: 250-VRFY
6955+ S: 250 HELP
6956+ C: VRFY Crispin
6957+ S: 250 Mark Crispin <Admin.MRC@foo.com>
6958+ C: MAIL FROM:<EAK@bar.com>
6959+ S: 250 OK
6960+ C: RCPT TO:<Admin.MRC@foo.com>
6961+ S: 250 OK
6962+ C: DATA
6963+ S: 354 Start mail input; end with <CRLF>.<CRLF>
6964+ C: Blah blah blah...
6965+ C: ...etc. etc. etc.
6966+ C: .
6967+ S: 250 OK
6968+ C: QUIT
6969+ S: 221 foo.com Service closing transmission channel
6970+
6971+ Appendix E. Other Gateway Issues
6972+
6973+ In general, gateways between the Internet and other mail systems
6974+ SHOULD attempt to preserve any layering semantics across the
6975+ boundaries between the two mail systems involved. Gateway-
6976+ translation approaches that attempt to take shortcuts by mapping
6977+ (such as mapping envelope information from one system to the message
6978+ header section or body of another) have generally proven to be
6979+ inadequate in important ways. Systems translating between
6980+ environments that do not support both envelopes and a header section
6981+ and Internet mail must be written with the understanding that some
6982+ information loss is almost inevitable.
6983+
6984+
6985+
6986+
6987+
6988+
6989+
6990+
6991+
6992+
6993+
6994+
6995+
6996+
6997+ Klensin Standards Track [Page 92]
6998+
6999+ RFC 5321 SMTP October 2008
7000+
7001+
7002+ Appendix F. Deprecated Features of RFC 821
7003+
7004+ A few features of RFC 821 have proven to be problematic and SHOULD
7005+ NOT be used in Internet mail.
7006+
7007+ F.1. TURN
7008+
7009+ This command, described in RFC 821, raises important security issues
7010+ since, in the absence of strong authentication of the host requesting
7011+ that the client and server switch roles, it can easily be used to
7012+ divert mail from its correct destination. Its use is deprecated;
7013+ SMTP systems SHOULD NOT use it unless the server can authenticate the
7014+ client.
7015+
7016+ F.2. Source Routing
7017+
7018+ RFC 821 utilized the concept of explicit source routing to get mail
7019+ from one host to another via a series of relays. The requirement to
7020+ utilize source routes in regular mail traffic was eliminated by the
7021+ introduction of the domain name system "MX" record and the last
7022+ significant justification for them was eliminated by the
7023+ introduction, in RFC 1123, of a clear requirement that addresses
7024+ following an "@" must all be fully-qualified domain names.
7025+ Consequently, the only remaining justifications for the use of source
7026+ routes are support for very old SMTP clients or MUAs and in mail
7027+ system debugging. They can, however, still be useful in the latter
7028+ circumstance and for routing mail around serious, but temporary,
7029+ problems such as problems with the relevant DNS records.
7030+
7031+ SMTP servers MUST continue to accept source route syntax as specified
7032+ in the main body of this document and in RFC 1123. They MAY, if
7033+ necessary, ignore the routes and utilize only the target domain in
7034+ the address. If they do utilize the source route, the message MUST
7035+ be sent to the first domain shown in the address. In particular, a
7036+ server MUST NOT guess at shortcuts within the source route.
7037+
7038+ Clients SHOULD NOT utilize explicit source routing except under
7039+ unusual circumstances, such as debugging or potentially relaying
7040+ around firewall or mail system configuration errors.
7041+
7042+ F.3. HELO
7043+
7044+ As discussed in Sections 3.1 and 4.1.1, EHLO SHOULD be used rather
7045+ than HELO when the server will accept the former. Servers MUST
7046+ continue to accept and process HELO in order to support older
7047+ clients.
7048+
7049+
7050+
7051+
7052+
7053+ Klensin Standards Track [Page 93]
7054+
7055+ RFC 5321 SMTP October 2008
7056+
7057+
7058+ F.4. #-literals
7059+
7060+ RFC 821 provided for specifying an Internet address as a decimal
7061+ integer host number prefixed by a pound sign, "#". In practice, that
7062+ form has been obsolete since the introduction of TCP/IP. It is
7063+ deprecated and MUST NOT be used.
7064+
7065+ F.5. Dates and Years
7066+
7067+ When dates are inserted into messages by SMTP clients or servers
7068+ (e.g., in trace header fields), four-digit years MUST BE used. Two-
7069+ digit years are deprecated; three-digit years were never permitted in
7070+ the Internet mail system.
7071+
7072+ F.6. Sending versus Mailing
7073+
7074+ In addition to specifying a mechanism for delivering messages to
7075+ user's mailboxes, RFC 821 provided additional, optional, commands to
7076+ deliver messages directly to the user's terminal screen. These
7077+ commands (SEND, SAML, SOML) were rarely implemented, and changes in
7078+ workstation technology and the introduction of other protocols may
7079+ have rendered them obsolete even where they are implemented.
7080+
7081+ Clients SHOULD NOT provide SEND, SAML, or SOML as services. Servers
7082+ MAY implement them. If they are implemented by servers, the
7083+ implementation model specified in RFC 821 MUST be used and the
7084+ command names MUST be published in the response to the EHLO command.
7085+
7086+ Author's Address
7087+
7088+ John C. Klensin
7089+ 1770 Massachusetts Ave, Suite 322
7090+ Cambridge, MA 02140
7091+ USA
7092+
7093+ EMail: john+smtp@jck.com
7094+
7095+
7096+
7097+
7098+
7099+
7100+
7101+
7102+
7103+
7104+
7105+
7106+
7107+
7108+
7109+ Klensin Standards Track [Page 94]
7110+
7111+ RFC 5321 SMTP October 2008
7112+
7113+
7114+ Full Copyright Statement
7115+
7116+ Copyright (C) The IETF Trust (2008).
7117+
7118+ This document is subject to the rights, licenses and restrictions
7119+ contained in BCP 78, and except as set forth therein, the authors
7120+ retain all their rights.
7121+
7122+ This document and the information contained herein are provided on an
7123+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
7124+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
7125+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
7126+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
7127+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
7128+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
7129+
7130+ Intellectual Property
7131+
7132+ The IETF takes no position regarding the validity or scope of any
7133+ Intellectual Property Rights or other rights that might be claimed to
7134+ pertain to the implementation or use of the technology described in
7135+ this document or the extent to which any license under such rights
7136+ might or might not be available; nor does it represent that it has
7137+ made any independent effort to identify any such rights. Information
7138+ on the procedures with respect to rights in RFC documents can be
7139+ found in BCP 78 and BCP 79.
7140+
7141+ Copies of IPR disclosures made to the IETF Secretariat and any
7142+ assurances of licenses to be made available, or the result of an
7143+ attempt made to obtain a general license or permission for the use of
7144+ such proprietary rights by implementers or users of this
7145+ specification can be obtained from the IETF on-line IPR repository at
7146+ http://www.ietf.org/ipr.
7147+
7148+ The IETF invites any interested party to bring to its attention any
7149+ copyrights, patents or patent applications, or other proprietary
7150+ rights that may cover technology that may be required to implement
7151+ this standard. Please address the information to the IETF at
7152+ ietf-ipr@ietf.org.
7153+
7154+
7155+
7156+
7157+
7158+
7159+
7160+
7161+
7162+
7163+
7164+
7165+ Klensin Standards Track [Page 95]
7166+
7167 diff --git a/rfcs/rfc5322.txt b/rfcs/rfc5322.txt
7168new file mode 100644
7169index 0000000..f330686
7170--- /dev/null
7171+++ b/rfcs/rfc5322.txt
7172 @@ -0,0 +1,3195 @@
7173+
7174+
7175+
7176+
7177+
7178+
7179+ Network Working Group P. Resnick, Ed.
7180+ Request for Comments: 5322 Qualcomm Incorporated
7181+ Obsoletes: 2822 October 2008
7182+ Updates: 4021
7183+ Category: Standards Track
7184+
7185+
7186+ Internet Message Format
7187+
7188+ Status of This Memo
7189+
7190+ This document specifies an Internet standards track protocol for the
7191+ Internet community, and requests discussion and suggestions for
7192+ improvements. Please refer to the current edition of the "Internet
7193+ Official Protocol Standards" (STD 1) for the standardization state
7194+ and status of this protocol. Distribution of this memo is unlimited.
7195+
7196+ Abstract
7197+
7198+ This document specifies the Internet Message Format (IMF), a syntax
7199+ for text messages that are sent between computer users, within the
7200+ framework of "electronic mail" messages. This specification is a
7201+ revision of Request For Comments (RFC) 2822, which itself superseded
7202+ Request For Comments (RFC) 822, "Standard for the Format of ARPA
7203+ Internet Text Messages", updating it to reflect current practice and
7204+ incorporating incremental changes that were specified in other RFCs.
7205+
7206+
7207+
7208+
7209+
7210+
7211+
7212+
7213+
7214+
7215+
7216+
7217+
7218+
7219+
7220+
7221+
7222+
7223+
7224+
7225+
7226+
7227+
7228+
7229+
7230+ Resnick Standards Track [Page 1]
7231+
7232+ RFC 5322 Internet Message Format October 2008
7233+
7234+
7235+ Table of Contents
7236+
7237+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
7238+ 1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 4
7239+ 1.2. Notational Conventions . . . . . . . . . . . . . . . . . . 5
7240+ 1.2.1. Requirements Notation . . . . . . . . . . . . . . . . 5
7241+ 1.2.2. Syntactic Notation . . . . . . . . . . . . . . . . . . 5
7242+ 1.2.3. Structure of This Document . . . . . . . . . . . . . . 5
7243+ 2. Lexical Analysis of Messages . . . . . . . . . . . . . . . . . 6
7244+ 2.1. General Description . . . . . . . . . . . . . . . . . . . 6
7245+ 2.1.1. Line Length Limits . . . . . . . . . . . . . . . . . . 7
7246+ 2.2. Header Fields . . . . . . . . . . . . . . . . . . . . . . 8
7247+ 2.2.1. Unstructured Header Field Bodies . . . . . . . . . . . 8
7248+ 2.2.2. Structured Header Field Bodies . . . . . . . . . . . . 8
7249+ 2.2.3. Long Header Fields . . . . . . . . . . . . . . . . . . 8
7250+ 2.3. Body . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
7251+ 3. Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
7252+ 3.1. Introduction . . . . . . . . . . . . . . . . . . . . . . . 10
7253+ 3.2. Lexical Tokens . . . . . . . . . . . . . . . . . . . . . . 10
7254+ 3.2.1. Quoted characters . . . . . . . . . . . . . . . . . . 10
7255+ 3.2.2. Folding White Space and Comments . . . . . . . . . . . 11
7256+ 3.2.3. Atom . . . . . . . . . . . . . . . . . . . . . . . . . 12
7257+ 3.2.4. Quoted Strings . . . . . . . . . . . . . . . . . . . . 13
7258+ 3.2.5. Miscellaneous Tokens . . . . . . . . . . . . . . . . . 14
7259+ 3.3. Date and Time Specification . . . . . . . . . . . . . . . 14
7260+ 3.4. Address Specification . . . . . . . . . . . . . . . . . . 16
7261+ 3.4.1. Addr-Spec Specification . . . . . . . . . . . . . . . 17
7262+ 3.5. Overall Message Syntax . . . . . . . . . . . . . . . . . . 18
7263+ 3.6. Field Definitions . . . . . . . . . . . . . . . . . . . . 19
7264+ 3.6.1. The Origination Date Field . . . . . . . . . . . . . . 22
7265+ 3.6.2. Originator Fields . . . . . . . . . . . . . . . . . . 22
7266+ 3.6.3. Destination Address Fields . . . . . . . . . . . . . . 23
7267+ 3.6.4. Identification Fields . . . . . . . . . . . . . . . . 25
7268+ 3.6.5. Informational Fields . . . . . . . . . . . . . . . . . 27
7269+ 3.6.6. Resent Fields . . . . . . . . . . . . . . . . . . . . 28
7270+ 3.6.7. Trace Fields . . . . . . . . . . . . . . . . . . . . . 30
7271+ 3.6.8. Optional Fields . . . . . . . . . . . . . . . . . . . 30
7272+ 4. Obsolete Syntax . . . . . . . . . . . . . . . . . . . . . . . 31
7273+ 4.1. Miscellaneous Obsolete Tokens . . . . . . . . . . . . . . 32
7274+ 4.2. Obsolete Folding White Space . . . . . . . . . . . . . . . 33
7275+ 4.3. Obsolete Date and Time . . . . . . . . . . . . . . . . . . 33
7276+ 4.4. Obsolete Addressing . . . . . . . . . . . . . . . . . . . 35
7277+ 4.5. Obsolete Header Fields . . . . . . . . . . . . . . . . . . 35
7278+ 4.5.1. Obsolete Origination Date Field . . . . . . . . . . . 36
7279+ 4.5.2. Obsolete Originator Fields . . . . . . . . . . . . . . 36
7280+ 4.5.3. Obsolete Destination Address Fields . . . . . . . . . 37
7281+ 4.5.4. Obsolete Identification Fields . . . . . . . . . . . . 37
7282+ 4.5.5. Obsolete Informational Fields . . . . . . . . . . . . 37
7283+
7284+
7285+
7286+ Resnick Standards Track [Page 2]
7287+
7288+ RFC 5322 Internet Message Format October 2008
7289+
7290+
7291+ 4.5.6. Obsolete Resent Fields . . . . . . . . . . . . . . . . 38
7292+ 4.5.7. Obsolete Trace Fields . . . . . . . . . . . . . . . . 38
7293+ 4.5.8. Obsolete optional fields . . . . . . . . . . . . . . . 38
7294+ 5. Security Considerations . . . . . . . . . . . . . . . . . . . 38
7295+ 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 39
7296+ Appendix A. Example Messages . . . . . . . . . . . . . . . . . 43
7297+ Appendix A.1. Addressing Examples . . . . . . . . . . . . . . . 44
7298+ Appendix A.1.1. A Message from One Person to Another with
7299+ Simple Addressing . . . . . . . . . . . . . . . . 44
7300+ Appendix A.1.2. Different Types of Mailboxes . . . . . . . . . . . 45
7301+ Appendix A.1.3. Group Addresses . . . . . . . . . . . . . . . . . 45
7302+ Appendix A.2. Reply Messages . . . . . . . . . . . . . . . . . . 46
7303+ Appendix A.3. Resent Messages . . . . . . . . . . . . . . . . . 47
7304+ Appendix A.4. Messages with Trace Fields . . . . . . . . . . . . 48
7305+ Appendix A.5. White Space, Comments, and Other Oddities . . . . 49
7306+ Appendix A.6. Obsoleted Forms . . . . . . . . . . . . . . . . . 50
7307+ Appendix A.6.1. Obsolete Addressing . . . . . . . . . . . . . . . 50
7308+ Appendix A.6.2. Obsolete Dates . . . . . . . . . . . . . . . . . . 50
7309+ Appendix A.6.3. Obsolete White Space and Comments . . . . . . . . 51
7310+ Appendix B. Differences from Earlier Specifications . . . . . 52
7311+ Appendix C. Acknowledgements . . . . . . . . . . . . . . . . . 53
7312+ 7. References . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7313+ 7.1. Normative References . . . . . . . . . . . . . . . . . . . 55
7314+ 7.2. Informative References . . . . . . . . . . . . . . . . . . 55
7315+
7316+
7317+
7318+
7319+
7320+
7321+
7322+
7323+
7324+
7325+
7326+
7327+
7328+
7329+
7330+
7331+
7332+
7333+
7334+
7335+
7336+
7337+
7338+
7339+
7340+
7341+
7342+ Resnick Standards Track [Page 3]
7343+
7344+ RFC 5322 Internet Message Format October 2008
7345+
7346+
7347+ 1. Introduction
7348+
7349+ 1.1. Scope
7350+
7351+ This document specifies the Internet Message Format (IMF), a syntax
7352+ for text messages that are sent between computer users, within the
7353+ framework of "electronic mail" messages. This specification is an
7354+ update to [RFC2822], which itself superseded [RFC0822], updating it
7355+ to reflect current practice and incorporating incremental changes
7356+ that were specified in other RFCs such as [RFC1123].
7357+
7358+ This document specifies a syntax only for text messages. In
7359+ particular, it makes no provision for the transmission of images,
7360+ audio, or other sorts of structured data in electronic mail messages.
7361+ There are several extensions published, such as the MIME document
7362+ series ([RFC2045], [RFC2046], [RFC2049]), which describe mechanisms
7363+ for the transmission of such data through electronic mail, either by
7364+ extending the syntax provided here or by structuring such messages to
7365+ conform to this syntax. Those mechanisms are outside of the scope of
7366+ this specification.
7367+
7368+ In the context of electronic mail, messages are viewed as having an
7369+ envelope and contents. The envelope contains whatever information is
7370+ needed to accomplish transmission and delivery. (See [RFC5321] for a
7371+ discussion of the envelope.) The contents comprise the object to be
7372+ delivered to the recipient. This specification applies only to the
7373+ format and some of the semantics of message contents. It contains no
7374+ specification of the information in the envelope.
7375+
7376+ However, some message systems may use information from the contents
7377+ to create the envelope. It is intended that this specification
7378+ facilitate the acquisition of such information by programs.
7379+
7380+ This specification is intended as a definition of what message
7381+ content format is to be passed between systems. Though some message
7382+ systems locally store messages in this format (which eliminates the
7383+ need for translation between formats) and others use formats that
7384+ differ from the one specified in this specification, local storage is
7385+ outside of the scope of this specification.
7386+
7387+ Note: This specification is not intended to dictate the internal
7388+ formats used by sites, the specific message system features that
7389+ they are expected to support, or any of the characteristics of
7390+ user interface programs that create or read messages. In
7391+ addition, this document does not specify an encoding of the
7392+ characters for either transport or storage; that is, it does not
7393+ specify the number of bits used or how those bits are specifically
7394+ transferred over the wire or stored on disk.
7395+
7396+
7397+
7398+ Resnick Standards Track [Page 4]
7399+
7400+ RFC 5322 Internet Message Format October 2008
7401+
7402+
7403+ 1.2. Notational Conventions
7404+
7405+ 1.2.1. Requirements Notation
7406+
7407+ This document occasionally uses terms that appear in capital letters.
7408+ When the terms "MUST", "SHOULD", "RECOMMENDED", "MUST NOT", "SHOULD
7409+ NOT", and "MAY" appear capitalized, they are being used to indicate
7410+ particular requirements of this specification. A discussion of the
7411+ meanings of these terms appears in [RFC2119].
7412+
7413+ 1.2.2. Syntactic Notation
7414+
7415+ This specification uses the Augmented Backus-Naur Form (ABNF)
7416+ [RFC5234] notation for the formal definitions of the syntax of
7417+ messages. Characters will be specified either by a decimal value
7418+ (e.g., the value %d65 for uppercase A and %d97 for lowercase A) or by
7419+ a case-insensitive literal value enclosed in quotation marks (e.g.,
7420+ "A" for either uppercase or lowercase A).
7421+
7422+ 1.2.3. Structure of This Document
7423+
7424+ This document is divided into several sections.
7425+
7426+ This section, section 1, is a short introduction to the document.
7427+
7428+ Section 2 lays out the general description of a message and its
7429+ constituent parts. This is an overview to help the reader understand
7430+ some of the general principles used in the later portions of this
7431+ document. Any examples in this section MUST NOT be taken as
7432+ specification of the formal syntax of any part of a message.
7433+
7434+ Section 3 specifies formal ABNF rules for the structure of each part
7435+ of a message (the syntax) and describes the relationship between
7436+ those parts and their meaning in the context of a message (the
7437+ semantics). That is, it lays out the actual rules for the structure
7438+ of each part of a message (the syntax) as well as a description of
7439+ the parts and instructions for their interpretation (the semantics).
7440+ This includes analysis of the syntax and semantics of subparts of
7441+ messages that have specific structure. The syntax included in
7442+ section 3 represents messages as they MUST be created. There are
7443+ also notes in section 3 to indicate if any of the options specified
7444+ in the syntax SHOULD be used over any of the others.
7445+
7446+ Both sections 2 and 3 describe messages that are legal to generate
7447+ for purposes of this specification.
7448+
7449+
7450+
7451+
7452+
7453+
7454+ Resnick Standards Track [Page 5]
7455+
7456+ RFC 5322 Internet Message Format October 2008
7457+
7458+
7459+ Section 4 of this document specifies an "obsolete" syntax. There are
7460+ references in section 3 to these obsolete syntactic elements. The
7461+ rules of the obsolete syntax are elements that have appeared in
7462+ earlier versions of this specification or have previously been widely
7463+ used in Internet messages. As such, these elements MUST be
7464+ interpreted by parsers of messages in order to be conformant to this
7465+ specification. However, since items in this syntax have been
7466+ determined to be non-interoperable or to cause significant problems
7467+ for recipients of messages, they MUST NOT be generated by creators of
7468+ conformant messages.
7469+
7470+ Section 5 details security considerations to take into account when
7471+ implementing this specification.
7472+
7473+ Appendix A lists examples of different sorts of messages. These
7474+ examples are not exhaustive of the types of messages that appear on
7475+ the Internet, but give a broad overview of certain syntactic forms.
7476+
7477+ Appendix B lists the differences between this specification and
7478+ earlier specifications for Internet messages.
7479+
7480+ Appendix C contains acknowledgements.
7481+
7482+ 2. Lexical Analysis of Messages
7483+
7484+ 2.1. General Description
7485+
7486+ At the most basic level, a message is a series of characters. A
7487+ message that is conformant with this specification is composed of
7488+ characters with values in the range of 1 through 127 and interpreted
7489+ as US-ASCII [ANSI.X3-4.1986] characters. For brevity, this document
7490+ sometimes refers to this range of characters as simply "US-ASCII
7491+ characters".
7492+
7493+ Note: This document specifies that messages are made up of
7494+ characters in the US-ASCII range of 1 through 127. There are
7495+ other documents, specifically the MIME document series ([RFC2045],
7496+ [RFC2046], [RFC2047], [RFC2049], [RFC4288], [RFC4289]), that
7497+ extend this specification to allow for values outside of that
7498+ range. Discussion of those mechanisms is not within the scope of
7499+ this specification.
7500+
7501+ Messages are divided into lines of characters. A line is a series of
7502+ characters that is delimited with the two characters carriage-return
7503+ and line-feed; that is, the carriage return (CR) character (ASCII
7504+ value 13) followed immediately by the line feed (LF) character (ASCII
7505+ value 10). (The carriage return/line feed pair is usually written in
7506+ this document as "CRLF".)
7507+
7508+
7509+
7510+ Resnick Standards Track [Page 6]
7511+
7512+ RFC 5322 Internet Message Format October 2008
7513+
7514+
7515+ A message consists of header fields (collectively called "the header
7516+ section of the message") followed, optionally, by a body. The header
7517+ section is a sequence of lines of characters with special syntax as
7518+ defined in this specification. The body is simply a sequence of
7519+ characters that follows the header section and is separated from the
7520+ header section by an empty line (i.e., a line with nothing preceding
7521+ the CRLF).
7522+
7523+ Note: Common parlance and earlier versions of this specification
7524+ use the term "header" to either refer to the entire header section
7525+ or to refer to an individual header field. To avoid ambiguity,
7526+ this document does not use the terms "header" or "headers" in
7527+ isolation, but instead always uses "header field" to refer to the
7528+ individual field and "header section" to refer to the entire
7529+ collection.
7530+
7531+ 2.1.1. Line Length Limits
7532+
7533+ There are two limits that this specification places on the number of
7534+ characters in a line. Each line of characters MUST be no more than
7535+ 998 characters, and SHOULD be no more than 78 characters, excluding
7536+ the CRLF.
7537+
7538+ The 998 character limit is due to limitations in many implementations
7539+ that send, receive, or store IMF messages which simply cannot handle
7540+ more than 998 characters on a line. Receiving implementations would
7541+ do well to handle an arbitrarily large number of characters in a line
7542+ for robustness sake. However, there are so many implementations that
7543+ (in compliance with the transport requirements of [RFC5321]) do not
7544+ accept messages containing more than 1000 characters including the CR
7545+ and LF per line, it is important for implementations not to create
7546+ such messages.
7547+
7548+ The more conservative 78 character recommendation is to accommodate
7549+ the many implementations of user interfaces that display these
7550+ messages which may truncate, or disastrously wrap, the display of
7551+ more than 78 characters per line, in spite of the fact that such
7552+ implementations are non-conformant to the intent of this
7553+ specification (and that of [RFC5321] if they actually cause
7554+ information to be lost). Again, even though this limitation is put
7555+ on messages, it is incumbent upon implementations that display
7556+ messages to handle an arbitrarily large number of characters in a
7557+ line (certainly at least up to the 998 character limit) for the sake
7558+ of robustness.
7559+
7560+
7561+
7562+
7563+
7564+
7565+
7566+ Resnick Standards Track [Page 7]
7567+
7568+ RFC 5322 Internet Message Format October 2008
7569+
7570+
7571+ 2.2. Header Fields
7572+
7573+ Header fields are lines beginning with a field name, followed by a
7574+ colon (":"), followed by a field body, and terminated by CRLF. A
7575+ field name MUST be composed of printable US-ASCII characters (i.e.,
7576+ characters that have values between 33 and 126, inclusive), except
7577+ colon. A field body may be composed of printable US-ASCII characters
7578+ as well as the space (SP, ASCII value 32) and horizontal tab (HTAB,
7579+ ASCII value 9) characters (together known as the white space
7580+ characters, WSP). A field body MUST NOT include CR and LF except
7581+ when used in "folding" and "unfolding", as described in section
7582+ 2.2.3. All field bodies MUST conform to the syntax described in
7583+ sections 3 and 4 of this specification.
7584+
7585+ 2.2.1. Unstructured Header Field Bodies
7586+
7587+ Some field bodies in this specification are defined simply as
7588+ "unstructured" (which is specified in section 3.2.5 as any printable
7589+ US-ASCII characters plus white space characters) with no further
7590+ restrictions. These are referred to as unstructured field bodies.
7591+ Semantically, unstructured field bodies are simply to be treated as a
7592+ single line of characters with no further processing (except for
7593+ "folding" and "unfolding" as described in section 2.2.3).
7594+
7595+ 2.2.2. Structured Header Field Bodies
7596+
7597+ Some field bodies in this specification have a syntax that is more
7598+ restrictive than the unstructured field bodies described above.
7599+ These are referred to as "structured" field bodies. Structured field
7600+ bodies are sequences of specific lexical tokens as described in
7601+ sections 3 and 4 of this specification. Many of these tokens are
7602+ allowed (according to their syntax) to be introduced or end with
7603+ comments (as described in section 3.2.2) as well as the white space
7604+ characters, and those white space characters are subject to "folding"
7605+ and "unfolding" as described in section 2.2.3. Semantic analysis of
7606+ structured field bodies is given along with their syntax.
7607+
7608+ 2.2.3. Long Header Fields
7609+
7610+ Each header field is logically a single line of characters comprising
7611+ the field name, the colon, and the field body. For convenience
7612+ however, and to deal with the 998/78 character limitations per line,
7613+ the field body portion of a header field can be split into a
7614+ multiple-line representation; this is called "folding". The general
7615+ rule is that wherever this specification allows for folding white
7616+ space (not simply WSP characters), a CRLF may be inserted before any
7617+ WSP.
7618+
7619+
7620+
7621+
7622+ Resnick Standards Track [Page 8]
7623+
7624+ RFC 5322 Internet Message Format October 2008
7625+
7626+
7627+ For example, the header field:
7628+
7629+ Subject: This is a test
7630+
7631+ can be represented as:
7632+
7633+ Subject: This
7634+ is a test
7635+
7636+ Note: Though structured field bodies are defined in such a way
7637+ that folding can take place between many of the lexical tokens
7638+ (and even within some of the lexical tokens), folding SHOULD be
7639+ limited to placing the CRLF at higher-level syntactic breaks. For
7640+ instance, if a field body is defined as comma-separated values, it
7641+ is recommended that folding occur after the comma separating the
7642+ structured items in preference to other places where the field
7643+ could be folded, even if it is allowed elsewhere.
7644+
7645+ The process of moving from this folded multiple-line representation
7646+ of a header field to its single line representation is called
7647+ "unfolding". Unfolding is accomplished by simply removing any CRLF
7648+ that is immediately followed by WSP. Each header field should be
7649+ treated in its unfolded form for further syntactic and semantic
7650+ evaluation. An unfolded header field has no length restriction and
7651+ therefore may be indeterminately long.
7652+
7653+ 2.3. Body
7654+
7655+ The body of a message is simply lines of US-ASCII characters. The
7656+ only two limitations on the body are as follows:
7657+
7658+ o CR and LF MUST only occur together as CRLF; they MUST NOT appear
7659+ independently in the body.
7660+ o Lines of characters in the body MUST be limited to 998 characters,
7661+ and SHOULD be limited to 78 characters, excluding the CRLF.
7662+
7663+ Note: As was stated earlier, there are other documents,
7664+ specifically the MIME documents ([RFC2045], [RFC2046], [RFC2049],
7665+ [RFC4288], [RFC4289]), that extend (and limit) this specification
7666+ to allow for different sorts of message bodies. Again, these
7667+ mechanisms are beyond the scope of this document.
7668+
7669+
7670+
7671+
7672+
7673+
7674+
7675+
7676+
7677+
7678+ Resnick Standards Track [Page 9]
7679+
7680+ RFC 5322 Internet Message Format October 2008
7681+
7682+
7683+ 3. Syntax
7684+
7685+ 3.1. Introduction
7686+
7687+ The syntax as given in this section defines the legal syntax of
7688+ Internet messages. Messages that are conformant to this
7689+ specification MUST conform to the syntax in this section. If there
7690+ are options in this section where one option SHOULD be generated,
7691+ that is indicated either in the prose or in a comment next to the
7692+ syntax.
7693+
7694+ For the defined expressions, a short description of the syntax and
7695+ use is given, followed by the syntax in ABNF, followed by a semantic
7696+ analysis. The following primitive tokens that are used but otherwise
7697+ unspecified are taken from the "Core Rules" of [RFC5234], Appendix
7698+ B.1: CR, LF, CRLF, HTAB, SP, WSP, DQUOTE, DIGIT, ALPHA, and VCHAR.
7699+
7700+ In some of the definitions, there will be non-terminals whose names
7701+ start with "obs-". These "obs-" elements refer to tokens defined in
7702+ the obsolete syntax in section 4. In all cases, these productions
7703+ are to be ignored for the purposes of generating legal Internet
7704+ messages and MUST NOT be used as part of such a message. However,
7705+ when interpreting messages, these tokens MUST be honored as part of
7706+ the legal syntax. In this sense, section 3 defines a grammar for the
7707+ generation of messages, with "obs-" elements that are to be ignored,
7708+ while section 4 adds grammar for the interpretation of messages.
7709+
7710+ 3.2. Lexical Tokens
7711+
7712+ The following rules are used to define an underlying lexical
7713+ analyzer, which feeds tokens to the higher-level parsers. This
7714+ section defines the tokens used in structured header field bodies.
7715+
7716+ Note: Readers of this specification need to pay special attention
7717+ to how these lexical tokens are used in both the lower-level and
7718+ higher-level syntax later in the document. Particularly, the
7719+ white space tokens and the comment tokens defined in section 3.2.2
7720+ get used in the lower-level tokens defined here, and those lower-
7721+ level tokens are in turn used as parts of the higher-level tokens
7722+ defined later. Therefore, white space and comments may be allowed
7723+ in the higher-level tokens even though they may not explicitly
7724+ appear in a particular definition.
7725+
7726+ 3.2.1. Quoted characters
7727+
7728+ Some characters are reserved for special interpretation, such as
7729+ delimiting lexical tokens. To permit use of these characters as
7730+ uninterpreted data, a quoting mechanism is provided.
7731+
7732+
7733+
7734+ Resnick Standards Track [Page 10]
7735+
7736+ RFC 5322 Internet Message Format October 2008
7737+
7738+
7739+ quoted-pair = ("\" (VCHAR / WSP)) / obs-qp
7740+
7741+ Where any quoted-pair appears, it is to be interpreted as the
7742+ character alone. That is to say, the "\" character that appears as
7743+ part of a quoted-pair is semantically "invisible".
7744+
7745+ Note: The "\" character may appear in a message where it is not
7746+ part of a quoted-pair. A "\" character that does not appear in a
7747+ quoted-pair is not semantically invisible. The only places in
7748+ this specification where quoted-pair currently appears are
7749+ ccontent, qcontent, and in obs-dtext in section 4.
7750+
7751+ 3.2.2. Folding White Space and Comments
7752+
7753+ White space characters, including white space used in folding
7754+ (described in section 2.2.3), may appear between many elements in
7755+ header field bodies. Also, strings of characters that are treated as
7756+ comments may be included in structured field bodies as characters
7757+ enclosed in parentheses. The following defines the folding white
7758+ space (FWS) and comment constructs.
7759+
7760+ Strings of characters enclosed in parentheses are considered comments
7761+ so long as they do not appear within a "quoted-string", as defined in
7762+ section 3.2.4. Comments may nest.
7763+
7764+ There are several places in this specification where comments and FWS
7765+ may be freely inserted. To accommodate that syntax, an additional
7766+ token for "CFWS" is defined for places where comments and/or FWS can
7767+ occur. However, where CFWS occurs in this specification, it MUST NOT
7768+ be inserted in such a way that any line of a folded header field is
7769+ made up entirely of WSP characters and nothing else.
7770+
7771+ FWS = ([*WSP CRLF] 1*WSP) / obs-FWS
7772+ ; Folding white space
7773+
7774+ ctext = %d33-39 / ; Printable US-ASCII
7775+ %d42-91 / ; characters not including
7776+ %d93-126 / ; "(", ")", or "\"
7777+ obs-ctext
7778+
7779+ ccontent = ctext / quoted-pair / comment
7780+
7781+ comment = "(" *([FWS] ccontent) [FWS] ")"
7782+
7783+ CFWS = (1*([FWS] comment) [FWS]) / FWS
7784+
7785+
7786+
7787+
7788+
7789+
7790+ Resnick Standards Track [Page 11]
7791+
7792+ RFC 5322 Internet Message Format October 2008
7793+
7794+
7795+ Throughout this specification, where FWS (the folding white space
7796+ token) appears, it indicates a place where folding, as discussed in
7797+ section 2.2.3, may take place. Wherever folding appears in a message
7798+ (that is, a header field body containing a CRLF followed by any WSP),
7799+ unfolding (removal of the CRLF) is performed before any further
7800+ semantic analysis is performed on that header field according to this
7801+ specification. That is to say, any CRLF that appears in FWS is
7802+ semantically "invisible".
7803+
7804+ A comment is normally used in a structured field body to provide some
7805+ human-readable informational text. Since a comment is allowed to
7806+ contain FWS, folding is permitted within the comment. Also note that
7807+ since quoted-pair is allowed in a comment, the parentheses and
7808+ backslash characters may appear in a comment, so long as they appear
7809+ as a quoted-pair. Semantically, the enclosing parentheses are not
7810+ part of the comment; the comment is what is contained between the two
7811+ parentheses. As stated earlier, the "\" in any quoted-pair and the
7812+ CRLF in any FWS that appears within the comment are semantically
7813+ "invisible" and therefore not part of the comment either.
7814+
7815+ Runs of FWS, comment, or CFWS that occur between lexical tokens in a
7816+ structured header field are semantically interpreted as a single
7817+ space character.
7818+
7819+ 3.2.3. Atom
7820+
7821+ Several productions in structured header field bodies are simply
7822+ strings of certain basic characters. Such productions are called
7823+ atoms.
7824+
7825+ Some of the structured header field bodies also allow the period
7826+ character (".", ASCII value 46) within runs of atext. An additional
7827+ "dot-atom" token is defined for those purposes.
7828+
7829+ Note: The "specials" token does not appear anywhere else in this
7830+ specification. It is simply the visible (i.e., non-control, non-
7831+ white space) characters that do not appear in atext. It is
7832+ provided only because it is useful for implementers who use tools
7833+ that lexically analyze messages. Each of the characters in
7834+ specials can be used to indicate a tokenization point in lexical
7835+ analysis.
7836+
7837+
7838+
7839+
7840+
7841+
7842+
7843+
7844+
7845+
7846+ Resnick Standards Track [Page 12]
7847+
7848+ RFC 5322 Internet Message Format October 2008
7849+
7850+
7851+ atext = ALPHA / DIGIT / ; Printable US-ASCII
7852+ "!" / "#" / ; characters not including
7853+ "$" / "%" / ; specials. Used for atoms.
7854+ "&" / "'" /
7855+ "*" / "+" /
7856+ "-" / "/" /
7857+ "=" / "?" /
7858+ "^" / "_" /
7859+ "`" / "{" /
7860+ "|" / "}" /
7861+ "~"
7862+
7863+ atom = [CFWS] 1*atext [CFWS]
7864+
7865+ dot-atom-text = 1*atext *("." 1*atext)
7866+
7867+ dot-atom = [CFWS] dot-atom-text [CFWS]
7868+
7869+ specials = "(" / ")" / ; Special characters that do
7870+ "<" / ">" / ; not appear in atext
7871+ "[" / "]" /
7872+ ":" / ";" /
7873+ "@" / "\" /
7874+ "," / "." /
7875+ DQUOTE
7876+
7877+ Both atom and dot-atom are interpreted as a single unit, comprising
7878+ the string of characters that make it up. Semantically, the optional
7879+ comments and FWS surrounding the rest of the characters are not part
7880+ of the atom; the atom is only the run of atext characters in an atom,
7881+ or the atext and "." characters in a dot-atom.
7882+
7883+ 3.2.4. Quoted Strings
7884+
7885+ Strings of characters that include characters other than those
7886+ allowed in atoms can be represented in a quoted string format, where
7887+ the characters are surrounded by quote (DQUOTE, ASCII value 34)
7888+ characters.
7889+
7890+
7891+
7892+
7893+
7894+
7895+
7896+
7897+
7898+
7899+
7900+
7901+
7902+ Resnick Standards Track [Page 13]
7903+
7904+ RFC 5322 Internet Message Format October 2008
7905+
7906+
7907+ qtext = %d33 / ; Printable US-ASCII
7908+ %d35-91 / ; characters not including
7909+ %d93-126 / ; "\" or the quote character
7910+ obs-qtext
7911+
7912+ qcontent = qtext / quoted-pair
7913+
7914+ quoted-string = [CFWS]
7915+ DQUOTE *([FWS] qcontent) [FWS] DQUOTE
7916+ [CFWS]
7917+
7918+ A quoted-string is treated as a unit. That is, quoted-string is
7919+ identical to atom, semantically. Since a quoted-string is allowed to
7920+ contain FWS, folding is permitted. Also note that since quoted-pair
7921+ is allowed in a quoted-string, the quote and backslash characters may
7922+ appear in a quoted-string so long as they appear as a quoted-pair.
7923+
7924+ Semantically, neither the optional CFWS outside of the quote
7925+ characters nor the quote characters themselves are part of the
7926+ quoted-string; the quoted-string is what is contained between the two
7927+ quote characters. As stated earlier, the "\" in any quoted-pair and
7928+ the CRLF in any FWS/CFWS that appears within the quoted-string are
7929+ semantically "invisible" and therefore not part of the quoted-string
7930+ either.
7931+
7932+ 3.2.5. Miscellaneous Tokens
7933+
7934+ Three additional tokens are defined: word and phrase for combinations
7935+ of atoms and/or quoted-strings, and unstructured for use in
7936+ unstructured header fields and in some places within structured
7937+ header fields.
7938+
7939+ word = atom / quoted-string
7940+
7941+ phrase = 1*word / obs-phrase
7942+
7943+ unstructured = (*([FWS] VCHAR) *WSP) / obs-unstruct
7944+
7945+ 3.3. Date and Time Specification
7946+
7947+ Date and time values occur in several header fields. This section
7948+ specifies the syntax for a full date and time specification. Though
7949+ folding white space is permitted throughout the date-time
7950+ specification, it is RECOMMENDED that a single space be used in each
7951+ place that FWS appears (whether it is required or optional); some
7952+ older implementations will not interpret longer sequences of folding
7953+ white space correctly.
7954+
7955+
7956+
7957+
7958+ Resnick Standards Track [Page 14]
7959+
7960+ RFC 5322 Internet Message Format October 2008
7961+
7962+
7963+ date-time = [ day-of-week "," ] date time [CFWS]
7964+
7965+ day-of-week = ([FWS] day-name) / obs-day-of-week
7966+
7967+ day-name = "Mon" / "Tue" / "Wed" / "Thu" /
7968+ "Fri" / "Sat" / "Sun"
7969+
7970+ date = day month year
7971+
7972+ day = ([FWS] 1*2DIGIT FWS) / obs-day
7973+
7974+ month = "Jan" / "Feb" / "Mar" / "Apr" /
7975+ "May" / "Jun" / "Jul" / "Aug" /
7976+ "Sep" / "Oct" / "Nov" / "Dec"
7977+
7978+ year = (FWS 4*DIGIT FWS) / obs-year
7979+
7980+ time = time-of-day zone
7981+
7982+ time-of-day = hour ":" minute [ ":" second ]
7983+
7984+ hour = 2DIGIT / obs-hour
7985+
7986+ minute = 2DIGIT / obs-minute
7987+
7988+ second = 2DIGIT / obs-second
7989+
7990+ zone = (FWS ( "+" / "-" ) 4DIGIT) / obs-zone
7991+
7992+ The day is the numeric day of the month. The year is any numeric
7993+ year 1900 or later.
7994+
7995+ The time-of-day specifies the number of hours, minutes, and
7996+ optionally seconds since midnight of the date indicated.
7997+
7998+ The date and time-of-day SHOULD express local time.
7999+
8000+ The zone specifies the offset from Coordinated Universal Time (UTC,
8001+ formerly referred to as "Greenwich Mean Time") that the date and
8002+ time-of-day represent. The "+" or "-" indicates whether the time-of-
8003+ day is ahead of (i.e., east of) or behind (i.e., west of) Universal
8004+ Time. The first two digits indicate the number of hours difference
8005+ from Universal Time, and the last two digits indicate the number of
8006+ additional minutes difference from Universal Time. (Hence, +hhmm
8007+ means +(hh * 60 + mm) minutes, and -hhmm means -(hh * 60 + mm)
8008+ minutes). The form "+0000" SHOULD be used to indicate a time zone at
8009+ Universal Time. Though "-0000" also indicates Universal Time, it is
8010+
8011+
8012+
8013+
8014+ Resnick Standards Track [Page 15]
8015+
8016+ RFC 5322 Internet Message Format October 2008
8017+
8018+
8019+ used to indicate that the time was generated on a system that may be
8020+ in a local time zone other than Universal Time and that the date-time
8021+ contains no information about the local time zone.
8022+
8023+ A date-time specification MUST be semantically valid. That is, the
8024+ day-of-week (if included) MUST be the day implied by the date, the
8025+ numeric day-of-month MUST be between 1 and the number of days allowed
8026+ for the specified month (in the specified year), the time-of-day MUST
8027+ be in the range 00:00:00 through 23:59:60 (the number of seconds
8028+ allowing for a leap second; see [RFC1305]), and the last two digits
8029+ of the zone MUST be within the range 00 through 59.
8030+
8031+ 3.4. Address Specification
8032+
8033+ Addresses occur in several message header fields to indicate senders
8034+ and recipients of messages. An address may either be an individual
8035+ mailbox, or a group of mailboxes.
8036+
8037+ address = mailbox / group
8038+
8039+ mailbox = name-addr / addr-spec
8040+
8041+ name-addr = [display-name] angle-addr
8042+
8043+ angle-addr = [CFWS] "<" addr-spec ">" [CFWS] /
8044+ obs-angle-addr
8045+
8046+ group = display-name ":" [group-list] ";" [CFWS]
8047+
8048+ display-name = phrase
8049+
8050+ mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list
8051+
8052+ address-list = (address *("," address)) / obs-addr-list
8053+
8054+ group-list = mailbox-list / CFWS / obs-group-list
8055+
8056+ A mailbox receives mail. It is a conceptual entity that does not
8057+ necessarily pertain to file storage. For example, some sites may
8058+ choose to print mail on a printer and deliver the output to the
8059+ addressee's desk.
8060+
8061+ Normally, a mailbox is composed of two parts: (1) an optional display
8062+ name that indicates the name of the recipient (which can be a person
8063+ or a system) that could be displayed to the user of a mail
8064+ application, and (2) an addr-spec address enclosed in angle brackets
8065+
8066+
8067+
8068+
8069+
8070+ Resnick Standards Track [Page 16]
8071+
8072+ RFC 5322 Internet Message Format October 2008
8073+
8074+
8075+ ("<" and ">"). There is an alternate simple form of a mailbox where
8076+ the addr-spec address appears alone, without the recipient's name or
8077+ the angle brackets. The Internet addr-spec address is described in
8078+ section 3.4.1.
8079+
8080+ Note: Some legacy implementations used the simple form where the
8081+ addr-spec appears without the angle brackets, but included the
8082+ name of the recipient in parentheses as a comment following the
8083+ addr-spec. Since the meaning of the information in a comment is
8084+ unspecified, implementations SHOULD use the full name-addr form of
8085+ the mailbox, instead of the legacy form, to specify the display
8086+ name associated with a mailbox. Also, because some legacy
8087+ implementations interpret the comment, comments generally SHOULD
8088+ NOT be used in address fields to avoid confusing such
8089+ implementations.
8090+
8091+ When it is desirable to treat several mailboxes as a single unit
8092+ (i.e., in a distribution list), the group construct can be used. The
8093+ group construct allows the sender to indicate a named group of
8094+ recipients. This is done by giving a display name for the group,
8095+ followed by a colon, followed by a comma-separated list of any number
8096+ of mailboxes (including zero and one), and ending with a semicolon.
8097+ Because the list of mailboxes can be empty, using the group construct
8098+ is also a simple way to communicate to recipients that the message
8099+ was sent to one or more named sets of recipients, without actually
8100+ providing the individual mailbox address for any of those recipients.
8101+
8102+ 3.4.1. Addr-Spec Specification
8103+
8104+ An addr-spec is a specific Internet identifier that contains a
8105+ locally interpreted string followed by the at-sign character ("@",
8106+ ASCII value 64) followed by an Internet domain. The locally
8107+ interpreted string is either a quoted-string or a dot-atom. If the
8108+ string can be represented as a dot-atom (that is, it contains no
8109+ characters other than atext characters or "." surrounded by atext
8110+ characters), then the dot-atom form SHOULD be used and the quoted-
8111+ string form SHOULD NOT be used. Comments and folding white space
8112+ SHOULD NOT be used around the "@" in the addr-spec.
8113+
8114+ Note: A liberal syntax for the domain portion of addr-spec is
8115+ given here. However, the domain portion contains addressing
8116+ information specified by and used in other protocols (e.g.,
8117+ [RFC1034], [RFC1035], [RFC1123], [RFC5321]). It is therefore
8118+ incumbent upon implementations to conform to the syntax of
8119+ addresses for the context in which they are used.
8120+
8121+
8122+
8123+
8124+
8125+
8126+ Resnick Standards Track [Page 17]
8127+
8128+ RFC 5322 Internet Message Format October 2008
8129+
8130+
8131+ addr-spec = local-part "@" domain
8132+
8133+ local-part = dot-atom / quoted-string / obs-local-part
8134+
8135+ domain = dot-atom / domain-literal / obs-domain
8136+
8137+ domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
8138+
8139+ dtext = %d33-90 / ; Printable US-ASCII
8140+ %d94-126 / ; characters not including
8141+ obs-dtext ; "[", "]", or "\"
8142+
8143+ The domain portion identifies the point to which the mail is
8144+ delivered. In the dot-atom form, this is interpreted as an Internet
8145+ domain name (either a host name or a mail exchanger name) as
8146+ described in [RFC1034], [RFC1035], and [RFC1123]. In the domain-
8147+ literal form, the domain is interpreted as the literal Internet
8148+ address of the particular host. In both cases, how addressing is
8149+ used and how messages are transported to a particular host is covered
8150+ in separate documents, such as [RFC5321]. These mechanisms are
8151+ outside of the scope of this document.
8152+
8153+ The local-part portion is a domain-dependent string. In addresses,
8154+ it is simply interpreted on the particular host as a name of a
8155+ particular mailbox.
8156+
8157+ 3.5. Overall Message Syntax
8158+
8159+ A message consists of header fields, optionally followed by a message
8160+ body. Lines in a message MUST be a maximum of 998 characters
8161+ excluding the CRLF, but it is RECOMMENDED that lines be limited to 78
8162+ characters excluding the CRLF. (See section 2.1.1 for explanation.)
8163+ In a message body, though all of the characters listed in the text
8164+ rule MAY be used, the use of US-ASCII control characters (values 1
8165+ through 8, 11, 12, and 14 through 31) is discouraged since their
8166+ interpretation by receivers for display is not guaranteed.
8167+
8168+ message = (fields / obs-fields)
8169+ [CRLF body]
8170+
8171+ body = (*(*998text CRLF) *998text) / obs-body
8172+
8173+ text = %d1-9 / ; Characters excluding CR
8174+ %d11 / ; and LF
8175+ %d12 /
8176+ %d14-127
8177+
8178+
8179+
8180+
8181+
8182+ Resnick Standards Track [Page 18]
8183+
8184+ RFC 5322 Internet Message Format October 2008
8185+
8186+
8187+ The header fields carry most of the semantic information and are
8188+ defined in section 3.6. The body is simply a series of lines of text
8189+ that are uninterpreted for the purposes of this specification.
8190+
8191+ 3.6. Field Definitions
8192+
8193+ The header fields of a message are defined here. All header fields
8194+ have the same general syntactic structure: a field name, followed by
8195+ a colon, followed by the field body. The specific syntax for each
8196+ header field is defined in the subsequent sections.
8197+
8198+ Note: In the ABNF syntax for each field in subsequent sections,
8199+ each field name is followed by the required colon. However, for
8200+ brevity, sometimes the colon is not referred to in the textual
8201+ description of the syntax. It is, nonetheless, required.
8202+
8203+ It is important to note that the header fields are not guaranteed to
8204+ be in a particular order. They may appear in any order, and they
8205+ have been known to be reordered occasionally when transported over
8206+ the Internet. However, for the purposes of this specification,
8207+ header fields SHOULD NOT be reordered when a message is transported
8208+ or transformed. More importantly, the trace header fields and resent
8209+ header fields MUST NOT be reordered, and SHOULD be kept in blocks
8210+ prepended to the message. See sections 3.6.6 and 3.6.7 for more
8211+ information.
8212+
8213+ The only required header fields are the origination date field and
8214+ the originator address field(s). All other header fields are
8215+ syntactically optional. More information is contained in the table
8216+ following this definition.
8217+
8218+
8219+
8220+
8221+
8222+
8223+
8224+
8225+
8226+
8227+
8228+
8229+
8230+
8231+
8232+
8233+
8234+
8235+
8236+
8237+
8238+ Resnick Standards Track [Page 19]
8239+
8240+ RFC 5322 Internet Message Format October 2008
8241+
8242+
8243+ fields = *(trace
8244+ *optional-field /
8245+ *(resent-date /
8246+ resent-from /
8247+ resent-sender /
8248+ resent-to /
8249+ resent-cc /
8250+ resent-bcc /
8251+ resent-msg-id))
8252+ *(orig-date /
8253+ from /
8254+ sender /
8255+ reply-to /
8256+ to /
8257+ cc /
8258+ bcc /
8259+ message-id /
8260+ in-reply-to /
8261+ references /
8262+ subject /
8263+ comments /
8264+ keywords /
8265+ optional-field)
8266+
8267+ The following table indicates limits on the number of times each
8268+ field may occur in the header section of a message as well as any
8269+ special limitations on the use of those fields. An asterisk ("*")
8270+ next to a value in the minimum or maximum column indicates that a
8271+ special restriction appears in the Notes column.
8272+
8273+
8274+
8275+
8276+
8277+
8278+
8279+
8280+
8281+
8282+
8283+
8284+
8285+
8286+
8287+
8288+
8289+
8290+
8291+
8292+
8293+
8294+ Resnick Standards Track [Page 20]
8295+
8296+ RFC 5322 Internet Message Format October 2008
8297+
8298+
8299+ +----------------+--------+------------+----------------------------+
8300+ | Field | Min | Max number | Notes |
8301+ | | number | | |
8302+ +----------------+--------+------------+----------------------------+
8303+ | trace | 0 | unlimited | Block prepended - see |
8304+ | | | | 3.6.7 |
8305+ | resent-date | 0* | unlimited* | One per block, required if |
8306+ | | | | other resent fields are |
8307+ | | | | present - see 3.6.6 |
8308+ | resent-from | 0 | unlimited* | One per block - see 3.6.6 |
8309+ | resent-sender | 0* | unlimited* | One per block, MUST occur |
8310+ | | | | with multi-address |
8311+ | | | | resent-from - see 3.6.6 |
8312+ | resent-to | 0 | unlimited* | One per block - see 3.6.6 |
8313+ | resent-cc | 0 | unlimited* | One per block - see 3.6.6 |
8314+ | resent-bcc | 0 | unlimited* | One per block - see 3.6.6 |
8315+ | resent-msg-id | 0 | unlimited* | One per block - see 3.6.6 |
8316+ | orig-date | 1 | 1 | |
8317+ | from | 1 | 1 | See sender and 3.6.2 |
8318+ | sender | 0* | 1 | MUST occur with |
8319+ | | | | multi-address from - see |
8320+ | | | | 3.6.2 |
8321+ | reply-to | 0 | 1 | |
8322+ | to | 0 | 1 | |
8323+ | cc | 0 | 1 | |
8324+ | bcc | 0 | 1 | |
8325+ | message-id | 0* | 1 | SHOULD be present - see |
8326+ | | | | 3.6.4 |
8327+ | in-reply-to | 0* | 1 | SHOULD occur in some |
8328+ | | | | replies - see 3.6.4 |
8329+ | references | 0* | 1 | SHOULD occur in some |
8330+ | | | | replies - see 3.6.4 |
8331+ | subject | 0 | 1 | |
8332+ | comments | 0 | unlimited | |
8333+ | keywords | 0 | unlimited | |
8334+ | optional-field | 0 | unlimited | |
8335+ +----------------+--------+------------+----------------------------+
8336+
8337+ The exact interpretation of each field is described in subsequent
8338+ sections.
8339+
8340+
8341+
8342+
8343+
8344+
8345+
8346+
8347+
8348+
8349+
8350+ Resnick Standards Track [Page 21]
8351+
8352+ RFC 5322 Internet Message Format October 2008
8353+
8354+
8355+ 3.6.1. The Origination Date Field
8356+
8357+ The origination date field consists of the field name "Date" followed
8358+ by a date-time specification.
8359+
8360+ orig-date = "Date:" date-time CRLF
8361+
8362+ The origination date specifies the date and time at which the creator
8363+ of the message indicated that the message was complete and ready to
8364+ enter the mail delivery system. For instance, this might be the time
8365+ that a user pushes the "send" or "submit" button in an application
8366+ program. In any case, it is specifically not intended to convey the
8367+ time that the message is actually transported, but rather the time at
8368+ which the human or other creator of the message has put the message
8369+ into its final form, ready for transport. (For example, a portable
8370+ computer user who is not connected to a network might queue a message
8371+ for delivery. The origination date is intended to contain the date
8372+ and time that the user queued the message, not the time when the user
8373+ connected to the network to send the message.)
8374+
8375+ 3.6.2. Originator Fields
8376+
8377+ The originator fields of a message consist of the from field, the
8378+ sender field (when applicable), and optionally the reply-to field.
8379+ The from field consists of the field name "From" and a comma-
8380+ separated list of one or more mailbox specifications. If the from
8381+ field contains more than one mailbox specification in the mailbox-
8382+ list, then the sender field, containing the field name "Sender" and a
8383+ single mailbox specification, MUST appear in the message. In either
8384+ case, an optional reply-to field MAY also be included, which contains
8385+ the field name "Reply-To" and a comma-separated list of one or more
8386+ addresses.
8387+
8388+ from = "From:" mailbox-list CRLF
8389+
8390+ sender = "Sender:" mailbox CRLF
8391+
8392+ reply-to = "Reply-To:" address-list CRLF
8393+
8394+ The originator fields indicate the mailbox(es) of the source of the
8395+ message. The "From:" field specifies the author(s) of the message,
8396+ that is, the mailbox(es) of the person(s) or system(s) responsible
8397+ for the writing of the message. The "Sender:" field specifies the
8398+ mailbox of the agent responsible for the actual transmission of the
8399+ message. For example, if a secretary were to send a message for
8400+ another person, the mailbox of the secretary would appear in the
8401+ "Sender:" field and the mailbox of the actual author would appear in
8402+ the "From:" field. If the originator of the message can be indicated
8403+
8404+
8405+
8406+ Resnick Standards Track [Page 22]
8407+
8408+ RFC 5322 Internet Message Format October 2008
8409+
8410+
8411+ by a single mailbox and the author and transmitter are identical, the
8412+ "Sender:" field SHOULD NOT be used. Otherwise, both fields SHOULD
8413+ appear.
8414+
8415+ Note: The transmitter information is always present. The absence
8416+ of the "Sender:" field is sometimes mistakenly taken to mean that
8417+ the agent responsible for transmission of the message has not been
8418+ specified. This absence merely means that the transmitter is
8419+ identical to the author and is therefore not redundantly placed
8420+ into the "Sender:" field.
8421+
8422+ The originator fields also provide the information required when
8423+ replying to a message. When the "Reply-To:" field is present, it
8424+ indicates the address(es) to which the author of the message suggests
8425+ that replies be sent. In the absence of the "Reply-To:" field,
8426+ replies SHOULD by default be sent to the mailbox(es) specified in the
8427+ "From:" field unless otherwise specified by the person composing the
8428+ reply.
8429+
8430+ In all cases, the "From:" field SHOULD NOT contain any mailbox that
8431+ does not belong to the author(s) of the message. See also section
8432+ 3.6.3 for more information on forming the destination addresses for a
8433+ reply.
8434+
8435+ 3.6.3. Destination Address Fields
8436+
8437+ The destination fields of a message consist of three possible fields,
8438+ each of the same form: the field name, which is either "To", "Cc", or
8439+ "Bcc", followed by a comma-separated list of one or more addresses
8440+ (either mailbox or group syntax).
8441+
8442+ to = "To:" address-list CRLF
8443+
8444+ cc = "Cc:" address-list CRLF
8445+
8446+ bcc = "Bcc:" [address-list / CFWS] CRLF
8447+
8448+ The destination fields specify the recipients of the message. Each
8449+ destination field may have one or more addresses, and the addresses
8450+ indicate the intended recipients of the message. The only difference
8451+ between the three fields is how each is used.
8452+
8453+ The "To:" field contains the address(es) of the primary recipient(s)
8454+ of the message.
8455+
8456+
8457+
8458+
8459+
8460+
8461+
8462+ Resnick Standards Track [Page 23]
8463+
8464+ RFC 5322 Internet Message Format October 2008
8465+
8466+
8467+ The "Cc:" field (where the "Cc" means "Carbon Copy" in the sense of
8468+ making a copy on a typewriter using carbon paper) contains the
8469+ addresses of others who are to receive the message, though the
8470+ content of the message may not be directed at them.
8471+
8472+ The "Bcc:" field (where the "Bcc" means "Blind Carbon Copy") contains
8473+ addresses of recipients of the message whose addresses are not to be
8474+ revealed to other recipients of the message. There are three ways in
8475+ which the "Bcc:" field is used. In the first case, when a message
8476+ containing a "Bcc:" field is prepared to be sent, the "Bcc:" line is
8477+ removed even though all of the recipients (including those specified
8478+ in the "Bcc:" field) are sent a copy of the message. In the second
8479+ case, recipients specified in the "To:" and "Cc:" lines each are sent
8480+ a copy of the message with the "Bcc:" line removed as above, but the
8481+ recipients on the "Bcc:" line get a separate copy of the message
8482+ containing a "Bcc:" line. (When there are multiple recipient
8483+ addresses in the "Bcc:" field, some implementations actually send a
8484+ separate copy of the message to each recipient with a "Bcc:"
8485+ containing only the address of that particular recipient.) Finally,
8486+ since a "Bcc:" field may contain no addresses, a "Bcc:" field can be
8487+ sent without any addresses indicating to the recipients that blind
8488+ copies were sent to someone. Which method to use with "Bcc:" fields
8489+ is implementation dependent, but refer to the "Security
8490+ Considerations" section of this document for a discussion of each.
8491+
8492+ When a message is a reply to another message, the mailboxes of the
8493+ authors of the original message (the mailboxes in the "From:" field)
8494+ or mailboxes specified in the "Reply-To:" field (if it exists) MAY
8495+ appear in the "To:" field of the reply since these would normally be
8496+ the primary recipients of the reply. If a reply is sent to a message
8497+ that has destination fields, it is often desirable to send a copy of
8498+ the reply to all of the recipients of the message, in addition to the
8499+ author. When such a reply is formed, addresses in the "To:" and
8500+ "Cc:" fields of the original message MAY appear in the "Cc:" field of
8501+ the reply, since these are normally secondary recipients of the
8502+ reply. If a "Bcc:" field is present in the original message,
8503+ addresses in that field MAY appear in the "Bcc:" field of the reply,
8504+ but they SHOULD NOT appear in the "To:" or "Cc:" fields.
8505+
8506+ Note: Some mail applications have automatic reply commands that
8507+ include the destination addresses of the original message in the
8508+ destination addresses of the reply. How those reply commands
8509+ behave is implementation dependent and is beyond the scope of this
8510+ document. In particular, whether or not to include the original
8511+ destination addresses when the original message had a "Reply-To:"
8512+ field is not addressed here.
8513+
8514+
8515+
8516+
8517+
8518+ Resnick Standards Track [Page 24]
8519+
8520+ RFC 5322 Internet Message Format October 2008
8521+
8522+
8523+ 3.6.4. Identification Fields
8524+
8525+ Though listed as optional in the table in section 3.6, every message
8526+ SHOULD have a "Message-ID:" field. Furthermore, reply messages
8527+ SHOULD have "In-Reply-To:" and "References:" fields as appropriate
8528+ and as described below.
8529+
8530+ The "Message-ID:" field contains a single unique message identifier.
8531+ The "References:" and "In-Reply-To:" fields each contain one or more
8532+ unique message identifiers, optionally separated by CFWS.
8533+
8534+ The message identifier (msg-id) syntax is a limited version of the
8535+ addr-spec construct enclosed in the angle bracket characters, "<" and
8536+ ">". Unlike addr-spec, this syntax only permits the dot-atom-text
8537+ form on the left-hand side of the "@" and does not have internal CFWS
8538+ anywhere in the message identifier.
8539+
8540+ Note: As with addr-spec, a liberal syntax is given for the right-
8541+ hand side of the "@" in a msg-id. However, later in this section,
8542+ the use of a domain for the right-hand side of the "@" is
8543+ RECOMMENDED. Again, the syntax of domain constructs is specified
8544+ by and used in other protocols (e.g., [RFC1034], [RFC1035],
8545+ [RFC1123], [RFC5321]). It is therefore incumbent upon
8546+ implementations to conform to the syntax of addresses for the
8547+ context in which they are used.
8548+
8549+ message-id = "Message-ID:" msg-id CRLF
8550+
8551+ in-reply-to = "In-Reply-To:" 1*msg-id CRLF
8552+
8553+ references = "References:" 1*msg-id CRLF
8554+
8555+ msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS]
8556+
8557+ id-left = dot-atom-text / obs-id-left
8558+
8559+ id-right = dot-atom-text / no-fold-literal / obs-id-right
8560+
8561+ no-fold-literal = "[" *dtext "]"
8562+
8563+ The "Message-ID:" field provides a unique message identifier that
8564+ refers to a particular version of a particular message. The
8565+ uniqueness of the message identifier is guaranteed by the host that
8566+ generates it (see below). This message identifier is intended to be
8567+ machine readable and not necessarily meaningful to humans. A message
8568+ identifier pertains to exactly one version of a particular message;
8569+ subsequent revisions to the message each receive new message
8570+ identifiers.
8571+
8572+
8573+
8574+ Resnick Standards Track [Page 25]
8575+
8576+ RFC 5322 Internet Message Format October 2008
8577+
8578+
8579+ Note: There are many instances when messages are "changed", but
8580+ those changes do not constitute a new instantiation of that
8581+ message, and therefore the message would not get a new message
8582+ identifier. For example, when messages are introduced into the
8583+ transport system, they are often prepended with additional header
8584+ fields such as trace fields (described in section 3.6.7) and
8585+ resent fields (described in section 3.6.6). The addition of such
8586+ header fields does not change the identity of the message and
8587+ therefore the original "Message-ID:" field is retained. In all
8588+ cases, it is the meaning that the sender of the message wishes to
8589+ convey (i.e., whether this is the same message or a different
8590+ message) that determines whether or not the "Message-ID:" field
8591+ changes, not any particular syntactic difference that appears (or
8592+ does not appear) in the message.
8593+
8594+ The "In-Reply-To:" and "References:" fields are used when creating a
8595+ reply to a message. They hold the message identifier of the original
8596+ message and the message identifiers of other messages (for example,
8597+ in the case of a reply to a message that was itself a reply). The
8598+ "In-Reply-To:" field may be used to identify the message (or
8599+ messages) to which the new message is a reply, while the
8600+ "References:" field may be used to identify a "thread" of
8601+ conversation.
8602+
8603+ When creating a reply to a message, the "In-Reply-To:" and
8604+ "References:" fields of the resultant message are constructed as
8605+ follows:
8606+
8607+ The "In-Reply-To:" field will contain the contents of the
8608+ "Message-ID:" field of the message to which this one is a reply (the
8609+ "parent message"). If there is more than one parent message, then
8610+ the "In-Reply-To:" field will contain the contents of all of the
8611+ parents' "Message-ID:" fields. If there is no "Message-ID:" field in
8612+ any of the parent messages, then the new message will have no "In-
8613+ Reply-To:" field.
8614+
8615+ The "References:" field will contain the contents of the parent's
8616+ "References:" field (if any) followed by the contents of the parent's
8617+ "Message-ID:" field (if any). If the parent message does not contain
8618+ a "References:" field but does have an "In-Reply-To:" field
8619+ containing a single message identifier, then the "References:" field
8620+ will contain the contents of the parent's "In-Reply-To:" field
8621+ followed by the contents of the parent's "Message-ID:" field (if
8622+ any). If the parent has none of the "References:", "In-Reply-To:",
8623+ or "Message-ID:" fields, then the new message will have no
8624+ "References:" field.
8625+
8626+
8627+
8628+
8629+
8630+ Resnick Standards Track [Page 26]
8631+
8632+ RFC 5322 Internet Message Format October 2008
8633+
8634+
8635+ Note: Some implementations parse the "References:" field to
8636+ display the "thread of the discussion". These implementations
8637+ assume that each new message is a reply to a single parent and
8638+ hence that they can walk backwards through the "References:" field
8639+ to find the parent of each message listed there. Therefore,
8640+ trying to form a "References:" field for a reply that has multiple
8641+ parents is discouraged; how to do so is not defined in this
8642+ document.
8643+
8644+ The message identifier (msg-id) itself MUST be a globally unique
8645+ identifier for a message. The generator of the message identifier
8646+ MUST guarantee that the msg-id is unique. There are several
8647+ algorithms that can be used to accomplish this. Since the msg-id has
8648+ a similar syntax to addr-spec (identical except that quoted strings,
8649+ comments, and folding white space are not allowed), a good method is
8650+ to put the domain name (or a domain literal IP address) of the host
8651+ on which the message identifier was created on the right-hand side of
8652+ the "@" (since domain names and IP addresses are normally unique),
8653+ and put a combination of the current absolute date and time along
8654+ with some other currently unique (perhaps sequential) identifier
8655+ available on the system (for example, a process id number) on the
8656+ left-hand side. Though other algorithms will work, it is RECOMMENDED
8657+ that the right-hand side contain some domain identifier (either of
8658+ the host itself or otherwise) such that the generator of the message
8659+ identifier can guarantee the uniqueness of the left-hand side within
8660+ the scope of that domain.
8661+
8662+ Semantically, the angle bracket characters are not part of the
8663+ msg-id; the msg-id is what is contained between the two angle bracket
8664+ characters.
8665+
8666+ 3.6.5. Informational Fields
8667+
8668+ The informational fields are all optional. The "Subject:" and
8669+ "Comments:" fields are unstructured fields as defined in section
8670+ 2.2.1, and therefore may contain text or folding white space. The
8671+ "Keywords:" field contains a comma-separated list of one or more
8672+ words or quoted-strings.
8673+
8674+ subject = "Subject:" unstructured CRLF
8675+
8676+ comments = "Comments:" unstructured CRLF
8677+
8678+ keywords = "Keywords:" phrase *("," phrase) CRLF
8679+
8680+ These three fields are intended to have only human-readable content
8681+ with information about the message. The "Subject:" field is the most
8682+ common and contains a short string identifying the topic of the
8683+
8684+
8685+
8686+ Resnick Standards Track [Page 27]
8687+
8688+ RFC 5322 Internet Message Format October 2008
8689+
8690+
8691+ message. When used in a reply, the field body MAY start with the
8692+ string "Re: " (an abbreviation of the Latin "in re", meaning "in the
8693+ matter of") followed by the contents of the "Subject:" field body of
8694+ the original message. If this is done, only one instance of the
8695+ literal string "Re: " ought to be used since use of other strings or
8696+ more than one instance can lead to undesirable consequences. The
8697+ "Comments:" field contains any additional comments on the text of the
8698+ body of the message. The "Keywords:" field contains a comma-
8699+ separated list of important words and phrases that might be useful
8700+ for the recipient.
8701+
8702+ 3.6.6. Resent Fields
8703+
8704+ Resent fields SHOULD be added to any message that is reintroduced by
8705+ a user into the transport system. A separate set of resent fields
8706+ SHOULD be added each time this is done. All of the resent fields
8707+ corresponding to a particular resending of the message SHOULD be
8708+ grouped together. Each new set of resent fields is prepended to the
8709+ message; that is, the most recent set of resent fields appears
8710+ earlier in the message. No other fields in the message are changed
8711+ when resent fields are added.
8712+
8713+ Each of the resent fields corresponds to a particular field elsewhere
8714+ in the syntax. For instance, the "Resent-Date:" field corresponds to
8715+ the "Date:" field and the "Resent-To:" field corresponds to the "To:"
8716+ field. In each case, the syntax for the field body is identical to
8717+ the syntax given previously for the corresponding field.
8718+
8719+ When resent fields are used, the "Resent-From:" and "Resent-Date:"
8720+ fields MUST be sent. The "Resent-Message-ID:" field SHOULD be sent.
8721+ "Resent-Sender:" SHOULD NOT be used if "Resent-Sender:" would be
8722+ identical to "Resent-From:".
8723+
8724+ resent-date = "Resent-Date:" date-time CRLF
8725+
8726+ resent-from = "Resent-From:" mailbox-list CRLF
8727+
8728+ resent-sender = "Resent-Sender:" mailbox CRLF
8729+
8730+ resent-to = "Resent-To:" address-list CRLF
8731+
8732+ resent-cc = "Resent-Cc:" address-list CRLF
8733+
8734+ resent-bcc = "Resent-Bcc:" [address-list / CFWS] CRLF
8735+
8736+ resent-msg-id = "Resent-Message-ID:" msg-id CRLF
8737+
8738+
8739+
8740+
8741+
8742+ Resnick Standards Track [Page 28]
8743+
8744+ RFC 5322 Internet Message Format October 2008
8745+
8746+
8747+ Resent fields are used to identify a message as having been
8748+ reintroduced into the transport system by a user. The purpose of
8749+ using resent fields is to have the message appear to the final
8750+ recipient as if it were sent directly by the original sender, with
8751+ all of the original fields remaining the same. Each set of resent
8752+ fields correspond to a particular resending event. That is, if a
8753+ message is resent multiple times, each set of resent fields gives
8754+ identifying information for each individual time. Resent fields are
8755+ strictly informational. They MUST NOT be used in the normal
8756+ processing of replies or other such automatic actions on messages.
8757+
8758+ Note: Reintroducing a message into the transport system and using
8759+ resent fields is a different operation from "forwarding".
8760+ "Forwarding" has two meanings: One sense of forwarding is that a
8761+ mail reading program can be told by a user to forward a copy of a
8762+ message to another person, making the forwarded message the body
8763+ of the new message. A forwarded message in this sense does not
8764+ appear to have come from the original sender, but is an entirely
8765+ new message from the forwarder of the message. Forwarding may
8766+ also mean that a mail transport program gets a message and
8767+ forwards it on to a different destination for final delivery.
8768+ Resent header fields are not intended for use with either type of
8769+ forwarding.
8770+
8771+ The resent originator fields indicate the mailbox of the person(s) or
8772+ system(s) that resent the message. As with the regular originator
8773+ fields, there are two forms: a simple "Resent-From:" form, which
8774+ contains the mailbox of the individual doing the resending, and the
8775+ more complex form, when one individual (identified in the "Resent-
8776+ Sender:" field) resends a message on behalf of one or more others
8777+ (identified in the "Resent-From:" field).
8778+
8779+ Note: When replying to a resent message, replies behave just as
8780+ they would with any other message, using the original "From:",
8781+ "Reply-To:", "Message-ID:", and other fields. The resent fields
8782+ are only informational and MUST NOT be used in the normal
8783+ processing of replies.
8784+
8785+ The "Resent-Date:" indicates the date and time at which the resent
8786+ message is dispatched by the resender of the message. Like the
8787+ "Date:" field, it is not the date and time that the message was
8788+ actually transported.
8789+
8790+ The "Resent-To:", "Resent-Cc:", and "Resent-Bcc:" fields function
8791+ identically to the "To:", "Cc:", and "Bcc:" fields, respectively,
8792+ except that they indicate the recipients of the resent message, not
8793+ the recipients of the original message.
8794+
8795+
8796+
8797+
8798+ Resnick Standards Track [Page 29]
8799+
8800+ RFC 5322 Internet Message Format October 2008
8801+
8802+
8803+ The "Resent-Message-ID:" field provides a unique identifier for the
8804+ resent message.
8805+
8806+ 3.6.7. Trace Fields
8807+
8808+ The trace fields are a group of header fields consisting of an
8809+ optional "Return-Path:" field, and one or more "Received:" fields.
8810+ The "Return-Path:" header field contains a pair of angle brackets
8811+ that enclose an optional addr-spec. The "Received:" field contains a
8812+ (possibly empty) list of tokens followed by a semicolon and a date-
8813+ time specification. Each token must be a word, angle-addr, addr-
8814+ spec, or a domain. Further restrictions are applied to the syntax of
8815+ the trace fields by specifications that provide for their use, such
8816+ as [RFC5321].
8817+
8818+ trace = [return]
8819+ 1*received
8820+
8821+ return = "Return-Path:" path CRLF
8822+
8823+ path = angle-addr / ([CFWS] "<" [CFWS] ">" [CFWS])
8824+
8825+ received = "Received:" *received-token ";" date-time CRLF
8826+
8827+ received-token = word / angle-addr / addr-spec / domain
8828+
8829+ A full discussion of the Internet mail use of trace fields is
8830+ contained in [RFC5321]. For the purposes of this specification, the
8831+ trace fields are strictly informational, and any formal
8832+ interpretation of them is outside of the scope of this document.
8833+
8834+ 3.6.8. Optional Fields
8835+
8836+ Fields may appear in messages that are otherwise unspecified in this
8837+ document. They MUST conform to the syntax of an optional-field.
8838+ This is a field name, made up of the printable US-ASCII characters
8839+ except SP and colon, followed by a colon, followed by any text that
8840+ conforms to the unstructured syntax.
8841+
8842+ The field names of any optional field MUST NOT be identical to any
8843+ field name specified elsewhere in this document.
8844+
8845+
8846+
8847+
8848+
8849+
8850+
8851+
8852+
8853+
8854+ Resnick Standards Track [Page 30]
8855+
8856+ RFC 5322 Internet Message Format October 2008
8857+
8858+
8859+ optional-field = field-name ":" unstructured CRLF
8860+
8861+ field-name = 1*ftext
8862+
8863+ ftext = %d33-57 / ; Printable US-ASCII
8864+ %d59-126 ; characters not including
8865+ ; ":".
8866+
8867+ For the purposes of this specification, any optional field is
8868+ uninterpreted.
8869+
8870+ 4. Obsolete Syntax
8871+
8872+ Earlier versions of this specification allowed for different (usually
8873+ more liberal) syntax than is allowed in this version. Also, there
8874+ have been syntactic elements used in messages on the Internet whose
8875+ interpretations have never been documented. Though these syntactic
8876+ forms MUST NOT be generated according to the grammar in section 3,
8877+ they MUST be accepted and parsed by a conformant receiver. This
8878+ section documents many of these syntactic elements. Taking the
8879+ grammar in section 3 and adding the definitions presented in this
8880+ section will result in the grammar to use for the interpretation of
8881+ messages.
8882+
8883+ Note: This section identifies syntactic forms that any
8884+ implementation MUST reasonably interpret. However, there are
8885+ certainly Internet messages that do not conform to even the
8886+ additional syntax given in this section. The fact that a
8887+ particular form does not appear in any section of this document is
8888+ not justification for computer programs to crash or for malformed
8889+ data to be irretrievably lost by any implementation. It is up to
8890+ the implementation to deal with messages robustly.
8891+
8892+ One important difference between the obsolete (interpreting) and the
8893+ current (generating) syntax is that in structured header field bodies
8894+ (i.e., between the colon and the CRLF of any structured header
8895+ field), white space characters, including folding white space, and
8896+ comments could be freely inserted between any syntactic tokens. This
8897+ allowed many complex forms that have proven difficult for some
8898+ implementations to parse.
8899+
8900+ Another key difference between the obsolete and the current syntax is
8901+ that the rule in section 3.2.2 regarding lines composed entirely of
8902+ white space in comments and folding white space does not apply. See
8903+ the discussion of folding white space in section 4.2 below.
8904+
8905+ Finally, certain characters that were formerly allowed in messages
8906+ appear in this section. The NUL character (ASCII value 0) was once
8907+
8908+
8909+
8910+ Resnick Standards Track [Page 31]
8911+
8912+ RFC 5322 Internet Message Format October 2008
8913+
8914+
8915+ allowed, but is no longer for compatibility reasons. Similarly, US-
8916+ ASCII control characters other than CR, LF, SP, and HTAB (ASCII
8917+ values 1 through 8, 11, 12, 14 through 31, and 127) were allowed to
8918+ appear in header field bodies. CR and LF were allowed to appear in
8919+ messages other than as CRLF; this use is also shown here.
8920+
8921+ Other differences in syntax and semantics are noted in the following
8922+ sections.
8923+
8924+ 4.1. Miscellaneous Obsolete Tokens
8925+
8926+ These syntactic elements are used elsewhere in the obsolete syntax or
8927+ in the main syntax. Bare CR, bare LF, and NUL are added to obs-qp,
8928+ obs-body, and obs-unstruct. US-ASCII control characters are added to
8929+ obs-qp, obs-unstruct, obs-ctext, and obs-qtext. The period character
8930+ is added to obs-phrase. The obs-phrase-list provides for a
8931+ (potentially empty) comma-separated list of phrases that may include
8932+ "null" elements. That is, there could be two or more commas in such
8933+ a list with nothing in between them, or commas at the beginning or
8934+ end of the list.
8935+
8936+ Note: The "period" (or "full stop") character (".") in obs-phrase
8937+ is not a form that was allowed in earlier versions of this or any
8938+ other specification. Period (nor any other character from
8939+ specials) was not allowed in phrase because it introduced a
8940+ parsing difficulty distinguishing between phrases and portions of
8941+ an addr-spec (see section 4.4). It appears here because the
8942+ period character is currently used in many messages in the
8943+ display-name portion of addresses, especially for initials in
8944+ names, and therefore must be interpreted properly.
8945+
8946+ obs-NO-WS-CTL = %d1-8 / ; US-ASCII control
8947+ %d11 / ; characters that do not
8948+ %d12 / ; include the carriage
8949+ %d14-31 / ; return, line feed, and
8950+ %d127 ; white space characters
8951+
8952+ obs-ctext = obs-NO-WS-CTL
8953+
8954+ obs-qtext = obs-NO-WS-CTL
8955+
8956+ obs-utext = %d0 / obs-NO-WS-CTL / VCHAR
8957+
8958+ obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR)
8959+
8960+ obs-body = *((*LF *CR *((%d0 / text) *LF *CR)) / CRLF)
8961+
8962+ obs-unstruct = *((*LF *CR *(obs-utext *LF *CR)) / FWS)
8963+
8964+
8965+
8966+ Resnick Standards Track [Page 32]
8967+
8968+ RFC 5322 Internet Message Format October 2008
8969+
8970+
8971+ obs-phrase = word *(word / "." / CFWS)
8972+
8973+ obs-phrase-list = [phrase / CFWS] *("," [phrase / CFWS])
8974+
8975+ Bare CR and bare LF appear in messages with two different meanings.
8976+ In many cases, bare CR or bare LF are used improperly instead of CRLF
8977+ to indicate line separators. In other cases, bare CR and bare LF are
8978+ used simply as US-ASCII control characters with their traditional
8979+ ASCII meanings.
8980+
8981+ 4.2. Obsolete Folding White Space
8982+
8983+ In the obsolete syntax, any amount of folding white space MAY be
8984+ inserted where the obs-FWS rule is allowed. This creates the
8985+ possibility of having two consecutive "folds" in a line, and
8986+ therefore the possibility that a line which makes up a folded header
8987+ field could be composed entirely of white space.
8988+
8989+ obs-FWS = 1*WSP *(CRLF 1*WSP)
8990+
8991+ 4.3. Obsolete Date and Time
8992+
8993+ The syntax for the obsolete date format allows a 2 digit year in the
8994+ date field and allows for a list of alphabetic time zone specifiers
8995+ that were used in earlier versions of this specification. It also
8996+ permits comments and folding white space between many of the tokens.
8997+
8998+ obs-day-of-week = [CFWS] day-name [CFWS]
8999+
9000+ obs-day = [CFWS] 1*2DIGIT [CFWS]
9001+
9002+ obs-year = [CFWS] 2*DIGIT [CFWS]
9003+
9004+ obs-hour = [CFWS] 2DIGIT [CFWS]
9005+
9006+ obs-minute = [CFWS] 2DIGIT [CFWS]
9007+
9008+ obs-second = [CFWS] 2DIGIT [CFWS]
9009+
9010+ obs-zone = "UT" / "GMT" / ; Universal Time
9011+ ; North American UT
9012+ ; offsets
9013+ "EST" / "EDT" / ; Eastern: - 5/ - 4
9014+ "CST" / "CDT" / ; Central: - 6/ - 5
9015+ "MST" / "MDT" / ; Mountain: - 7/ - 6
9016+ "PST" / "PDT" / ; Pacific: - 8/ - 7
9017+ ;
9018+
9019+
9020+
9021+
9022+ Resnick Standards Track [Page 33]
9023+
9024+ RFC 5322 Internet Message Format October 2008
9025+
9026+
9027+ %d65-73 / ; Military zones - "A"
9028+ %d75-90 / ; through "I" and "K"
9029+ %d97-105 / ; through "Z", both
9030+ %d107-122 ; upper and lower case
9031+
9032+ Where a two or three digit year occurs in a date, the year is to be
9033+ interpreted as follows: If a two digit year is encountered whose
9034+ value is between 00 and 49, the year is interpreted by adding 2000,
9035+ ending up with a value between 2000 and 2049. If a two digit year is
9036+ encountered with a value between 50 and 99, or any three digit year
9037+ is encountered, the year is interpreted by adding 1900.
9038+
9039+ In the obsolete time zone, "UT" and "GMT" are indications of
9040+ "Universal Time" and "Greenwich Mean Time", respectively, and are
9041+ both semantically identical to "+0000".
9042+
9043+ The remaining three character zones are the US time zones. The first
9044+ letter, "E", "C", "M", or "P" stands for "Eastern", "Central",
9045+ "Mountain", and "Pacific". The second letter is either "S" for
9046+ "Standard" time, or "D" for "Daylight Savings" (or summer) time.
9047+ Their interpretations are as follows:
9048+
9049+ EDT is semantically equivalent to -0400
9050+ EST is semantically equivalent to -0500
9051+ CDT is semantically equivalent to -0500
9052+ CST is semantically equivalent to -0600
9053+ MDT is semantically equivalent to -0600
9054+ MST is semantically equivalent to -0700
9055+ PDT is semantically equivalent to -0700
9056+ PST is semantically equivalent to -0800
9057+
9058+ The 1 character military time zones were defined in a non-standard
9059+ way in [RFC0822] and are therefore unpredictable in their meaning.
9060+ The original definitions of the military zones "A" through "I" are
9061+ equivalent to "+0100" through "+0900", respectively; "K", "L", and
9062+ "M" are equivalent to "+1000", "+1100", and "+1200", respectively;
9063+ "N" through "Y" are equivalent to "-0100" through "-1200".
9064+ respectively; and "Z" is equivalent to "+0000". However, because of
9065+ the error in [RFC0822], they SHOULD all be considered equivalent to
9066+ "-0000" unless there is out-of-band information confirming their
9067+ meaning.
9068+
9069+ Other multi-character (usually between 3 and 5) alphabetic time zones
9070+ have been used in Internet messages. Any such time zone whose
9071+ meaning is not known SHOULD be considered equivalent to "-0000"
9072+ unless there is out-of-band information confirming their meaning.
9073+
9074+
9075+
9076+
9077+
9078+ Resnick Standards Track [Page 34]
9079+
9080+ RFC 5322 Internet Message Format October 2008
9081+
9082+
9083+ 4.4. Obsolete Addressing
9084+
9085+ There are four primary differences in addressing. First, mailbox
9086+ addresses were allowed to have a route portion before the addr-spec
9087+ when enclosed in "<" and ">". The route is simply a comma-separated
9088+ list of domain names, each preceded by "@", and the list terminated
9089+ by a colon. Second, CFWS were allowed between the period-separated
9090+ elements of local-part and domain (i.e., dot-atom was not used). In
9091+ addition, local-part is allowed to contain quoted-string in addition
9092+ to just atom. Third, mailbox-list and address-list were allowed to
9093+ have "null" members. That is, there could be two or more commas in
9094+ such a list with nothing in between them, or commas at the beginning
9095+ or end of the list. Finally, US-ASCII control characters and quoted-
9096+ pairs were allowed in domain literals and are added here.
9097+
9098+ obs-angle-addr = [CFWS] "<" obs-route addr-spec ">" [CFWS]
9099+
9100+ obs-route = obs-domain-list ":"
9101+
9102+ obs-domain-list = *(CFWS / ",") "@" domain
9103+ *("," [CFWS] ["@" domain])
9104+
9105+ obs-mbox-list = *([CFWS] ",") mailbox *("," [mailbox / CFWS])
9106+
9107+ obs-addr-list = *([CFWS] ",") address *("," [address / CFWS])
9108+
9109+ obs-group-list = 1*([CFWS] ",") [CFWS]
9110+
9111+ obs-local-part = word *("." word)
9112+
9113+ obs-domain = atom *("." atom)
9114+
9115+ obs-dtext = obs-NO-WS-CTL / quoted-pair
9116+
9117+ When interpreting addresses, the route portion SHOULD be ignored.
9118+
9119+ 4.5. Obsolete Header Fields
9120+
9121+ Syntactically, the primary difference in the obsolete field syntax is
9122+ that it allows multiple occurrences of any of the fields and they may
9123+ occur in any order. Also, any amount of white space is allowed
9124+ before the ":" at the end of the field name.
9125+
9126+
9127+
9128+
9129+
9130+
9131+
9132+
9133+
9134+ Resnick Standards Track [Page 35]
9135+
9136+ RFC 5322 Internet Message Format October 2008
9137+
9138+
9139+ obs-fields = *(obs-return /
9140+ obs-received /
9141+ obs-orig-date /
9142+ obs-from /
9143+ obs-sender /
9144+ obs-reply-to /
9145+ obs-to /
9146+ obs-cc /
9147+ obs-bcc /
9148+ obs-message-id /
9149+ obs-in-reply-to /
9150+ obs-references /
9151+ obs-subject /
9152+ obs-comments /
9153+ obs-keywords /
9154+ obs-resent-date /
9155+ obs-resent-from /
9156+ obs-resent-send /
9157+ obs-resent-rply /
9158+ obs-resent-to /
9159+ obs-resent-cc /
9160+ obs-resent-bcc /
9161+ obs-resent-mid /
9162+ obs-optional)
9163+
9164+ Except for destination address fields (described in section 4.5.3),
9165+ the interpretation of multiple occurrences of fields is unspecified.
9166+ Also, the interpretation of trace fields and resent fields that do
9167+ not occur in blocks prepended to the message is unspecified as well.
9168+ Unless otherwise noted in the following sections, interpretation of
9169+ other fields is identical to the interpretation of their non-obsolete
9170+ counterparts in section 3.
9171+
9172+ 4.5.1. Obsolete Origination Date Field
9173+
9174+ obs-orig-date = "Date" *WSP ":" date-time CRLF
9175+
9176+ 4.5.2. Obsolete Originator Fields
9177+
9178+ obs-from = "From" *WSP ":" mailbox-list CRLF
9179+
9180+ obs-sender = "Sender" *WSP ":" mailbox CRLF
9181+
9182+ obs-reply-to = "Reply-To" *WSP ":" address-list CRLF
9183+
9184+
9185+
9186+
9187+
9188+
9189+
9190+ Resnick Standards Track [Page 36]
9191+
9192+ RFC 5322 Internet Message Format October 2008
9193+
9194+
9195+ 4.5.3. Obsolete Destination Address Fields
9196+
9197+ obs-to = "To" *WSP ":" address-list CRLF
9198+
9199+ obs-cc = "Cc" *WSP ":" address-list CRLF
9200+
9201+ obs-bcc = "Bcc" *WSP ":"
9202+ (address-list / (*([CFWS] ",") [CFWS])) CRLF
9203+
9204+ When multiple occurrences of destination address fields occur in a
9205+ message, they SHOULD be treated as if the address list in the first
9206+ occurrence of the field is combined with the address lists of the
9207+ subsequent occurrences by adding a comma and concatenating.
9208+
9209+ 4.5.4. Obsolete Identification Fields
9210+
9211+ The obsolete "In-Reply-To:" and "References:" fields differ from the
9212+ current syntax in that they allow phrase (words or quoted strings) to
9213+ appear. The obsolete forms of the left and right sides of msg-id
9214+ allow interspersed CFWS, making them syntactically identical to
9215+ local-part and domain, respectively.
9216+
9217+ obs-message-id = "Message-ID" *WSP ":" msg-id CRLF
9218+
9219+ obs-in-reply-to = "In-Reply-To" *WSP ":" *(phrase / msg-id) CRLF
9220+
9221+ obs-references = "References" *WSP ":" *(phrase / msg-id) CRLF
9222+
9223+ obs-id-left = local-part
9224+
9225+ obs-id-right = domain
9226+
9227+ For purposes of interpretation, the phrases in the "In-Reply-To:" and
9228+ "References:" fields are ignored.
9229+
9230+ Semantically, none of the optional CFWS in the local-part and the
9231+ domain is part of the obs-id-left and obs-id-right, respectively.
9232+
9233+ 4.5.5. Obsolete Informational Fields
9234+
9235+ obs-subject = "Subject" *WSP ":" unstructured CRLF
9236+
9237+ obs-comments = "Comments" *WSP ":" unstructured CRLF
9238+
9239+ obs-keywords = "Keywords" *WSP ":" obs-phrase-list CRLF
9240+
9241+
9242+
9243+
9244+
9245+
9246+ Resnick Standards Track [Page 37]
9247+
9248+ RFC 5322 Internet Message Format October 2008
9249+
9250+
9251+ 4.5.6. Obsolete Resent Fields
9252+
9253+ The obsolete syntax adds a "Resent-Reply-To:" field, which consists
9254+ of the field name, the optional comments and folding white space, the
9255+ colon, and a comma separated list of addresses.
9256+
9257+ obs-resent-from = "Resent-From" *WSP ":" mailbox-list CRLF
9258+
9259+ obs-resent-send = "Resent-Sender" *WSP ":" mailbox CRLF
9260+
9261+ obs-resent-date = "Resent-Date" *WSP ":" date-time CRLF
9262+
9263+ obs-resent-to = "Resent-To" *WSP ":" address-list CRLF
9264+
9265+ obs-resent-cc = "Resent-Cc" *WSP ":" address-list CRLF
9266+
9267+ obs-resent-bcc = "Resent-Bcc" *WSP ":"
9268+ (address-list / (*([CFWS] ",") [CFWS])) CRLF
9269+
9270+ obs-resent-mid = "Resent-Message-ID" *WSP ":" msg-id CRLF
9271+
9272+ obs-resent-rply = "Resent-Reply-To" *WSP ":" address-list CRLF
9273+
9274+ As with other resent fields, the "Resent-Reply-To:" field is to be
9275+ treated as trace information only.
9276+
9277+ 4.5.7. Obsolete Trace Fields
9278+
9279+ The obs-return and obs-received are again given here as template
9280+ definitions, just as return and received are in section 3. Their
9281+ full syntax is given in [RFC5321].
9282+
9283+ obs-return = "Return-Path" *WSP ":" path CRLF
9284+
9285+ obs-received = "Received" *WSP ":" *received-token CRLF
9286+
9287+ 4.5.8. Obsolete optional fields
9288+
9289+ obs-optional = field-name *WSP ":" unstructured CRLF
9290+
9291+ 5. Security Considerations
9292+
9293+ Care needs to be taken when displaying messages on a terminal or
9294+ terminal emulator. Powerful terminals may act on escape sequences
9295+ and other combinations of US-ASCII control characters with a variety
9296+ of consequences. They can remap the keyboard or permit other
9297+ modifications to the terminal that could lead to denial of service or
9298+ even damaged data. They can trigger (sometimes programmable)
9299+
9300+
9301+
9302+ Resnick Standards Track [Page 38]
9303+
9304+ RFC 5322 Internet Message Format October 2008
9305+
9306+
9307+ answerback messages that can allow a message to cause commands to be
9308+ issued on the recipient's behalf. They can also affect the operation
9309+ of terminal attached devices such as printers. Message viewers may
9310+ wish to strip potentially dangerous terminal escape sequences from
9311+ the message prior to display. However, other escape sequences appear
9312+ in messages for useful purposes (cf. [ISO.2022.1994], [RFC2045],
9313+ [RFC2046], [RFC2047], [RFC2049], [RFC4288], [RFC4289]) and therefore
9314+ should not be stripped indiscriminately.
9315+
9316+ Transmission of non-text objects in messages raises additional
9317+ security issues. These issues are discussed in [RFC2045], [RFC2046],
9318+ [RFC2047], [RFC2049], [RFC4288], and [RFC4289].
9319+
9320+ Many implementations use the "Bcc:" (blind carbon copy) field,
9321+ described in section 3.6.3, to facilitate sending messages to
9322+ recipients without revealing the addresses of one or more of the
9323+ addressees to the other recipients. Mishandling this use of "Bcc:"
9324+ may disclose confidential information that could eventually lead to
9325+ security problems through knowledge of even the existence of a
9326+ particular mail address. For example, if using the first method
9327+ described in section 3.6.3, where the "Bcc:" line is removed from the
9328+ message, blind recipients have no explicit indication that they have
9329+ been sent a blind copy, except insofar as their address does not
9330+ appear in the header section of a message. Because of this, one of
9331+ the blind addressees could potentially send a reply to all of the
9332+ shown recipients and accidentally reveal that the message went to the
9333+ blind recipient. When the second method from section 3.6.3 is used,
9334+ the blind recipient's address appears in the "Bcc:" field of a
9335+ separate copy of the message. If the "Bcc:" field sent contains all
9336+ of the blind addressees, all of the "Bcc:" recipients will be seen by
9337+ each "Bcc:" recipient. Even if a separate message is sent to each
9338+ "Bcc:" recipient with only the individual's address, implementations
9339+ still need to be careful to process replies to the message as per
9340+ section 3.6.3 so as not to accidentally reveal the blind recipient to
9341+ other recipients.
9342+
9343+ 6. IANA Considerations
9344+
9345+ This document updates the registrations that appeared in [RFC4021]
9346+ that referred to the definitions in [RFC2822]. IANA has updated the
9347+ Permanent Message Header Field Repository with the following header
9348+ fields, in accordance with the procedures set out in [RFC3864].
9349+
9350+ Header field name: Date
9351+ Applicable protocol: Mail
9352+ Status: standard
9353+ Author/Change controller: IETF
9354+ Specification document(s): This document (section 3.6.1)
9355+
9356+
9357+
9358+ Resnick Standards Track [Page 39]
9359+
9360+ RFC 5322 Internet Message Format October 2008
9361+
9362+
9363+ Header field name: From
9364+ Applicable protocol: Mail
9365+ Status: standard
9366+ Author/Change controller: IETF
9367+ Specification document(s): This document (section 3.6.2)
9368+
9369+ Header field name: Sender
9370+ Applicable protocol: Mail
9371+ Status: standard
9372+ Author/Change controller: IETF
9373+ Specification document(s): This document (section 3.6.2)
9374+
9375+ Header field name: Reply-To
9376+ Applicable protocol: Mail
9377+ Status: standard
9378+ Author/Change controller: IETF
9379+ Specification document(s): This document (section 3.6.2)
9380+
9381+ Header field name: To
9382+ Applicable protocol: Mail
9383+ Status: standard
9384+ Author/Change controller: IETF
9385+ Specification document(s): This document (section 3.6.3)
9386+
9387+ Header field name: Cc
9388+ Applicable protocol: Mail
9389+ Status: standard
9390+ Author/Change controller: IETF
9391+ Specification document(s): This document (section 3.6.3)
9392+
9393+ Header field name: Bcc
9394+ Applicable protocol: Mail
9395+ Status: standard
9396+ Author/Change controller: IETF
9397+ Specification document(s): This document (section 3.6.3)
9398+
9399+ Header field name: Message-ID
9400+ Applicable protocol: Mail
9401+ Status: standard
9402+ Author/Change controller: IETF
9403+ Specification document(s): This document (section 3.6.4)
9404+
9405+ Header field name: In-Reply-To
9406+ Applicable protocol: Mail
9407+ Status: standard
9408+ Author/Change controller: IETF
9409+ Specification document(s): This document (section 3.6.4)
9410+
9411+
9412+
9413+
9414+ Resnick Standards Track [Page 40]
9415+
9416+ RFC 5322 Internet Message Format October 2008
9417+
9418+
9419+ Header field name: References
9420+ Applicable protocol: Mail
9421+ Status: standard
9422+ Author/Change controller: IETF
9423+ Specification document(s): This document (section 3.6.4)
9424+
9425+ Header field name: Subject
9426+ Applicable protocol: Mail
9427+ Status: standard
9428+ Author/Change controller: IETF
9429+ Specification document(s): This document (section 3.6.5)
9430+
9431+ Header field name: Comments
9432+ Applicable protocol: Mail
9433+ Status: standard
9434+ Author/Change controller: IETF
9435+ Specification document(s): This document (section 3.6.5)
9436+
9437+ Header field name: Keywords
9438+ Applicable protocol: Mail
9439+ Status: standard
9440+ Author/Change controller: IETF
9441+ Specification document(s): This document (section 3.6.5)
9442+
9443+ Header field name: Resent-Date
9444+ Applicable protocol: Mail
9445+ Status: standard
9446+ Author/Change controller: IETF
9447+ Specification document(s): This document (section 3.6.6)
9448+
9449+ Header field name: Resent-From
9450+ Applicable protocol: Mail
9451+ Status: standard
9452+ Author/Change controller: IETF
9453+ Specification document(s): This document (section 3.6.6)
9454+
9455+ Header field name: Resent-Sender
9456+ Applicable protocol: Mail
9457+ Status: standard
9458+ Author/Change controller: IETF
9459+ Specification document(s): This document (section 3.6.6)
9460+
9461+ Header field name: Resent-To
9462+ Applicable protocol: Mail
9463+ Status: standard
9464+ Author/Change controller: IETF
9465+ Specification document(s): This document (section 3.6.6)
9466+
9467+
9468+
9469+
9470+ Resnick Standards Track [Page 41]
9471+
9472+ RFC 5322 Internet Message Format October 2008
9473+
9474+
9475+ Header field name: Resent-Cc
9476+ Applicable protocol: Mail
9477+ Status: standard
9478+ Author/Change controller: IETF
9479+ Specification document(s): This document (section 3.6.6)
9480+
9481+ Header field name: Resent-Bcc
9482+ Applicable protocol: Mail
9483+ Status: standard
9484+ Author/Change controller: IETF
9485+ Specification document(s): This document (section 3.6.6)
9486+
9487+ Header field name: Resent-Reply-To
9488+ Applicable protocol: Mail
9489+ Status: obsolete
9490+ Author/Change controller: IETF
9491+ Specification document(s): This document (section 4.5.6)
9492+
9493+ Header field name: Resent-Message-ID
9494+ Applicable protocol: Mail
9495+ Status: standard
9496+ Author/Change controller: IETF
9497+ Specification document(s): This document (section 3.6.6)
9498+
9499+ Header field name: Return-Path
9500+ Applicable protocol: Mail
9501+ Status: standard
9502+ Author/Change controller: IETF
9503+ Specification document(s): This document (section 3.6.7)
9504+
9505+ Header field name: Received
9506+ Applicable protocol: Mail
9507+ Status: standard
9508+ Author/Change controller: IETF
9509+ Specification document(s): This document (section 3.6.7)
9510+ Related information: [RFC5321]
9511+
9512+
9513+
9514+
9515+
9516+
9517+
9518+
9519+
9520+
9521+
9522+
9523+
9524+
9525+
9526+ Resnick Standards Track [Page 42]
9527+
9528+ RFC 5322 Internet Message Format October 2008
9529+
9530+
9531+ Appendix A. Example Messages
9532+
9533+ This section presents a selection of messages. These are intended to
9534+ assist in the implementation of this specification, but should not be
9535+ taken as normative; that is to say, although the examples in this
9536+ section were carefully reviewed, if there happens to be a conflict
9537+ between these examples and the syntax described in sections 3 and 4
9538+ of this document, the syntax in those sections is to be taken as
9539+ correct.
9540+
9541+ In the text version of this document, messages in this section are
9542+ delimited between lines of "----". The "----" lines are not part of
9543+ the message itself.
9544+
9545+
9546+
9547+
9548+
9549+
9550+
9551+
9552+
9553+
9554+
9555+
9556+
9557+
9558+
9559+
9560+
9561+
9562+
9563+
9564+
9565+
9566+
9567+
9568+
9569+
9570+
9571+
9572+
9573+
9574+
9575+
9576+
9577+
9578+
9579+
9580+
9581+
9582+ Resnick Standards Track [Page 43]
9583+
9584+ RFC 5322 Internet Message Format October 2008
9585+
9586+
9587+ Appendix A.1. Addressing Examples
9588+
9589+ The following are examples of messages that might be sent between two
9590+ individuals.
9591+
9592+ Appendix A.1.1. A Message from One Person to Another with Simple
9593+ Addressing
9594+
9595+ This could be called a canonical message. It has a single author,
9596+ John Doe, a single recipient, Mary Smith, a subject, the date, a
9597+ message identifier, and a textual message in the body.
9598+
9599+ ----
9600+ From: John Doe <jdoe@machine.example>
9601+ To: Mary Smith <mary@example.net>
9602+ Subject: Saying Hello
9603+ Date: Fri, 21 Nov 1997 09:55:06 -0600
9604+ Message-ID: <1234@local.machine.example>
9605+
9606+ This is a message just to say hello.
9607+ So, "Hello".
9608+ ----
9609+
9610+ If John's secretary Michael actually sent the message, even though
9611+ John was the author and replies to this message should go back to
9612+ him, the sender field would be used:
9613+
9614+ ----
9615+ From: John Doe <jdoe@machine.example>
9616+ Sender: Michael Jones <mjones@machine.example>
9617+ To: Mary Smith <mary@example.net>
9618+ Subject: Saying Hello
9619+ Date: Fri, 21 Nov 1997 09:55:06 -0600
9620+ Message-ID: <1234@local.machine.example>
9621+
9622+ This is a message just to say hello.
9623+ So, "Hello".
9624+ ----
9625+
9626+
9627+
9628+
9629+
9630+
9631+
9632+
9633+
9634+
9635+
9636+
9637+
9638+ Resnick Standards Track [Page 44]
9639+
9640+ RFC 5322 Internet Message Format October 2008
9641+
9642+
9643+ Appendix A.1.2. Different Types of Mailboxes
9644+
9645+ This message includes multiple addresses in the destination fields
9646+ and also uses several different forms of addresses.
9647+
9648+ ----
9649+ From: "Joe Q. Public" <john.q.public@example.com>
9650+ To: Mary Smith <mary@x.test>, jdoe@example.org, Who? <one@y.test>
9651+ Cc: <boss@nil.test>, "Giant; \"Big\" Box" <sysservices@example.net>
9652+ Date: Tue, 1 Jul 2003 10:52:37 +0200
9653+ Message-ID: <5678.21-Nov-1997@example.com>
9654+
9655+ Hi everyone.
9656+ ----
9657+
9658+ Note that the display names for Joe Q. Public and Giant; "Big" Box
9659+ needed to be enclosed in double-quotes because the former contains
9660+ the period and the latter contains both semicolon and double-quote
9661+ characters (the double-quote characters appearing as quoted-pair
9662+ constructs). Conversely, the display name for Who? could appear
9663+ without them because the question mark is legal in an atom. Notice
9664+ also that jdoe@example.org and boss@nil.test have no display names
9665+ associated with them at all, and jdoe@example.org uses the simpler
9666+ address form without the angle brackets.
9667+
9668+ Appendix A.1.3. Group Addresses
9669+
9670+ ----
9671+ From: Pete <pete@silly.example>
9672+ To: A Group:Ed Jones <c@a.test>,joe@where.test,John <jdoe@one.test>;
9673+ Cc: Undisclosed recipients:;
9674+ Date: Thu, 13 Feb 1969 23:32:54 -0330
9675+ Message-ID: <testabcd.1234@silly.example>
9676+
9677+ Testing.
9678+ ----
9679+
9680+ In this message, the "To:" field has a single group recipient named
9681+ "A Group", which contains 3 addresses, and a "Cc:" field with an
9682+ empty group recipient named Undisclosed recipients.
9683+
9684+
9685+
9686+
9687+
9688+
9689+
9690+
9691+
9692+
9693+
9694+ Resnick Standards Track [Page 45]
9695+
9696+ RFC 5322 Internet Message Format October 2008
9697+
9698+
9699+ Appendix A.2. Reply Messages
9700+
9701+ The following is a series of three messages that make up a
9702+ conversation thread between John and Mary. John first sends a
9703+ message to Mary, Mary then replies to John's message, and then John
9704+ replies to Mary's reply message.
9705+
9706+ Note especially the "Message-ID:", "References:", and "In-Reply-To:"
9707+ fields in each message.
9708+
9709+ ----
9710+ From: John Doe <jdoe@machine.example>
9711+ To: Mary Smith <mary@example.net>
9712+ Subject: Saying Hello
9713+ Date: Fri, 21 Nov 1997 09:55:06 -0600
9714+ Message-ID: <1234@local.machine.example>
9715+
9716+ This is a message just to say hello.
9717+ So, "Hello".
9718+ ----
9719+
9720+ When sending replies, the Subject field is often retained, though
9721+ prepended with "Re: " as described in section 3.6.5.
9722+
9723+ ----
9724+ From: Mary Smith <mary@example.net>
9725+ To: John Doe <jdoe@machine.example>
9726+ Reply-To: "Mary Smith: Personal Account" <smith@home.example>
9727+ Subject: Re: Saying Hello
9728+ Date: Fri, 21 Nov 1997 10:01:10 -0600
9729+ Message-ID: <3456@example.net>
9730+ In-Reply-To: <1234@local.machine.example>
9731+ References: <1234@local.machine.example>
9732+
9733+ This is a reply to your hello.
9734+ ----
9735+
9736+ Note the "Reply-To:" field in the above message. When John replies
9737+ to Mary's message above, the reply should go to the address in the
9738+ "Reply-To:" field instead of the address in the "From:" field.
9739+
9740+
9741+
9742+
9743+
9744+
9745+
9746+
9747+
9748+
9749+
9750+ Resnick Standards Track [Page 46]
9751+
9752+ RFC 5322 Internet Message Format October 2008
9753+
9754+
9755+ ----
9756+ To: "Mary Smith: Personal Account" <smith@home.example>
9757+ From: John Doe <jdoe@machine.example>
9758+ Subject: Re: Saying Hello
9759+ Date: Fri, 21 Nov 1997 11:00:00 -0600
9760+ Message-ID: <abcd.1234@local.machine.test>
9761+ In-Reply-To: <3456@example.net>
9762+ References: <1234@local.machine.example> <3456@example.net>
9763+
9764+ This is a reply to your reply.
9765+ ----
9766+
9767+ Appendix A.3. Resent Messages
9768+
9769+ Start with the message that has been used as an example several
9770+ times:
9771+
9772+ ----
9773+ From: John Doe <jdoe@machine.example>
9774+ To: Mary Smith <mary@example.net>
9775+ Subject: Saying Hello
9776+ Date: Fri, 21 Nov 1997 09:55:06 -0600
9777+ Message-ID: <1234@local.machine.example>
9778+
9779+ This is a message just to say hello.
9780+ So, "Hello".
9781+ ----
9782+
9783+ Say that Mary, upon receiving this message, wishes to send a copy of
9784+ the message to Jane such that (a) the message would appear to have
9785+ come straight from John; (b) if Jane replies to the message, the
9786+ reply should go back to John; and (c) all of the original
9787+ information, like the date the message was originally sent to Mary,
9788+ the message identifier, and the original addressee, is preserved. In
9789+ this case, resent fields are prepended to the message:
9790+
9791+
9792+
9793+
9794+
9795+
9796+
9797+
9798+
9799+
9800+
9801+
9802+
9803+
9804+
9805+
9806+ Resnick Standards Track [Page 47]
9807+
9808+ RFC 5322 Internet Message Format October 2008
9809+
9810+
9811+ ----
9812+ Resent-From: Mary Smith <mary@example.net>
9813+ Resent-To: Jane Brown <j-brown@other.example>
9814+ Resent-Date: Mon, 24 Nov 1997 14:22:01 -0800
9815+ Resent-Message-ID: <78910@example.net>
9816+ From: John Doe <jdoe@machine.example>
9817+ To: Mary Smith <mary@example.net>
9818+ Subject: Saying Hello
9819+ Date: Fri, 21 Nov 1997 09:55:06 -0600
9820+ Message-ID: <1234@local.machine.example>
9821+
9822+ This is a message just to say hello.
9823+ So, "Hello".
9824+ ----
9825+
9826+ If Jane, in turn, wished to resend this message to another person,
9827+ she would prepend her own set of resent header fields to the above
9828+ and send that. (Note that for brevity, trace fields are not shown.)
9829+
9830+ Appendix A.4. Messages with Trace Fields
9831+
9832+ As messages are sent through the transport system as described in
9833+ [RFC5321], trace fields are prepended to the message. The following
9834+ is an example of what those trace fields might look like. Note that
9835+ there is some folding white space in the first one since these lines
9836+ can be long.
9837+
9838+ ----
9839+ Received: from x.y.test
9840+ by example.net
9841+ via TCP
9842+ with ESMTP
9843+ id ABC12345
9844+ for <mary@example.net>; 21 Nov 1997 10:05:43 -0600
9845+ Received: from node.example by x.y.test; 21 Nov 1997 10:01:22 -0600
9846+ From: John Doe <jdoe@node.example>
9847+ To: Mary Smith <mary@example.net>
9848+ Subject: Saying Hello
9849+ Date: Fri, 21 Nov 1997 09:55:06 -0600
9850+ Message-ID: <1234@local.node.example>
9851+
9852+ This is a message just to say hello.
9853+ So, "Hello".
9854+ ----
9855+
9856+
9857+
9858+
9859+
9860+
9861+
9862+ Resnick Standards Track [Page 48]
9863+
9864+ RFC 5322 Internet Message Format October 2008
9865+
9866+
9867+ Appendix A.5. White Space, Comments, and Other Oddities
9868+
9869+ White space, including folding white space, and comments can be
9870+ inserted between many of the tokens of fields. Taking the example
9871+ from A.1.3, white space and comments can be inserted into all of the
9872+ fields.
9873+
9874+ ----
9875+ From: Pete(A nice \) chap) <pete(his account)@silly.test(his host)>
9876+ To:A Group(Some people)
9877+ :Chris Jones <c@(Chris's host.)public.example>,
9878+ joe@example.org,
9879+ John <jdoe@one.test> (my dear friend); (the end of the group)
9880+ Cc:(Empty list)(start)Hidden recipients :(nobody(that I know)) ;
9881+ Date: Thu,
9882+ 13
9883+ Feb
9884+ 1969
9885+ 23:32
9886+ -0330 (Newfoundland Time)
9887+ Message-ID: <testabcd.1234@silly.test>
9888+
9889+ Testing.
9890+ ----
9891+
9892+ The above example is aesthetically displeasing, but perfectly legal.
9893+ Note particularly (1) the comments in the "From:" field (including
9894+ one that has a ")" character appearing as part of a quoted-pair); (2)
9895+ the white space absent after the ":" in the "To:" field as well as
9896+ the comment and folding white space after the group name, the special
9897+ character (".") in the comment in Chris Jones's address, and the
9898+ folding white space before and after "joe@example.org,"; (3) the
9899+ multiple and nested comments in the "Cc:" field as well as the
9900+ comment immediately following the ":" after "Cc"; (4) the folding
9901+ white space (but no comments except at the end) and the missing
9902+ seconds in the time of the date field; and (5) the white space before
9903+ (but not within) the identifier in the "Message-ID:" field.
9904+
9905+
9906+
9907+
9908+
9909+
9910+
9911+
9912+
9913+
9914+
9915+
9916+
9917+
9918+ Resnick Standards Track [Page 49]
9919+
9920+ RFC 5322 Internet Message Format October 2008
9921+
9922+
9923+ Appendix A.6. Obsoleted Forms
9924+
9925+ The following are examples of obsolete (that is, the "MUST NOT
9926+ generate") syntactic elements described in section 4 of this
9927+ document.
9928+
9929+ Appendix A.6.1. Obsolete Addressing
9930+
9931+ Note in the example below the lack of quotes around Joe Q. Public,
9932+ the route that appears in the address for Mary Smith, the two commas
9933+ that appear in the "To:" field, and the spaces that appear around the
9934+ "." in the jdoe address.
9935+
9936+ ----
9937+ From: Joe Q. Public <john.q.public@example.com>
9938+ To: Mary Smith <@node.test:mary@example.net>, , jdoe@test . example
9939+ Date: Tue, 1 Jul 2003 10:52:37 +0200
9940+ Message-ID: <5678.21-Nov-1997@example.com>
9941+
9942+ Hi everyone.
9943+ ----
9944+
9945+ Appendix A.6.2. Obsolete Dates
9946+
9947+ The following message uses an obsolete date format, including a non-
9948+ numeric time zone and a two digit year. Note that although the day-
9949+ of-week is missing, that is not specific to the obsolete syntax; it
9950+ is optional in the current syntax as well.
9951+
9952+ ----
9953+ From: John Doe <jdoe@machine.example>
9954+ To: Mary Smith <mary@example.net>
9955+ Subject: Saying Hello
9956+ Date: 21 Nov 97 09:55:06 GMT
9957+ Message-ID: <1234@local.machine.example>
9958+
9959+ This is a message just to say hello.
9960+ So, "Hello".
9961+ ----
9962+
9963+
9964+
9965+
9966+
9967+
9968+
9969+
9970+
9971+
9972+
9973+
9974+ Resnick Standards Track [Page 50]
9975+
9976+ RFC 5322 Internet Message Format October 2008
9977+
9978+
9979+ Appendix A.6.3. Obsolete White Space and Comments
9980+
9981+ White space and comments can appear between many more elements than
9982+ in the current syntax. Also, folding lines that are made up entirely
9983+ of white space are legal.
9984+
9985+ ----
9986+ From : John Doe <jdoe@machine(comment). example>
9987+ To : Mary Smith
9988+ __
9989+ <mary@example.net>
9990+ Subject : Saying Hello
9991+ Date : Fri, 21 Nov 1997 09(comment): 55 : 06 -0600
9992+ Message-ID : <1234 @ local(blah) .machine .example>
9993+
9994+ This is a message just to say hello.
9995+ So, "Hello".
9996+ ----
9997+
9998+ Note especially the second line of the "To:" field. It starts with
9999+ two space characters. (Note that "__" represent blank spaces.)
10000+ Therefore, it is considered part of the folding, as described in
10001+ section 4.2. Also, the comments and white space throughout
10002+ addresses, dates, and message identifiers are all part of the
10003+ obsolete syntax.
10004+
10005+
10006+
10007+
10008+
10009+
10010+
10011+
10012+
10013+
10014+
10015+
10016+
10017+
10018+
10019+
10020+
10021+
10022+
10023+
10024+
10025+
10026+
10027+
10028+
10029+
10030+ Resnick Standards Track [Page 51]
10031+
10032+ RFC 5322 Internet Message Format October 2008
10033+
10034+
10035+ Appendix B. Differences from Earlier Specifications
10036+
10037+ This appendix contains a list of changes that have been made in the
10038+ Internet Message Format from earlier specifications, specifically
10039+ [RFC0822], [RFC1123], and [RFC2822]. Items marked with an asterisk
10040+ (*) below are items which appear in section 4 of this document and
10041+ therefore can no longer be generated.
10042+
10043+ The following are the changes made from [RFC0822] and [RFC1123] to
10044+ [RFC2822] that remain in this document:
10045+
10046+ 1. Period allowed in obsolete form of phrase.
10047+ 2. ABNF moved out of document, now in [RFC5234].
10048+ 3. Four or more digits allowed for year.
10049+ 4. Header field ordering (and lack thereof) made explicit.
10050+ 5. Encrypted header field removed.
10051+ 6. Specifically allow and give meaning to "-0000" time zone.
10052+ 7. Folding white space is not allowed between every token.
10053+ 8. Requirement for destinations removed.
10054+ 9. Forwarding and resending redefined.
10055+ 10. Extension header fields no longer specifically called out.
10056+ 11. ASCII 0 (null) removed.*
10057+ 12. Folding continuation lines cannot contain only white space.*
10058+ 13. Free insertion of comments not allowed in date.*
10059+ 14. Non-numeric time zones not allowed.*
10060+ 15. Two digit years not allowed.*
10061+ 16. Three digit years interpreted, but not allowed for generation.*
10062+ 17. Routes in addresses not allowed.*
10063+ 18. CFWS within local-parts and domains not allowed.*
10064+ 19. Empty members of address lists not allowed.*
10065+ 20. Folding white space between field name and colon not allowed.*
10066+ 21. Comments between field name and colon not allowed.
10067+ 22. Tightened syntax of in-reply-to and references.*
10068+ 23. CFWS within msg-id not allowed.*
10069+ 24. Tightened semantics of resent fields as informational only.
10070+ 25. Resent-Reply-To not allowed.*
10071+ 26. No multiple occurrences of fields (except resent and received).*
10072+ 27. Free CR and LF not allowed.*
10073+ 28. Line length limits specified.
10074+ 29. Bcc more clearly specified.
10075+
10076+
10077+
10078+
10079+
10080+
10081+
10082+
10083+
10084+
10085+
10086+ Resnick Standards Track [Page 52]
10087+
10088+ RFC 5322 Internet Message Format October 2008
10089+
10090+
10091+ The following are changes from [RFC2822].
10092+ 1. Assorted typographical/grammatical errors fixed and
10093+ clarifications made.
10094+ 2. Changed "standard" to "document" or "specification" throughout.
10095+ 3. Made distinction between "header field" and "header section".
10096+ 4. Removed NO-WS-CTL from ctext, qtext, dtext, and unstructured.*
10097+ 5. Moved discussion of specials to the "Atom" section. Moved text
10098+ to "Overall message syntax" section.
10099+ 6. Simplified CFWS syntax.
10100+ 7. Fixed unstructured syntax.
10101+ 8. Changed date and time syntax to deal with white space in
10102+ obsolete date syntax.
10103+ 9. Removed quoted-pair from domain literals and message
10104+ identifiers.*
10105+ 10. Clarified that other specifications limit domain syntax.
10106+ 11. Simplified "Bcc:" and "Resent-Bcc:" syntax.
10107+ 12. Allowed optional-field to appear within trace information.
10108+ 13. Removed no-fold-quote from msg-id. Clarified syntax
10109+ limitations.
10110+ 14. Generalized "Received:" syntax to fix bugs and move definition
10111+ out of this document.
10112+ 15. Simplified obs-qp. Fixed and simplified obs-utext (which now
10113+ only appears in the obsolete syntax). Removed obs-text and obs-
10114+ char, adding obs-body.
10115+ 16. Fixed obsolete date syntax to allow for more (or less) comments
10116+ and white space.
10117+ 17. Fixed all obsolete list syntax (obs-domain-list, obs-mbox-list,
10118+ obs-addr-list, obs-phrase-list, and the newly added obs-group-
10119+ list).
10120+ 18. Fixed obs-reply-to syntax.
10121+ 19. Fixed obs-bcc and obs-resent-bcc to allow empty lists.
10122+ 20. Removed obs-path.
10123+
10124+ Appendix C. Acknowledgements
10125+
10126+ Many people contributed to this document. They included folks who
10127+ participated in the Detailed Revision and Update of Messaging
10128+ Standards (DRUMS) Working Group of the Internet Engineering Task
10129+ Force (IETF), the chair of DRUMS, the Area Directors of the IETF, and
10130+ people who simply sent their comments in via email. The editor is
10131+ deeply indebted to them all and thanks them sincerely. The below
10132+ list includes everyone who sent email concerning both this document
10133+ and [RFC2822]. Hopefully, everyone who contributed is named here:
10134+
10135+ +--------------------+----------------------+---------------------+
10136+ | Matti Aarnio | Tanaka Akira | Russ Allbery |
10137+ | Eric Allman | Harald Alvestrand | Ran Atkinson |
10138+ | Jos Backus | Bruce Balden | Dave Barr |
10139+
10140+
10141+
10142+ Resnick Standards Track [Page 53]
10143+
10144+ RFC 5322 Internet Message Format October 2008
10145+
10146+
10147+ | Alan Barrett | John Beck | J Robert von Behren |
10148+ | Jos den Bekker | D J Bernstein | James Berriman |
10149+ | Oliver Block | Norbert Bollow | Raj Bose |
10150+ | Antony Bowesman | Scott Bradner | Randy Bush |
10151+ | Tom Byrer | Bruce Campbell | Larry Campbell |
10152+ | W J Carpenter | Michael Chapman | Richard Clayton |
10153+ | Maurizio Codogno | Jim Conklin | R Kelley Cook |
10154+ | Nathan Coulter | Steve Coya | Mark Crispin |
10155+ | Dave Crocker | Matt Curtin | Michael D'Errico |
10156+ | Cyrus Daboo | Michael D Dean | Jutta Degener |
10157+ | Mark Delany | Steve Dorner | Harold A Driscoll |
10158+ | Michael Elkins | Frank Ellerman | Robert Elz |
10159+ | Johnny Eriksson | Erik E Fair | Roger Fajman |
10160+ | Patrik Faltstrom | Claus Andre Faerber | Barry Finkel |
10161+ | Erik Forsberg | Chuck Foster | Paul Fox |
10162+ | Klaus M Frank | Ned Freed | Jochen Friedrich |
10163+ | Randall C Gellens | Sukvinder Singh Gill | Tim Goodwin |
10164+ | Philip Guenther | Arnt Gulbrandsen | Eric A Hall |
10165+ | Tony Hansen | John Hawkinson | Philip Hazel |
10166+ | Kai Henningsen | Robert Herriot | Paul Hethmon |
10167+ | Jim Hill | Alfred Hoenes | Paul E Hoffman |
10168+ | Steve Hole | Kari Hurtta | Marco S Hyman |
10169+ | Ofer Inbar | Olle Jarnefors | Kevin Johnson |
10170+ | Sudish Joseph | Maynard Kang | Prabhat Keni |
10171+ | John C Klensin | Graham Klyne | Brad Knowles |
10172+ | Shuhei Kobayashi | Peter Koch | Dan Kohn |
10173+ | Christian Kuhtz | Anand Kumria | Steen Larsen |
10174+ | Eliot Lear | Barry Leiba | Jay Levitt |
10175+ | Bruce Lilly | Lars-Johan Liman | Charles Lindsey |
10176+ | Pete Loshin | Simon Lyall | Bill Manning |
10177+ | John Martin | Mark Martinec | Larry Masinter |
10178+ | Denis McKeon | William P McQuillan | Alexey Melnikov |
10179+ | Perry E Metzger | Steven Miller | S Moonesamy |
10180+ | Keith Moore | John Gardiner Myers | Chris Newman |
10181+ | John W Noerenberg | Eric Norman | Mike O'Dell |
10182+ | Larry Osterman | Paul Overell | Jacob Palme |
10183+ | Michael A Patton | Uzi Paz | Michael A Quinlan |
10184+ | Robert Rapplean | Eric S Raymond | Sam Roberts |
10185+ | Hugh Sasse | Bart Schaefer | Tom Scola |
10186+ | Wolfgang Segmuller | Nick Shelness | John Stanley |
10187+ | Einar Stefferud | Jeff Stephenson | Bernard Stern |
10188+ | Peter Sylvester | Mark Symons | Eric Thomas |
10189+ | Lee Thompson | Karel De Vriendt | Matthew Wall |
10190+ | Rolf Weber | Brent B Welch | Dan Wing |
10191+ | Jack De Winter | Gregory J Woodhouse | Greg A Woods |
10192+ | Kazu Yamamoto | Alain Zahm | Jamie Zawinski |
10193+ | Timothy S Zurcher | | |
10194+ +--------------------+----------------------+---------------------+
10195+
10196+
10197+
10198+ Resnick Standards Track [Page 54]
10199+
10200+ RFC 5322 Internet Message Format October 2008
10201+
10202+
10203+ 7. References
10204+
10205+ 7.1. Normative References
10206+
10207+ [ANSI.X3-4.1986] American National Standards Institute, "Coded
10208+ Character Set - 7-bit American Standard Code for
10209+ Information Interchange", ANSI X3.4, 1986.
10210+
10211+ [RFC1034] Mockapetris, P., "Domain names - concepts and
10212+ facilities", STD 13, RFC 1034, November 1987.
10213+
10214+ [RFC1035] Mockapetris, P., "Domain names - implementation and
10215+ specification", STD 13, RFC 1035, November 1987.
10216+
10217+ [RFC1123] Braden, R., "Requirements for Internet Hosts -
10218+ Application and Support", STD 3, RFC 1123,
10219+ October 1989.
10220+
10221+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
10222+ Requirement Levels", BCP 14, RFC 2119, March 1997.
10223+
10224+ [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for
10225+ Syntax Specifications: ABNF", STD 68, RFC 5234,
10226+ January 2008.
10227+
10228+ 7.2. Informative References
10229+
10230+ [RFC0822] Crocker, D., "Standard for the format of ARPA
10231+ Internet text messages", STD 11, RFC 822,
10232+ August 1982.
10233+
10234+ [RFC1305] Mills, D., "Network Time Protocol (Version 3)
10235+ Specification, Implementation", RFC 1305,
10236+ March 1992.
10237+
10238+ [ISO.2022.1994] International Organization for Standardization,
10239+ "Information technology - Character code structure
10240+ and extension techniques", ISO Standard 2022, 1994.
10241+
10242+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet
10243+ Mail Extensions (MIME) Part One: Format of Internet
10244+ Message Bodies", RFC 2045, November 1996.
10245+
10246+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet
10247+ Mail Extensions (MIME) Part Two: Media Types",
10248+ RFC 2046, November 1996.
10249+
10250+
10251+
10252+
10253+
10254+ Resnick Standards Track [Page 55]
10255+
10256+ RFC 5322 Internet Message Format October 2008
10257+
10258+
10259+ [RFC2047] Moore, K., "MIME (Multipurpose Internet Mail
10260+ Extensions) Part Three: Message Header Extensions
10261+ for Non-ASCII Text", RFC 2047, November 1996.
10262+
10263+ [RFC2049] Freed, N. and N. Borenstein, "Multipurpose Internet
10264+ Mail Extensions (MIME) Part Five: Conformance
10265+ Criteria and Examples", RFC 2049, November 1996.
10266+
10267+ [RFC2822] Resnick, P., "Internet Message Format", RFC 2822,
10268+ April 2001.
10269+
10270+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul,
10271+ "Registration Procedures for Message Header
10272+ Fields", BCP 90, RFC 3864, September 2004.
10273+
10274+ [RFC4021] Klyne, G. and J. Palme, "Registration of Mail and
10275+ MIME Header Fields", RFC 4021, March 2005.
10276+
10277+ [RFC4288] Freed, N. and J. Klensin, "Media Type
10278+ Specifications and Registration Procedures",
10279+ BCP 13, RFC 4288, December 2005.
10280+
10281+ [RFC4289] Freed, N. and J. Klensin, "Multipurpose Internet
10282+ Mail Extensions (MIME) Part Four: Registration
10283+ Procedures", BCP 13, RFC 4289, December 2005.
10284+
10285+ [RFC5321] Klensin, J., "Simple Mail Transfer Protocol",
10286+ RFC 5321, October 2008.
10287+
10288+ Author's Address
10289+
10290+ Peter W. Resnick (editor)
10291+ Qualcomm Incorporated
10292+ 5775 Morehouse Drive
10293+ San Diego, CA 92121-1714
10294+ US
10295+
10296+ Phone: +1 858 651 4478
10297+ EMail: presnick@qualcomm.com
10298+ URI: http://www.qualcomm.com/~presnick/
10299+
10300+
10301+
10302+
10303+
10304+
10305+
10306+
10307+
10308+
10309+
10310+ Resnick Standards Track [Page 56]
10311+
10312+ RFC 5322 Internet Message Format October 2008
10313+
10314+
10315+ Full Copyright Statement
10316+
10317+ Copyright (C) The IETF Trust (2008).
10318+
10319+ This document is subject to the rights, licenses and restrictions
10320+ contained in BCP 78, and except as set forth therein, the authors
10321+ retain all their rights.
10322+
10323+ This document and the information contained herein are provided on an
10324+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
10325+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
10326+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
10327+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
10328+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
10329+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
10330+
10331+ Intellectual Property
10332+
10333+ The IETF takes no position regarding the validity or scope of any
10334+ Intellectual Property Rights or other rights that might be claimed to
10335+ pertain to the implementation or use of the technology described in
10336+ this document or the extent to which any license under such rights
10337+ might or might not be available; nor does it represent that it has
10338+ made any independent effort to identify any such rights. Information
10339+ on the procedures with respect to rights in RFC documents can be
10340+ found in BCP 78 and BCP 79.
10341+
10342+ Copies of IPR disclosures made to the IETF Secretariat and any
10343+ assurances of licenses to be made available, or the result of an
10344+ attempt made to obtain a general license or permission for the use of
10345+ such proprietary rights by implementers or users of this
10346+ specification can be obtained from the IETF on-line IPR repository at
10347+ http://www.ietf.org/ipr.
10348+
10349+ The IETF invites any interested party to bring to its attention any
10350+ copyrights, patents or patent applications, or other proprietary
10351+ rights that may cover technology that may be required to implement
10352+ this standard. Please address the information to the IETF at
10353+ ietf-ipr@ietf.org.
10354+
10355+
10356+
10357+
10358+
10359+
10360+
10361+
10362+
10363+
10364+
10365+
10366+ Resnick Standards Track [Page 57]
10367+