Passa al contenuto principale

4. Sintassi obsoleta

Le versioni precedenti di questa specifica consentivano una sintassi diversa (di solito più permissiva) rispetto a quella consentita in questa versione. Inoltre, vi sono elementi sintattici utilizzati nei messaggi su Internet le cui interpretazioni non sono mai state documentate. Sebbene queste forme sintattiche MUST NOT essere generate secondo la grammatica della sezione 3, esse MUST essere accettate e analizzate da un ricevente conforme. Questa sezione documenta molti di questi elementi sintattici. Prendendo la grammatica della sezione 3 e aggiungendo le definizioni presentate in questa sezione si ottiene la grammatica da utilizzare per l'interpretazione dei messaggi.

Nota: Questa sezione identifica forme sintattiche che qualsiasi implementazione SHOULD ragionevolmente interpretare. Tuttavia, esistono certamente messaggi Internet che non sono conformi nemmeno alla sintassi aggiuntiva data in questa sezione. Il fatto che una particolare forma non appaia in alcuna sezione di questo documento non è una giustificazione perché programmi informatici si blocchino o perché dati malformati vengano irrimediabilmente persi da qualsiasi implementazione. Spetta all'implementazione gestire i messaggi in modo robusto.

Una differenza importante tra la sintassi obsoleta (di interpretazione) e la sintassi attuale (di generazione) è che nei corpi dei campi di intestazione strutturati (cioè, tra i due punti e il CRLF di qualsiasi campo di intestazione strutturato), caratteri di spazio bianco, incluso lo spazio bianco di piegatura, e commenti potevano essere liberamente inseriti tra qualsiasi token sintattico. Ciò consentiva molte forme complesse che si sono rivelate difficili da analizzare per alcune implementazioni.

Un'altra differenza chiave tra la sintassi obsoleta e quella attuale è che la regola della sezione 3.2.2 riguardante le righe composte interamente da spazio bianco nei commenti e nello spazio bianco di piegatura non si applica. Vedere la discussione sullo spazio bianco di piegatura nella sezione 4.2 qui sotto.

Infine, in questa sezione compaiono alcuni caratteri che erano un tempo consentiti nei messaggi. Il carattere NUL (valore ASCII 0) era un tempo consentito, ma non lo è più per motivi di compatibilità. Allo stesso modo, i caratteri di controllo US-ASCII diversi da CR, LF, SP e HTAB (valori ASCII da 1 a 8, 11, 12, da 14 a 31 e 127) potevano apparire nei corpi dei campi di intestazione. CR e LF potevano apparire nei messaggi altrimenti che come CRLF; questo uso è mostrato anch'esso qui.

Altre differenze di sintassi e semantica sono indicate nelle sezioni seguenti.

4.1. Token obsoleti vari​

Questi elementi sintattici sono utilizzati altrove nella sintassi obsoleta o nella sintassi principale. CR isolato, LF isolato e NUL sono aggiunti a obs-qp, obs-body e obs-unstruct. I caratteri di controllo US-ASCII sono aggiunti a obs-qp, obs-unstruct, obs-ctext e obs-qtext. Il carattere punto è aggiunto a obs-phrase. obs-phrase-list prevede un elenco di frasi separate da virgole (potenzialmente vuoto) che può includere elementi "nulli". Cioè, in tale elenco potrebbero esserci due o più virgole senza nulla in mezzo, oppure virgole all'inizio o alla fine dell'elenco.

Nota: Il carattere "punto" (o "punto fermo") (".") in obs-phrase non è una forma consentita nelle versioni precedenti di questa o di qualsiasi altra specifica. Il punto (né alcun altro carattere di specials) non era consentito in phrase perché introduceva una difficoltà di analisi nel distinguere le frasi da parti di un addr-spec (vedere la sezione 4.4). Esso compare qui perché il carattere punto è attualmente utilizzato in molti messaggi nella parte display-name degli indirizzi, in particolare per le iniziali dei nomi, e deve quindi essere interpretato correttamente.

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 = *((*LF *CR *((%d0 / text) *LF *CR)) / CRLF)

obs-unstruct = *((*LF *CR *(obs-utext *LF *CR)) / FWS)

