Received: from localhost by CS.UTK.EDU with SMTP (cf v2.9s-UTK) id PAA10476; Wed, 6 Mar 1996 15:49:10 -0500 Received: by CS.UTK.EDU (bulk_mailer v1.4); Wed, 6 Mar 1996 15:48:39 -0500 Received: from cyrus.andrew.cmu.edu by CS.UTK.EDU with ESMTP (cf v2.9s-UTK) id PAA10403; Wed, 6 Mar 1996 15:48:36 -0500 Received: from laptop79.ietf.interop.net (laptop79.ietf.interop.net [130.128.2.79]) by cyrus.andrew.cmu.edu (8.7.3/8.7) with SMTP id PAA02909 for ; Wed, 6 Mar 1996 15:48:13 -0500 (EST) Date: Wed, 6 Mar 1996 15:47:54 -0500 (EST) From: John Gardiner Myers X-Sender: jgm@laptop79.ietf.interop.net To: drums@cs.utk.edu Subject: Message format document outline Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII The following is a working outline for the 822 update document. It is currently heavy on syntax and almost devoid of text. Right now, I'm looking for comments on the overall structure, ordering, and direction of the document, as well as the ABNF productions. INTRODUCTION Scope Communication Framework Canonical encoding model (822 3.4.10) unix-style is an encoding of message format where CRLF encoded as LF ABNF (may be moved to separate document) Remove sentence in 2.7 "Wherever this construct is used, null elements are allowed". Specify precedence of operators. Unary prefixes highest, concatination lower, alternatives lowest. Add new ABNF notation: a ::+ b a ::+ c a ::+ d is equivalent to: a ::= (b) / (c) / (d) MESSAGE SPECIFICATION Body message ::= *field [CRLF body] body ::= *OCTET ; absent MIME must be *(*998text CRLF) *998text ; and is us-ascii text ; XXX absent MIME, require trailing CRLF? Header fields field ::= field-name ":" [LWSP-char] [ field-body ] CRLF ; any single LWSP-char after ":" ; is not part of the field-body field-name ::= 1* field-body ::= field-body-contents [CRLF LWSP-char field-body] field-body-contents ::= ; XXX above definition needs to be fixed ; XXX prohibit NUL, CR, and LF Long header fields (822 3.1.1 & 3.4.8) New requirement: continuation line must contain non-whitespace character Unstructured field bodies Structured field bodies Free insertion of whitespace & comments (incl. 822 3.1.4 & 3.4.2) LWSP-char ::= SPACE / HTAB ; semantics = SPACE comment ::= "(" *(ctext / quoted-pair / comment) ")" ctext ::= may be folded ")", "\" & CR, & including linear-white-space> ;XXX fix this Quoting (incl. 822 3.4.1 and 3.4.4) Case Independence FIELD DEFINITIONS fields ::= [ trace ] ; net traversals orig-date ; Creation time, source ; author id required *destination ; *optional-field ; *resent ; ; XXX fix dangling nonterminal "optional-field" ; note relaxation of 1*destination requirement Date orig-date ::= "Date" ":" date-time ; Original Originator (Like term "author" better) source ::= originator ; original mail originator ::= authentic ; authenticated addr [ "Reply-To" ":" 1#address] ) authentic ::= "From" ":" mailbox ; Single author / ( "Sender" ":" mailbox ; Actual submittor "From" ":" 1#mailbox) ; Multiple authors ; or not sender Destination Fields destination ::= "To" ":" 1#address ; Primary / "cc" ":" 1#address ; Secondary / "bcc" ":" #address ; Blind carbon Reference Fields / "Message-ID" ":" msg-id / "In-Reply-To" ":" *(phrase / msg-id) / "References" ":" *(phrase / msg-id) ; MUST not generate phrase / "Keywords" ":" #phrase / "Subject" ":" *text / "Comments" ":" *text msg-id ::= "<" addr-spec ">" ; Unique message id ; XXX SHOULD NOT use quoted-string in the local-part ; (but some existing composers do) ; SHOULD NOT generate free insertion of whitespace Resending resent ::= resent-authentic / "Resent-Reply-To" ":" 1#address / "Resent-To" ":" 1#address / "Resent-cc" ":" 1#address / "Resent-bcc" ":" #address / "Resent-Message-ID" ":" msg-id ;; XXX fix this resent-date ::= "Resent-Date" ":" date-time resent-authentic ::= "Resent-From" ":" mailbox / ( "Resent-Sender" ":" mailbox "Resent-From" ":" 1#mailbox ) Trace trace ::= [ return ] ; path to sender 1*received ; receipt tags return ::= "Return-path" ":" ; return address (route-addr / "<>") ; XXX remove first bulleted item in 822 4.4.4 received ::= "Received" ":" ; one per relay ["from" domain] ; sending host ["by" domain] ; receiving host ["via" atom] ; physical path *("with" atom) ; link/mail protocol ["id" msg-id] ; receiver msg id ["for" addr-spec] ; initial form ";" date-time ; time received Other Fields (define registry) extension-field ::= user-defined-field ::= REST OF SYNTAX (need good name for this section) Date and Time Specification date-time ::= [ day "," ] date time day ::= "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun" date ::= 1*2DIGIT month year ; day month year ; e.g. 20 Jun 1982 year ::= 4DIGIT / obsolete-year ;; no free insertion of whitespace obsolete-year ::= 2DIGIT ; specifies 19XX, MUST not be generated ;; no free insertion of whitespace month ::= "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" time ::= hour zone hour ::= 2DIGIT ":" 2DIGIT [":" 2DIGIT] ; 00:00:00 - 23:59:59 ;; no free insertion of whitespace zone ::= obsolete-zone / ( ("+" / "-") 4DIGIT ) ; Local differential ; hours+min. (HHMM) ;; no free insertion of whitespace obsolete-zone ::= ; MUST not be generated "UT" / "GMT" ; Universal Time ; North American : UT / "EST" / "EDT" ; Eastern: - 5/ - 4 / "CST" / "CDT" ; Central: - 6/ - 5 / "MST" / "MDT" ; Mountain: - 7/ - 6 / "PST" / "PDT" ; Pacific: - 8/ - 7 / 1ALPHA ; Military: Z = UT; ; A:+1; (J not used) ; M:+12; N:-1; Y:-12 ; was backward in 822 Address specification address ::= mailbox ; one addressee / group ; named list group ::= phrase ":" [#mailbox] ";" mailbox ::= addr-spec ; simple address / [phrase] route-addr ; name & addr-spec route-addr ::= "<" [route] addr-spec ">" route ::= 1#("@" domain) ":" ; path-relative ; MAY be ignored ; SHOULD NOT be generated addr-spec ::= local-part "@" domain ; global address local-part ::= quoted-string / (atom *("." atom)) ; uninterpreted ; case-preserved domain ::= (atom 1*("." atom)) / domain-literal ; XXX 1* is a change ; Note no trailing dot. ;; no free insertion of whitespace domain-literal ::= "[" (atom 1*("." atom)) "]" ; XXX perhaps use "[" 1*DIGIT 3*("." 1*DIGIT) "]" ;; no free insertion of whitespace Domains Domains must be fully qualified Domain-literals Local-part Postmaster Group syntax Source routes Phrase Single space exists between contiguous words in phrase (3.4.4 prgh 2) phrase ::= word *( (SPACE / [ [SPACE] "." [SPACE] ]) word) ; Sequence of words ;; XXX Note relaxation to permit unquoted "." ;; Check for consensus Word word ::= atom / quoted-string Atom atom ::= 1* ;; no free insertion of whitespace specials ::= "(" / ")" / "<" / ">" / "@" ; Must be in quoted- / "," / ";" / ":" / "\" / <"> ; string, to use / "." / "[" / "]" ; within a word. Quoted-strings (822 3.4.5) quoted-string ::= <"> *(qtext/quoted-pair) <">; Regular qtext or ; quoted chars. ;; no free insertion of whitespace quoted-pair ::= "\" CHAR ; may quote any char ;; no free insertion of whitespace qtext ::= , ; => may be folded "\" & CR, and including linear-white-space> ;; XXX have to specify folding rules Text text = atoms, specials, and LF> ; comments and ; quoted-strings are ; NOT recognized. Primitive tokens ; ( Octal, Decimal.) CHAR = ; ( 0-177, 0.-127.) ;; XXX remove NUL from CHAR? ALPHA = ; (101-132, 65.- 90.) ; (141-172, 97.-122.) DIGIT = ; ( 60- 71, 48.- 57.) CTL = ; ( 177, 127.) CR = ; ( 15, 13.) LF = ; ( 12, 10.) SPACE = ; ( 40, 32.) HTAB = ; ( 11, 9.) <"> = ; ( 42, 34.) CRLF = CR LF APPENDIX: Implementation advice: when parsing, may want to use: local-part ::= phrase Removed from 822 Backspace characters (3.4.9) Encrypted: header