CRLF gratuito in Subject: line - perché è presente ed è legale?


13

Sto riscontrando un problema con un sistema NAGIOS che invia e-mail a un popolare servizio di posta elettronica a SMS. Il servizio email-to-SMS prende le e-mail con il testo nella Subject:riga e le invia al numero di cellulare codificato nel To:campo. Fin qui tutto bene. Purtroppo, sendmail (e postfix prima di esso) sembrano inserire un CRLF gratuito nella Subject:riga (necessariamente lunga) , e questo sta causando il troncamento dei miei messaggi SMS nel CRLF se e solo se la Subject:linea contiene uno o più due punti accanto al gratuito CRLF.

Sono fiducioso che i messaggi vengano creati correttamente, ma per essere sicuro, ecco io che sto creando un messaggio di prova completamente noddy con una lunga Subject:linea:

echo "foo" | mail -s "1234567 101234567 201234567 301234567 401234567 501234567 601234567 701234567 801234567 90123456789" reaper@teaparty.net

Nota che non ci sono due punti in più in questa Subject:linea; tutto quello che sto facendo qui è mostrare che un CRLF extra è inserito sul filo. Ecco il risultato di sudo ngrep -x port 25:


44 61 74 65 3a 20 46 72    69 2c 20 33 31 20 4d 61    Date: Fri, 31 Ma
79 20 32 30 31 33 20 31    30 3a 34 33 3a 35 35 20    y 2013 10:43:55
2b 30 31 30 30 0d 0a 54    6f 3a 20 72 65 61 70 65    +0100..To: reape
72 40 74 65 61 70 61 72    74 79 2e 6e 65 74 0d 0a    r@teaparty.net..
53 75 62 6a 65 63 74 3a    20 31 32 33 34 35 36 37    Subject: 1234567
20 31 30 31 32 33 34 35    36 37 20 32 30 31 32 33     101234567 20123
34 35 36 37 20 33 30 31    32 33 34 35 36 37 20 34    4567 301234567 4
30 31 32 33 34 35 36 37    20 35 30 31 32 33 34 35    01234567 5012345
36 37 0d 0a 20 36 30 31    32 33 34 35 36 37 20 37    67.. 601234567 7
30 31 32 33 34 35 36 37    20 38 30 31 32 33 34 35    01234567 8012345
36 37 20 39 30 31 32 33    34 35 36 37 38 39 0d 0a    67 90123456789..
55 73 65 72 2d 41 67 65    6e 74 3a 20 48 65 69 72    User-Agent: Heir
6c 6f 6f 6d 20 6d 61 69    6c 78 20 31 32 2e 34 20    loom mailx 12.4
37 2f 32 39 2f 30 38 0d    0a 4d 49 4d 45 2d 56 65    7/29/08..MIME-Ve
72 73 69 6f 6e 3a 20 31    2e 30 0d 0a 43 6f 6e 74    rsion: 1.0..Cont
65 6e 74 2d 54 79 70 65    3a 20 74 65 78 74 2f 70    ent-Type: text/p
6c 61 69 6e 3b 20 63 68    61 72 73 65 74 3d 75 73    lain; charset=us

A metà circa (contrassegnato in grassetto + corsivo), tra il 501234567e il 601234567nell'intestazione originale Subject:, è possibile vedere un CRLF inserito ( 0x0d 0x0a, sul dump esadecimale ..sul lato sinistro, sul testo normale sul lato destro).

L'MTA ricevente sembra felice di post-processarlo e quando guardo la posta memorizzata su disco alla fine della ricezione, vedo solo un LF (0x0a) nell'oggetto: riga e la riga viene analizzata correttamente e nella sua per intero, ad es alpine. Tuttavia, il CRLF è lì sul filo e tra me e le (eccellenti) persone di supporto da e-mail a SMS, abbiamo stabilito che queste sono le cause del problema.

Quindi la mia domanda è: è lecito per un MTA inserire un CRLF gratuito sul filo?

Se lo è, e posso provarlo, allora è il problema della casa da e-mail a SMS, perché sono intolleranti. Se non lo è, o lo è, ma non posso provarlo, allora diventa il mio problema, quindi una risposta con riferimenti sarebbe molto utile.

Modifica : ora posso chiarire che il servizio e-mail-SMS in questione è kapow . Una volta che questo problema è stato spiegato a loro, hanno capito, hanno lavorato con me per sviluppare e testare una correzione e hanno implementato la correzione. Le mie lunghe righe dell'oggetto con i due punti ora vengono trasmesse correttamente agli SMS. Normalmente non faccio trombe su singole compagnie, specialmente su SF, ma ho ritenuto degno di nota che Kapow ha fatto la cosa giusta. (Dichiarazione di non responsabilità: non ho alcun collegamento con kapow se non come cliente pagante che è felice del modo in cui ha affrontato il suo problema.)

Risposte:


14

Bene, se capisco RFC 822, sono legali in alcuni casi, penso che sia un artefatto dai tempi dei piccoli schermi con risoluzioni 24x80 ..

Queste sezioni sembrano essere abbastanza chiare I soggetti possono essere piegati, e la piegatura è un carattere CRLF più LWSP (spazio bianco lineare) .. è possibile che siano stati sostituiti, Wietse (negli elenchi postfix) conosce i suoi RFC dentro e fuori se vuoi una risposta definitiva.

