Безкоштовний CRLF у темі: рядок - чому він існує та чи законний?


13

У мене виникають проблеми із системою NAGIOS, що надсилає електронні листи популярній службі електронної пошти до SMS. Послуга електронної пошти до 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 є на місці, і між мною та (відмінними) людьми, які підтримують електронну пошту, ми встановили, що це є причиною проблеми.

Отже, моє запитання: чи законно МТА вставляти на провід безплатний CRLF?

Якщо це так, і я можу це довести, то це проблема будинку електронної пошти до SMS, оскільки вони нетерпимі. Якщо це не так, або є, але я не можу цього довести, то це стає моєю проблемою, тому відповідь із посиланнями була б найбільш корисною.

Редагувати : Тепер я можу зрозуміти, що розглядаються послуги електронної пошти на SMS - kapow . Після того, як ця проблема була їм роз'яснена, вони отримали її, працювали зі мною над розробкою та тестуванням виправлення, і розгорнули виправлення. Мої довгі сюжетні рядки з двокрапками зараз правильно передаються в SMS. Я, як правило, не трублю окремі компанії, особливо це стосується SF, але я вважав, що варто зазначити, що kapow зробив правильну річ. (Відмова: Я не маю жодного зв’язку з kapow, окрім як платного клієнта, який радий тому, як вони вирішили його проблему.)

Відповіді:


14

Ну, якщо я розумію RFC 822, вони легальні в певних випадках, я думаю, що це артефакт часів маленьких екранів з роздільною здатністю 24х80.

Ці розділи здаються досить чіткими. Суб'єкти можуть бути складені, а складання - це символ CRLF плюс LWSP (лінійний пробіл). остаточну відповідь.

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), перед будь-яким WSP може бути вставлений CRLF. Наприклад, поле заголовка:

       Subject: This is a test

може бути представлено у вигляді:

       Subject: This
        is a test

Примітка. Хоча структуровані польові тіла визначені таким чином, що складання може відбуватися між багатьма лексичними лексемами (і навіть у межах деяких лексичних лексем), складання ПОТРІБНО обмежується
розміщенням CRLF на синтаксичних перервах вищого рівня. Наприклад, якщо тіло поля визначене як розділені комами значення, рекомендується, щоб складання відбувалося після коми, що розділяє структуровані елементи на перевагу в інших місцях, де це поле можна скласти, навіть якщо це дозволено в іншому місці.

Процес переходу від цього складеного багаторядкового подання поля заголовка до його єдиного репрезентації називається "розгортанням". Розгортання здійснюється шляхом простого видалення будь-якого CRLF, за яким негайно слідує WSP. Кожне поле заголовка слід обробляти у розгорнутому вигляді для подальшої синтаксичної та семантичної оцінки.

Це не відволікає від того, що 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.