Бесплатные CRLF в теме: строка - почему это там, и это законно?

13

У меня проблема с системой NAGIOS, которая отправляет электронные письма в популярный сервис электронной почты. Служба электронной почты в SMS принимает электронные письма с текстом в Subject:строке и отправляет их на номер мобильного телефона, указанный в To:поле. Все идет нормально. К сожалению, sendmail (и постфикс перед ним), кажется, вставляет бесполезный CRLF в (обязательно длинную) Subject:строку, и это приводит к тому, что мои SMS-сообщения усекаются в CRLF тогда и только тогда, когда Subject:строка содержит один или несколько двоеточий после безвозмездного CRLF.

Я уверен, что сообщения создаются правильно, но, чтобы быть уверенным, вот я и создаю для себя совершенно дурацкое тестовое сообщение с длинной Subject:строкой:

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

Обратите внимание, что в этой Subject:строке нет лишних двоеточий ; все, что я здесь делаю, показывает, что на провод вставлен дополнительный CRLF. Вот результат 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

Примерно на полпути вниз (выделено жирным шрифтом + курсивом), между 501234567и 601234567в исходном Subject:заголовке, вы можете видеть вставляемый CRLF ( 0x0d 0x0aв левом шестнадцатеричном дампе, ..в правом простом тексте).

Получающий MTA, кажется, рад пост-обработке этого, и когда я смотрю сохраненную на диске почту на принимающей стороне, я вижу только LF (0x0a) в строке Subject:, и строка анализируется правильно и в ее цельность, например, путем alpine. Тем не менее, CRLF находится на связи, и между мной и (превосходными) сотрудниками службы поддержки электронной почты и SMS мы установили, что это является причиной проблемы.

Итак, мой вопрос: законно ли для MTA вставлять в провод даровой CRLF?

Если это так, и я могу это доказать, то это проблема дома с электронной почтой, потому что они нетерпимы. Если это не так, или это так, но я не могу это доказать, тогда это становится моей проблемой, поэтому ответ со ссылками был бы наиболее полезным.

Изменить : теперь я могу прийти к выводу, что услуга электронной почты для SMS является Kapow . Как только им объяснили эту проблему, они получили ее, вместе со мной разработали и протестировали исправление и развернули исправление. Мои длинные сюжетные линии с двоеточиями теперь правильно передаются в СМС. Обычно я не рекламирую отдельные компании, особенно на SF, но я подумал, что стоит отметить, что kapow сделал правильную вещь. (Отказ от ответственности: я не имею никакого отношения к kapow, кроме как как платящий клиент, который доволен тем, как они справились с его проблемой.)

Безумный Шляпник
источник

Ответы:

14

Что ж, если я понимаю RFC 822, в некоторых случаях они законны, я думаю, что это артефакт времен маленьких экранов с разрешением 24x80 ...

Эти разделы кажутся достаточно ясными. Предметы можно свернуть, а сворачивание - это символ CRLF плюс LWSP (линейный пробел). Возможно, они были заменены, Wietse (в списках постфиксов) знает свои RFC наизнанку, если вы хотите окончательный ответ.

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.

Редактирование спрашивающим : Я надеюсь, что NickW простит меня за добавление примечания о том, что RFC822 устарел в RFC2822, но новый RFC говорит почти то же самое в своем разделе 2.2.3 и явно подтверждает, что такое сворачивание должно быть удаленным перед любой дальнейшей обработкой:

Каждое поле заголовка логически представляет собой одну строку символов, содержащую имя поля, двоеточие и тело поля. Для удобства, однако, и для того, чтобы справиться с ограничениями в 998/78 символов на строку, часть тела поля поля заголовка может быть разбита на многострочное представление; это называется «складывание». Общее правило заключается в том, что везде, где этот стандарт допускает складывание пробелов (а не просто символов WSP), CRLF может быть вставлен перед любым WSP. Например, поле заголовка:

       Subject: This is a test

может быть представлен как:

       Subject: This
        is a test

Примечание. Хотя структурированные тела полей определены таким образом, что сворачивание может происходить между многими лексическими токенами (и даже внутри некоторых из лексических токенов), складывание ДОЛЖНО быть ограничено
размещением CRLF на синтаксических разрывах более высокого уровня. Например, если тело поля определено как значения, разделенные запятыми, рекомендуется, чтобы сворачивание происходило после запятой, отделяющей структурированные элементы в предпочтение перед другими местами, где поле может быть сложено, даже если это разрешено в другом месте.

Процесс перехода от этого сложенного многострочного представления поля заголовка к его однострочному представлению называется «разворачиванием». Развертывание выполняется простым удалением любого CRLF, за которым сразу следует WSP. Каждое поле заголовка должно обрабатываться в развернутом виде для дальнейшей синтаксической и семантической оценки.

Это не умаляет того факта, что NickW безошибочно указывал мне на то, что мне нужно было знать, только чтобы помочь этому ответу остаться актуальным для любого, кто может наткнуться на него в будущем.

NickW
источник
Я конечно не обижаюсь :)
NickW
1

Сервер Sendmail (SendMail) накладывает ограничения на длину строки, но она намного выше (990 байт или более для почтовых программ smtp).

SendMail! = SendEmail

Как я понимаю, Nagios по умолчанию использует клиент SendEmail для отправки электронной почты. Кажется, что почтовый клиент, который вы используете Nagios, накладывает такие «жесткие» ограничения на длину заголовка письма / строки темы.

Проверьте и сообщите клиенту электронной почты, настроенному в commands.cfgфайле конфигурации.
( notify-host-by-emailи notify-service-by-emailнастройки).

Анфи
источник
Я знаю о проблеме длины строки и параметрах L=/ F=L, и я согласен с вами, что это не проблема. Мой NAGIOS отправляет только используя echo "" | mail -s "$VARIABLE$ $ANOTHERVAR$"- но в любом случае проблема более глубока, чем эта, вот почему я привел приведенный mailвыше простой пример - чтобы убрать NAGIOS из картинки.
MadHatter,