obs-phrase = word *(word / "." / CFWS)

obs-phrase-list = [phrase / CFWS] *("," [phrase / CFWS])

CR isolato e LF isolato compaiono nei messaggi con due significati diversi. In molti casi, CR isolato o LF isolato è usato impropriamente al posto di CRLF per indicare separatori di riga. In altri casi, CR isolato e LF isolato sono usati semplicemente come caratteri di controllo US-ASCII con i loro tradizionali significati ASCII.

4.2. Spazio bianco di piegatura obsoleto​

Nella sintassi obsoleta, una quantità qualsiasi di spazio bianco di piegatura MAY essere inserita dove la regola obs-FWS è consentita. Ciò crea la possibilità di avere due "pieghe" consecutive in una riga, e quindi la possibilità che una riga che compone un campo di intestazione piegato possa essere composta interamente da spazio bianco.

obs-FWS         =   1*WSP *(CRLF 1*WSP)

4.3. Data e ora obsolete​

La sintassi del formato di data obsoleto consente un anno a 2 cifre nel campo data e prevede un elenco di specificatori di fuso orario alfabetici utilizzati nelle versioni precedenti di questa specifica. Consente inoltre commenti e spazio bianco di piegatura tra molti dei token.

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 = "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

Quando in una data compare un anno a due o tre cifre, l'anno è da interpretare come segue: se si incontra un anno a due cifre il cui valore è compreso tra 00 e 49, l'anno è interpretato aggiungendo 2000, con un valore risultante compreso tra 2000 e 2049. Se si incontra un anno a due cifre con un valore compreso tra 50 e 99, o un anno qualsiasi a tre cifre, l'anno è interpretato aggiungendo 1900.

Nel fuso orario obsoleto, "UT" e "GMT" indicano rispettivamente "Universal Time" (tempo universale) e "Greenwich Mean Time" (ora media di Greenwich), ed entrambi sono semanticamente identici a "+0000".

I restanti fusi a tre caratteri sono i fusi orari degli Stati Uniti. La prima lettera, "E", "C", "M" o "P", sta per "Eastern", "Central", "Mountain" e "Pacific". La seconda lettera è "S" per l'ora "Standard" oppure "D" per l'ora "Daylight Savings" (o estiva). Le loro interpretazioni sono le seguenti:

EDT è semanticamente equivalente a -0400 EST è semanticamente equivalente a -0500 CDT è semanticamente equivalente a -0500 CST è semanticamente equivalente a -0600 MDT è semanticamente equivalente a -0600 MST è semanticamente equivalente a -0700 PDT è semanticamente equivalente a -0700 PST è semanticamente equivalente a -0800

I fusi orari militari a un carattere furono definiti in modo non standard in [RFC0822] e sono quindi imprevedibili nel loro significato. Le definizioni originali dei fusi militari da "A" a "I" sono rispettivamente equivalenti a "+0100" fino a "+0900"; "K", "L" e "M" sono rispettivamente equivalenti a "+1000", "+1100" e "+1200"; da "N" a "Y" sono rispettivamente equivalenti a "-0100" fino a "-1200"; e "Z" è equivalente a "+0000". Tuttavia, a causa dell'errore in [RFC0822], essi SHOULD tutti essere considerati equivalenti a "-0000" a meno che non vi sia un'informazione fuori banda che ne confermi il significato.

Sono stati utilizzati in messaggi Internet anche altri fusi orari alfabetici a più caratteri (di solito tra 3 e 5). Qualsiasi fuso orario il cui significato non è noto SHOULD essere considerato equivalente a "-0000" a meno che non vi sia un'informazione fuori banda che ne confermi il significato.

4.4. Indirizzamento obsoleto​

