; pull in rules from 5234 VCHAR = %x21-7E WSP = SP / HTAB ALPHA = %x41-5A / %x61-7A ; A-Z / a-z DIGIT = %x30-39 CR = %x0D LF = %x0A CRLF = CR LF DQUOTE = %x22 HTAB = %x09 SP = %x20 ; from draft-ietf-emailcore-rfc5322bis-12 quoted-pair = ("\" (VCHAR / WSP)) / obs-qp FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space ctext = %d33-39 / ; VCHAR characters not including %d42-91 / ; "(", ")", or "\" %d93-126 / obs-ctext ccontent = ctext / quoted-pair / comment comment = "(" *([FWS] ccontent) [FWS] ")" CFWS = (1*([FWS] comment) [FWS]) / FWS atext = ALPHA / DIGIT / ; VCHAR characters not including "!" / "#" / ; specials. Used for atoms. "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~" atom = [CFWS] 1*atext [CFWS] dot-atom-text = 1*atext *("." 1*atext) dot-atom = [CFWS] dot-atom-text [CFWS] specials = "(" / ")" / ; Special characters that do "<" / ">" / ; not appear in atext "[" / "]" / ":" / ";" / "@" / "\" / "," / "." / DQUOTE qtext = %d33 / ; VCHAR characters not including %d35-91 / ; "\" or the quote character %d93-126 / obs-qtext qcontent = qtext / quoted-pair quoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS] word = atom / quoted-string phrase = 1*word / obs-phrase unstructured = (*([FWS] VCHAR) *WSP) / obs-unstruct date-time = [ day-of-week "," ] date time [CFWS] day-of-week = ([FWS] day-name) / obs-day-of-week day-name = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun" date = day month year day = ([FWS] 1*2DIGIT FWS) / obs-day month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" year = (FWS 4*DIGIT FWS) / obs-year time = time-of-day zone time-of-day = hour ":" minute [ ":" second ] hour = 2DIGIT / obs-hour minute = 2DIGIT / obs-minute second = 2DIGIT / obs-second zone = (FWS ( "+" / "-" ) 4DIGIT) / obs-zone address = mailbox / group mailbox = name-addr / addr-spec name-addr = [display-name] angle-addr angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr group = display-name ":" [group-list] ";" [CFWS] display-name = phrase mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list address-list = (address *("," address)) / obs-addr-list group-list = mailbox-list / CFWS / obs-group-list addr-spec = local-part "@" domain local-part = dot-atom / quoted-string / obs-local-part domain = dot-atom / domain-literal / obs-domain domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] dtext = %d33-90 / ; VCHAR characters not including %d94-126 / ; "[", "]", or "\" obs-dtext message = (fields / obs-fields) [CRLF body] body = (*(*998text CRLF) *998text) / obs-body text = %d1-9 / ; Characters excluding CR %d11 / ; and LF %d12 / %d14-127 fields = *(trace *(resent-date / resent-from / resent-sender / resent-to / resent-cc / resent-bcc / resent-msg-id)) *(orig-date / from / sender / reply-to / to / cc / bcc / message-id / in-reply-to / references / subject / comments / keywords / optional-field) orig-date = "Date:" date-time CRLF from = "From:" mailbox-list CRLF sender = "Sender:" mailbox CRLF reply-to = "Reply-To:" address-list CRLF to = "To:" address-list CRLF cc = "Cc:" address-list CRLF bcc = "Bcc:" [address-list / CFWS] CRLF message-id = "Message-ID:" msg-id CRLF in-reply-to = "In-Reply-To:" 1*msg-id CRLF references = "References:" 1*msg-id CRLF msg-id = [CFWS] "<" msg-id-internal ">" [CFWS] msg-id-internal = id-left "@" id-right id-left = dot-atom-text / obs-id-left id-right = dot-atom-text / no-fold-literal / obs-id-right no-fold-literal = "[" *dtext "]" subject = "Subject:" unstructured CRLF comments = "Comments:" unstructured CRLF keywords = "Keywords:" phrase *("," phrase) CRLF resent-date = "Resent-Date:" date-time CRLF resent-from = "Resent-From:" mailbox-list CRLF resent-sender = "Resent-Sender:" mailbox CRLF resent-to = "Resent-To:" address-list CRLF resent-cc = "Resent-Cc:" address-list CRLF resent-bcc = "Resent-Bcc:" [address-list / CFWS] CRLF resent-msg-id = "Resent-Message-ID:" msg-id CRLF trace = [return] *(received / trace-optional) return = "Return-Path:" path CRLF path = angle-addr / ([CFWS] "<" [CFWS] ">" [CFWS]) received = "Received:" [1*received-token / CFWS] ";" date-time CRLF received-token = word / angle-addr / addr-spec / domain trace-optional = optional-field optional-field = field-name ":" unstructured CRLF field-name = 1*ftext ; Limit to 77 characters to ; stay within 78 char-per- ; line recommendation ftext = %d33-57 / ; VCHAR characters not including %d59-126 ; ":". obs-NO-WS-CTL = %d1-8 / ; US-ASCII control %d11 / ; characters that do not %d12 / ; include the carriage %d14-31 / ; return, line feed, and %d127 ; white space characters obs-ctext = obs-NO-WS-CTL obs-qtext = obs-NO-WS-CTL obs-utext = %d0 / obs-NO-WS-CTL / VCHAR obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR) obs-body = *(%d0 / LF / CR / text) obs-unstruct = *((*CR 1*(obs-utext / FWS)) / 1*LF) *CR obs-phrase = word *(word / "." / CFWS) obs-phrase-list = [phrase / CFWS] *("," [phrase / CFWS]) obs-FWS = 1*([CRLF] WSP) obs-day-of-week = [CFWS] day-name [CFWS] obs-day = [CFWS] 1*2DIGIT [CFWS] obs-year = [CFWS] 2*DIGIT [CFWS] obs-hour = [CFWS] 2DIGIT [CFWS] obs-minute = [CFWS] 2DIGIT [CFWS] obs-second = [CFWS] 2DIGIT [CFWS] obs-zone = [CFWS] ( "UT" / "GMT" / ; Universal Time ; North American UT ; offsets "EST" / "EDT" / ; Eastern: - 5/ - 4 "CST" / "CDT" / ; Central: - 6/ - 5 "MST" / "MDT" / ; Mountain: - 7/ - 6 "PST" / "PDT" / ; Pacific: - 8/ - 7 ; %d65-73 / ; Military zones - "A" %d75-90 / ; through "I" and "K" %d97-105 / ; through "Z", both %d107-122 ; upper and lower case ) [CFWS] obs-angle-addr = [CFWS] "<" obs-route addr-spec ">" [CFWS] obs-route = obs-domain-list ":" obs-domain-list = *(CFWS / ",") "@" domain *("," [CFWS] ["@" domain]) obs-mbox-list = *([CFWS] ",") mailbox *("," [mailbox / CFWS]) obs-addr-list = *([CFWS] ",") address *("," [address / CFWS]) obs-group-list = 1*([CFWS] ",") [CFWS] obs-local-part = word *("." word) obs-domain = atom *("." atom) obs-dtext = obs-NO-WS-CTL / quoted-pair obs-fields = *(obs-return / obs-received / obs-orig-date / obs-from / obs-sender / obs-reply-to / obs-to / obs-cc / obs-bcc / obs-message-id / obs-in-reply-to / obs-references / obs-subject / obs-comments / obs-keywords / obs-resent-date / obs-resent-from / obs-resent-send / obs-resent-rply / obs-resent-to / obs-resent-cc / obs-resent-bcc / obs-resent-mid / obs-optional) obs-orig-date = "Date" *WSP ":" date-time CRLF obs-from = "From" *WSP ":" mailbox-list CRLF obs-sender = "Sender" *WSP ":" mailbox CRLF obs-reply-to = "Reply-To" *WSP ":" address-list CRLF obs-to = "To" *WSP ":" address-list CRLF obs-cc = "Cc" *WSP ":" address-list CRLF obs-bcc = "Bcc" *WSP ":" (address-list / (*([CFWS] ",") [CFWS])) CRLF obs-message-id = "Message-ID" *WSP ":" msg-id CRLF obs-in-reply-to = "In-Reply-To" *WSP ":" *(phrase / msg-id) CRLF obs-references = "References" *WSP ":" *(phrase / msg-id) CRLF obs-id-left = local-part obs-id-right = domain obs-subject = "Subject" *WSP ":" unstructured CRLF obs-comments = "Comments" *WSP ":" unstructured CRLF obs-keywords = "Keywords" *WSP ":" obs-phrase-list CRLF obs-resent-from = "Resent-From" *WSP ":" mailbox-list CRLF obs-resent-send = "Resent-Sender" *WSP ":" mailbox CRLF obs-resent-date = "Resent-Date" *WSP ":" date-time CRLF obs-resent-to = "Resent-To" *WSP ":" address-list CRLF obs-resent-cc = "Resent-Cc" *WSP ":" address-list CRLF obs-resent-bcc = "Resent-Bcc" *WSP ":" (address-list / (*([CFWS] ",") [CFWS])) CRLF obs-resent-mid = "Resent-Message-ID" *WSP ":" msg-id CRLF obs-resent-rply = "Resent-Reply-To" *WSP ":" address-list CRLF obs-return = "Return-Path" *WSP ":" path CRLF obs-received = "Received" *WSP ":" [1*received-token / CFWS] [ ";" date-time ] CRLF obs-optional = field-name *WSP ":" unstructured CRLF