Kostenlose CRLF in Betreff: Zeile - warum ist es dort und ist es legal?

13

Ich habe ein Problem mit einem NAGIOS-System, das E-Mails an einen beliebten E-Mail-zu-SMS-Dienst sendet. Der E-Mail-zu-SMS-Dienst nimmt E-Mails mit Text in der Subject:Zeile entgegen und sendet sie an die im To:Feld verschlüsselte Mobiltelefonnummer . So weit, ist es gut. Leider scheint sendmail (und postfix davor) eine unbegründete CRLF in die (unbedingt lange) Subject:Zeile einzufügen , und dies führt dazu, dass meine SMS-Nachrichten genau dann an der CRLF abgeschnitten werden, wenn die Subject:Zeile einen oder mehrere Doppelpunkte nach der unbegründeten enthält CRLF.

Ich bin zuversichtlich, dass die Nachrichten korrekt erstellt werden, aber um sicherzugehen, erstelle ich hier eine völlig unklare Testnachricht für mich selbst mit einer langen Subject:Schlange:

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

Beachten Sie, dass diese Subject:Zeile keinen zusätzlichen Doppelpunkt enthält . Alles, was ich hier mache, ist zu zeigen, dass eine zusätzliche CRLF in den Draht eingefügt ist. Hier ist das Ergebnis von 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

Etwa auf halber Strecke (fett + kursiv markiert) zwischen dem 501234567und dem 601234567in der ursprünglichen Subject:Kopfzeile wird eine CRLF eingefügt ( 0x0d 0x0alinks im Hex-Dump ..rechts im Klartext).

Der empfangende MTA scheint dies gerne nachzubearbeiten, und wenn ich mir die auf dem Datenträger gespeicherte Mail am empfangenden Ende ansehe, sehe ich nur eine LF (0x0a) in der Betreffzeile, und die Zeile wird korrekt und in ihrer syntaktischen Form analysiert Vollständigkeit von zB alpine. Trotzdem ist die CRLF auf dem Draht und zwischen mir und den (ausgezeichneten) Mitarbeitern des E-Mail-zu-SMS-Supports haben wir festgestellt, dass dies die Ursache des Problems ist.

Meine Frage lautet also: Ist es zulässig, dass ein MTA eine kostenlose CRLF in die Leitung einfügt?

Wenn es so ist, und ich kann es beweisen, dann ist es das Problem des E-Mail-zu-SMS-Hauses, weil es intolerant ist. Wenn dies nicht der Fall ist oder ich es nicht beweisen kann, wird es zu meinem Problem. Daher wäre eine Antwort mit Referenzen am nützlichsten.

Edit : Ich kann jetzt sauber kommen, dass der fragliche Email-to-SMS-Dienst kapow ist . Nachdem ihnen dieses Problem erklärt worden war, bekamen sie es, arbeiteten mit mir zusammen, um ein Update zu entwickeln und zu testen, und stellten das Update bereit. Meine langen Betreffzeilen mit Doppelpunkten werden jetzt korrekt in SMS weitergeleitet. Normalerweise trompete ich keine einzelnen Unternehmen, besonders nicht bei SF, aber ich fand es bemerkenswert, dass kapow das Richtige tat. (Haftungsausschluss: Ich habe keine Verbindung zu kapow, außer als zahlender Kunde, der sich über die Art und Weise freut, wie er mit seinem Problem umgegangen ist.)

MadHatter
quelle

Antworten:

14

Nun, wenn ich RFC 822 verstehe, sind sie in bestimmten Fällen legal. Ich denke, es ist ein Artefakt aus der Zeit der kleinen Bildschirme mit einer Auflösung von 24x80.

Diese Abschnitte scheinen ziemlich klar zu sein. Themen können gefaltet werden, und das Falten ist ein CRLF plus LWSP-Zeichen (lineares Leerzeichen). Es ist möglich, dass sie ersetzt wurden. Wietse (auf den Postfix-Listen) kennt seine RFCs in- und auswendig, wenn Sie möchten eine endgültige Antwort.

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.