3.1.1.  LONG HEADER FIELDS

    Each header field can be viewed as a single, logical  line  of
    ASCII  characters,  comprising  a field-name and a field-body.
    For convenience, the field-body  portion  of  this  conceptual
    entity  can be split into a multiple-line representation; this
    is called "folding".  The general rule is that wherever  there
    may  be  linear-white-space  (NOT  simply  LWSP-chars), a CRLF
    immediately followed by AT LEAST one LWSP-char may instead  be
    inserted.  Thus, the single line

        To:  "Joe & J. Harvey" <ddd @Org>, JJV @ BBN

    can be represented as:

        To:  "Joe & J. Harvey" <ddd @ Org>,
                JJV@BBN

    and

        To:  "Joe & J. Harvey"
                        <ddd@ Org>, JJV
         @BBN

    and

        To:  "Joe &
         J. Harvey" <ddd @ Org>, JJV @ BBN

         The process of moving  from  this  folded   multiple-line
    representation  of a header field to its single line represen-
    tation is called "unfolding".  Unfolding  is  accomplished  by
    regarding   CRLF   immediately  followed  by  a  LWSP-char  as
    equivalent to the LWSP-char.

    Note:  While the standard  permits  folding  wherever  linear-
           white-space is permitted, it is recommended that struc-
           tured fields, such as those containing addresses, limit
           folding  to higher-level syntactic breaks.  For address
           fields, it  is  recommended  that  such  folding  occur
           between addresses, after the separating comma.

3.1.2.  STRUCTURE OF HEADER FIELDS

    Once a field has been unfolded, it may be viewed as being com-
    posed of a field-name followed by a colon (":"), followed by a
    field-body, and  terminated  by  a  carriage-return/line-feed.
    The  field-name must be composed of printable ASCII characters
    (i.e., characters that  have  values  between  33.  and  126.,
    decimal, except colon).  The field-body may be composed of any
    ASCII characters, except CR or LF.  (While CR and/or LF may be
    present  in the actual text, they are removed by the action of
    unfolding the field.)

    Certain field-bodies of headers may be  interpreted  according
    to  an  internal  syntax  that some systems may wish to parse.
    These  fields  are  called  "structured   fields".    Examples
    include  fields containing dates and addresses.  Other fields,
    such as "Subject"  and  "Comments",  are  regarded  simply  as
    strings of text.

    Note:  Any field which has a field-body  that  is  defined  as
           other  than  simply <text> is to be treated as a struc-
           tured field.

           Field-names, unstructured field bodies  and  structured
           field bodies each are scanned by their own, independent
           "lexical" analyzers.

 3.1.3.  UNSTRUCTURED FIELD BODIES

    For some fields, such as "Subject" and "Comments",  no  struc-
    turing  is assumed, and they are treated simply as <text>s, as
    in the message body.  Rules of folding apply to these  fields,
    so  that  such  field  bodies  which occupy several lines must
    therefore have the second and successive lines indented by  at
    least one LWSP-char.

Modifica dell'interrogatore : spero che NickW mi perdonerà per aver aggiunto una nota sull'effetto che RFC822 è stato obsoleto da RFC2822, ma il nuovo RFC dice praticamente la stessa cosa nella sua sezione 2.2.3 e conferma esplicitamente che tale piegatura dovrebbe essere rimosso prima di ogni ulteriore elaborazione:

Ogni campo di intestazione è logicamente una singola riga di caratteri che comprende il nome del campo, i due punti e il corpo del campo. Per comodità, tuttavia, e per gestire i limiti di carattere 998/78 per riga, la parte del corpo di campo di un campo di intestazione può essere suddivisa in una rappresentazione a più righe; questo si chiama "pieghevole". La regola generale è che ovunque questo standard consenta di piegare lo spazio bianco (non semplicemente i caratteri WSP), un CRLF può essere inserito prima di qualsiasi WSP. Ad esempio, il campo dell'intestazione:

       Subject: This is a test

può essere rappresentato come:

       Subject: This
        is a test

Nota: sebbene i corpi di campo strutturati siano definiti in modo tale che la piegatura possa avvenire tra molti token lessicali (e persino all'interno di alcuni token lessicali), la piegatura DOVREBBE essere limitata al
posizionamento del CRLF a interruzioni sintattiche di livello superiore. Ad esempio, se un corpo di campo è definito come valori separati da virgola, si consiglia che la piegatura avvenga dopo la virgola che separa gli elementi strutturati preferibilmente ad altri luoghi in cui il campo potrebbe essere piegato, anche se consentito altrove.

Il processo di passaggio da questa rappresentazione a più righe piegata di un campo di intestazione alla sua rappresentazione a riga singola si chiama "spiegamento". Il dispiegamento si ottiene semplicemente rimuovendo qualsiasi CRLF immediatamente seguito da WSP. Ogni campo di intestazione deve essere trattato nella sua forma spiegata per ulteriori valutazioni sintattiche e semantiche.

Questo non toglie il fatto che NickW mi indicasse infallibilmente praticamente esattamente quello che dovevo sapere, solo per aiutare questa risposta a rimanere rilevante per chiunque potesse inciampare in futuro.


Non sono certo offeso :)
NickW,

1

Il server Sendmail (SendMail) impone limiti di lunghezza della linea ma è molto più alto (990 byte o più per i mailer smtp).

SendMail! = SendEmail

Come capisco Nagios utilizza per impostazione predefinita il client SendEmail per inviare e-mail. Sembra che il client di posta elettronica che usi Nagios imponga limiti "severi" sulla lunghezza dell'intestazione / oggetto dell'email.

Controlla e segnala il client di posta elettronica configurato nel commands.cfgfile di configurazione.
( notify-host-by-emaile notify-service-by-emailimpostazioni).


Conosco il problema della lunghezza della linea e i parametri L=/ F=Le sono d'accordo con te sul fatto che questo non è il problema. Il mio NAGIOS sta inviando semplicemente usando echo "" | mail -s "$VARIABLE$ $ANOTHERVAR$"- ma in ogni caso, il problema è più profondo di quello, motivo per cui ho citato l' mailesempio semplice basato sopra - per togliere NAGIOS dall'immagine.
MadHatter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.