CRLF gratuito en Asunto: línea: ¿por qué está allí y es legal?

13

Me encuentro con un problema con un sistema NAGIOS que envía correos electrónicos a un servicio popular de correo electrónico a SMS. El servicio de correo electrónico a SMS toma correos electrónicos con texto en la Subject:línea y los envía al número móvil codificado en el To:campo. Hasta aquí todo bien. Lamentablemente, sendmail (y postfix antes) parecen estar insertando un CRLF gratuito en la línea (necesariamente larga) Subject:, y eso hace que mis mensajes SMS se trunqueen en el CRLF si y solo si la Subject:línea contiene uno o más dos puntos más allá del gratuito CRLF.

Estoy seguro de que los mensajes se están creando correctamente, pero solo para estar seguro, aquí estoy creando un mensaje de prueba completamente tonto para mí, con una larga Subject:línea:

echo "foo" | mail -s "1234567 101234567 201234567 301234567 401234567 501234567 601234567 701234567 801234567 90123456789" [email protected]

Tenga en cuenta que no hay dos puntos adicionales en esta Subject:línea; Todo lo que estoy haciendo aquí es mostrar que se inserta un CRLF adicional en el cable. Aquí está el resultado de 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    [email protected]..
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 mitad de camino hacia abajo (marcado en negrita + cursiva), entre el 501234567y el 601234567en el Subject:encabezado original , puede ver que se inserta un CRLF ( 0x0d 0x0a, en el volcado hexadecimal del lado izquierdo, ..en el texto plano del lado derecho).

El MTA receptor parece feliz de procesar esto, y cuando miro el correo almacenado en el disco en el extremo receptor, solo veo un LF (0x0a) en la línea Asunto: y la línea se analiza correctamente y en su totalidad por, por ejemplo, alpine. Sin embargo, el CRLF está allí en el cable, y entre mí y la (excelente) gente de soporte de correo electrónico a SMS, hemos establecido que estos son la causa del problema.

Entonces mi pregunta es: ¿ es legal que un MTA inserte un CRLF gratuito en el cable?

Si es así, y puedo probarlo, entonces es el problema de la casa de correo electrónico a SMS, porque son intolerantes. Si no lo es, o lo es, pero no puedo probarlo, entonces se convierte en mi problema, por lo que una respuesta con referencias sería muy útil.

Editar : ahora puedo aclarar que el servicio de correo electrónico a SMS en cuestión es kapow . Una vez que se les explicó este problema, lo entendieron, trabajaron conmigo para desarrollar y probar una solución, y han implementado la solución. Mis largas líneas de asunto con dos puntos ahora se transmiten correctamente a los SMS. Normalmente no hago alarde de las compañías individuales, especialmente no en SF, pero pensé que es digno de mención que kapow hizo lo correcto. (Descargo de responsabilidad: no tengo ninguna conexión con kapow, excepto como un cliente que paga y está contento con la forma en que trataron su problema).

MadHatter
fuente

Respuestas:

14

Bueno, si entiendo RFC 822, son legales en ciertos casos, creo que es un artefacto de los días de pantallas pequeñas con resoluciones 24x80.

Estas secciones parecen ser bastante claras. Los sujetos se pueden plegar, y el plegado es un carácter CRLF más LWSP (espacio en blanco lineal) ... es posible que hayan sido reemplazados, Wietse (en las listas de postfix) conoce sus RFC al revés si lo desea Una respuesta 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.

Edición del interrogador : espero que NickW me perdone por agregar una nota en el sentido de que RFC822 ha quedado obsoleto por RFC2822, pero el nuevo RFC dice casi lo mismo en su sección 2.2.3 , y confirma explícitamente que dicho plegado debería eliminarse antes de que se realice cualquier procesamiento adicional:

Cada campo de encabezado es lógicamente una sola línea de caracteres que comprende el nombre del campo, los dos puntos y el cuerpo del campo. Sin embargo, por conveniencia, y para lidiar con las limitaciones de caracteres 998/78 por línea, la parte del cuerpo del campo de un campo de encabezado se puede dividir en una representación de varias líneas; Esto se llama "plegado". La regla general es que siempre que este estándar permita plegar espacios en blanco (no simplemente caracteres WSP), se puede insertar un CRLF antes que cualquier WSP. Por ejemplo, el campo de encabezado:

       Subject: This is a test

se puede representar como:

       Subject: This
        is a test

Nota: Aunque los cuerpos de campo estructurados se definen de tal manera que el plegado puede tener lugar entre muchas de las fichas léxicas (e incluso dentro de algunas de las fichas léxicas), el plegado DEBE limitarse a
colocar el CRLF en roturas sintácticas de nivel superior. Por ejemplo, si un cuerpo de campo se define como valores separados por comas, se recomienda que el plegado se produzca después de que la coma separe los elementos estructurados con preferencia a otros lugares donde el campo podría plegarse, incluso si está permitido en otro lugar.

El proceso de pasar de esta representación plegada de varias líneas de un campo de encabezado a su representación de una sola línea se denomina "desplegar". El despliegue se logra simplemente eliminando cualquier CRLF seguido inmediatamente por WSP. Cada campo de encabezado debe tratarse en su forma desplegada para una evaluación sintáctica y semántica adicional.

Esto no es para restarle importancia al hecho de que NickW me señaló infaliblemente casi exactamente lo que necesitaba saber, solo para ayudar a que esta respuesta siga siendo relevante para cualquiera que pueda tropezar con ella en el futuro.

NickW
fuente
Ciertamente no estoy ofendido :)
NickW
1

El servidor Sendmail (SendMail) impone límites de longitud de línea, pero es mucho más alto (990 bytes o más para los servidores de correo smtp).

SendMail! = SendEmail

Según tengo entendido, Nagios usa por defecto el cliente SendEmail para enviar correos electrónicos. Parece que el cliente de correo electrónico que utiliza Nagios impone tales límites "duros" en la longitud del encabezado / línea de asunto del correo electrónico.

Verifique e informe al cliente de correo electrónico configurado en el commands.cfgarchivo de configuración.
( notify-host-by-emaily notify-service-by-emailconfiguraciones).

AnFi
fuente
Sé sobre el problema de la longitud de línea y los parámetros L=/ F=L, y estoy de acuerdo con usted en que este no es el problema. Mi NAGIOS está enviando simplemente usando echo "" | mail -s "$VARIABLE$ $ANOTHERVAR$"- pero en cualquier caso, el problema es más profundo que eso, por lo que he citado de la simple mailejemplo basado anterior - para tomar NAGIOS fuera de la imagen.
MadHatter