Bearbeiten durch den Fragesteller : Ich hoffe, NickW wird mir verzeihen, dass ich einen Hinweis hinzugefügt habe, dass RFC822 durch RFC2822 überholt wurde, aber der neue RFC sagt in seinem Abschnitt 2.2.3 ziemlich genau dasselbe und bestätigt ausdrücklich, dass ein solches Falten erfolgen sollte entfernt werden, bevor eine weitere Verarbeitung durchgeführt wird:

Jedes Header-Feld besteht logischerweise aus einer einzelnen Zeichenzeile, die den Feldnamen, den Doppelpunkt und den Feldkörper enthält. Der Einfachheit halber und um die Zeichenbeschränkungen von 998/78 pro Zeile zu bewältigen, kann der Feldhauptteil eines Header-Feldes in eine mehrzeilige Darstellung aufgeteilt werden. Dies nennt man "Falten". Die allgemeine Regel lautet, dass überall dort, wo dieser Standard das Falten von Leerzeichen (nicht einfach von WSP-Zeichen) zulässt, eine CRLF vor einem WSP eingefügt werden kann. Zum Beispiel das Header-Feld:

       Subject: This is a test

kann dargestellt werden als:

       Subject: This
        is a test

Hinweis: Obwohl strukturierte Feldkörper so definiert sind, dass eine Faltung zwischen vielen der lexikalischen Token (und sogar innerhalb einiger der lexikalischen Token) stattfinden kann, MUSS die Faltung darauf beschränkt sein
, die CRLF bei syntaktischen Brüchen höherer Ebene zu platzieren. Wenn ein Feldkörper beispielsweise als durch Kommas getrennte Werte definiert ist, wird empfohlen, dass die Faltung nach dem Komma erfolgt, das die strukturierten Elemente vor anderen Stellen trennt, an denen das Feld gefaltet werden könnte, auch wenn es an anderer Stelle zulässig ist.

Der Vorgang des Überganges von dieser gefalteten mehrzeiligen Darstellung eines Kopffeldes zu seiner einzeiligen Darstellung wird als "Entfalten" bezeichnet. Das Entfalten erfolgt durch einfaches Entfernen aller CRLFs, auf die WSP unmittelbar folgt. Jedes Header-Feld sollte in seiner entfalteten Form zur weiteren syntaktischen und semantischen Auswertung behandelt werden.

Dies soll nicht von der Tatsache ablenken, dass NickW mich zielsicher auf genau das zeigte, was ich wissen musste, nur um dieser Antwort zu helfen, für jeden relevant zu bleiben, der in Zukunft darüber stolpern könnte.

NickW
quelle
Ich bin sicherlich nicht beleidigt :)
NickW
1

Der Sendmail- Server (SendMail) unterwirft Zeilenlängenbeschränkungen, die jedoch viel höher sind (990 Byte oder mehr für SMTP-Mailer).

SendMail! = SendEmail

Soweit ich weiß, verwendet Nagios standardmäßig den SendEmail- Client , um E-Mails zu senden. Es scheint, dass der von Nagios verwendete E-Mail-Client der Länge des E-Mail-Headers / der Betreffzeile so "harte" Grenzen setzt.

Überprüfen und melden Sie den in der commands.cfgKonfigurationsdatei konfigurierten E-Mail-Client .
( notify-host-by-emailund notify-service-by-emailEinstellungen).

AnFi
quelle
Ich kenne das Problem mit der Zeilenlänge und den L=/ F=L-Parametern und stimme Ihnen zu, dass dies nicht das Problem ist. Mein NAGIOS sendet nur mit echo "" | mail -s "$VARIABLE$ $ANOTHERVAR$"- aber in jedem Fall ist das Problem tiefer, weshalb ich oben das einfache mailBeispiel zitiert habe -, um NAGIOS aus dem Bild zu nehmen.
MadHatter