Vi sono quattro differenze principali nell'indirizzamento. In primo luogo, agli indirizzi di casella di posta era consentito avere una parte route prima dell'addr-spec quando racchiusi tra "<" e ">". La route è semplicemente un elenco di nomi di dominio separati da virgole, ciascuno preceduto da "@", e l'elenco è terminato da due punti. In secondo luogo, il CFWS era consentito tra gli elementi separati da punti del local-part e del dominio (cioè, dot-atom non era utilizzato). Inoltre, al local-part era consentito contenere un quoted-string oltre al semplice atom. In terzo luogo, mailbox-list e address-list potevano avere membri "nulli". Cioè, in tale elenco potevano esserci due o più virgole senza nulla in mezzo, oppure virgole all'inizio o alla fine dell'elenco. Infine, i caratteri di controllo US-ASCII e i quoted-pair erano consentiti nei domain literal e sono qui aggiunti.

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

Nell'interpretazione degli indirizzi, la parte route SHOULD essere ignorata.

4.5. Campi di intestazione obsoleti​

Sintatticamente, la differenza principale nella sintassi obsoleta dei campi è che essa consente occorrenze multiple di ciascun campo e che esse possono comparire in qualsiasi ordine. Inoltre, una quantità qualsiasi di spazio bianco è consentita prima dei ":" alla fine del nome del campo.

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)

Ad eccezione dei campi di indirizzo di destinazione (descritti nella sezione 4.5.3), l'interpretazione delle occorrenze multiple dei campi non è specificata. Inoltre, non è specificata nemmeno l'interpretazione dei campi di trace e dei campi resent che non compaiono in blocchi preposti al messaggio. Salvo diversa indicazione nelle sezioni seguenti, l'interpretazione degli altri campi è identica a quella delle loro controparti non obsolete nella sezione 3.

4.5.1. Campo di data di origine obsoleto​

obs-orig-date   =   "Date" *WSP ":" date-time CRLF

4.5.2. Campi di origine obsoleti​

obs-from        =   "From" *WSP ":" mailbox-list CRLF

obs-sender = "Sender" *WSP ":" mailbox CRLF

obs-reply-to = "Reply-To" *WSP ":" address-list CRLF

4.5.3. Campi di indirizzo di destinazione obsoleti​

obs-to          =   "To" *WSP ":" address-list CRLF

obs-cc = "Cc" *WSP ":" address-list CRLF

obs-bcc = "Bcc" *WSP ":"
(address-list / (*([CFWS] ",") [CFWS])) CRLF

Quando in un messaggio compaiono occorrenze multiple di campi di indirizzo di destinazione, esse SHOULD essere trattate come se l'elenco di indirizzi della prima occorrenza del campo fosse combinato con gli elenchi di indirizzi delle occorrenze successive aggiungendo una virgola e concatenando.

4.5.4. Campi di identificazione obsoleti​

I campi obsoleti "In-Reply-To:" e "References:" differiscono dalla sintassi attuale in quanto consentono la comparsa di phrase (parole o stringhe tra virgolette). Le forme obsolete delle parti sinistra e destra di msg-id consentono CFWS intercalati, rendendole sintatticamente identiche rispettivamente a local-part e dominio.

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

Ai fini dell'interpretazione, le frasi nei campi "In-Reply-To:" e "References:" sono ignorate.

Semanticamente, nessuno dei CFWS facoltativi nel local-part e nel dominio fa parte di obs-id-left e obs-id-right rispettivamente.

4.5.5. Campi informativi obsoleti​

obs-subject     =   "Subject" *WSP ":" unstructured CRLF

obs-comments = "Comments" *WSP ":" unstructured CRLF

obs-keywords = "Keywords" *WSP ":" obs-phrase-list CRLF

4.5.6. Campi resent obsoleti​

La sintassi obsoleta aggiunge un campo "Resent-Reply-To:", che consiste nel nome del campo, nei commenti facoltativi e nello spazio bianco di piegatura, nei due punti e in un elenco di indirizzi separati da virgole.

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

Come per gli altri campi resent, il campo "Resent-Reply-To:" deve essere trattato come semplice informazione di trace.

4.5.7. Campi di trace obsoleti​

obs-return e obs-received sono qui forniti di nuovo come definizioni modello, proprio come return e received nella sezione 3. La loro sintassi completa è data in [RFC5321].

obs-return      =   "Return-Path" *WSP ":" path CRLF

obs-received = "Received" *WSP ":" *received-token CRLF

4.5.8. Campi facoltativi obsoleti​

obs-optional    =   field-name *WSP ":" unstructured CRLF