CRLF serampangan dalam Subjek: baris - mengapa ada di sana, dan apakah itu legal?

13

Saya mengalami masalah dengan sistem NAGIOS mengirim email ke layanan email-ke-SMS yang populer. Layanan email-ke-SMS mengambil email dengan teks di Subject:baris, dan mengirimkannya ke nomor ponsel yang disandikan di To:lapangan. Sejauh ini baik. Sayangnya, sendmail (dan postfix sebelum) tampaknya akan memasukkan CRLF serampangan ke dalam (tentu panjang) Subject:line, dan yang menyebabkan pesan SMS saya terpotong di CRLF yang jika dan hanya jika para Subject:baris berisi satu atau lebih titik dua masa lalu yang serampangan CRLF.

Saya yakin bahwa pesan tersebut dibuat dengan benar, tetapi untuk memastikan, inilah saya membuat pesan pengujian sepenuhnya mengangguk untuk diri saya sendiri, dengan Subject:garis panjang :

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

Perhatikan tidak ada titik dua tambahan di Subject:baris ini ; semua yang saya lakukan di sini menunjukkan bahwa CRLF tambahan dimasukkan pada kabel. Inilah hasil dari 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

Sekitar setengah jalan ke bawah (ditandai dengan huruf tebal + miring), antara 501234567dan 601234567di Subject:header asli , Anda dapat melihat CRLF sedang dimasukkan ( 0x0d 0x0a, di sisi kiri hex dump, ..di sisi kanan teks biasa).

MTA penerima tampaknya senang memprosesnya, dan ketika saya melihat mail yang tersimpan di disk di ujung penerima, saya hanya melihat LF (0x0a) di baris Subjek:, dan saluran diuraikan dengan benar dan di dalamnya keseluruhan oleh, misalnya alpine,. Namun demikian, CRLF ada di sana, dan antara saya dan orang-orang dukungan email-ke-SMS (luar biasa), kami telah menetapkan bahwa ini adalah penyebab masalah.

Jadi pertanyaan saya adalah: apakah sah bagi MTA untuk memasukkan CRLF gratis pada kabel?

Jika ya, dan saya bisa membuktikannya, maka itu masalah rumah email-ke-SMS, karena mereka tidak toleran. Jika tidak, atau itu tapi saya tidak bisa membuktikannya, maka itu menjadi masalah saya, jadi jawaban dengan referensi akan sangat berguna.

Sunting : Saya sekarang dapat mengetahui bahwa layanan email-ke-SMS yang dimaksud adalah kapow . Setelah masalah ini dijelaskan kepada mereka, mereka mendapatkannya, bekerja dengan saya untuk mengembangkan dan menguji perbaikan, dan telah menyebarkan perbaikan. Baris subjek panjang saya dengan titik dua sekarang bisa diteruskan dengan benar ke SMS. Saya biasanya tidak terompet perusahaan individu, terutama tidak pada SF, tetapi saya pikir patut dicatat bahwa kapow Melakukan Hal yang Benar. (Penafian: Saya tidak memiliki koneksi dengan kapow kecuali sebagai pelanggan yang membayar yang senang dengan cara mereka menangani masalahnya.)

MadHatter
sumber

Jawaban:

14

Nah, jika saya mengerti RFC 822, mereka legal dalam kasus-kasus tertentu, saya pikir itu adalah artefak dari zaman layar kecil dengan resolusi 24x80 ..

Bagian-bagian ini tampaknya cukup jelas. Subjek dapat dilipat, dan lipat adalah karakter CRLF plus LWSP (ruang putih linier). jawaban yang pasti.

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.

Sunting oleh si penanya : Saya harap NickW akan memaafkan saya karena menambahkan catatan bahwa RFC822 telah usang oleh RFC2822, tetapi RFC baru mengatakan hal yang hampir sama di bagian 2.2.3 , dan secara eksplisit mengkonfirmasi bahwa lipatan semacam itu seharusnya dihapus sebelum pemrosesan lebih lanjut dilakukan:

Setiap bidang tajuk secara logis adalah satu baris karakter yang terdiri dari nama bidang, titik dua, dan badan bidang. Namun untuk kenyamanan, dan untuk menangani batasan karakter 998/78 per baris, bagian tubuh bidang dari bidang tajuk dapat dibagi menjadi beberapa representasi garis; ini disebut "lipat". Aturan umum adalah bahwa di mana pun standar ini memungkinkan untuk melipat ruang putih (bukan hanya karakter WSP), CRLF dapat dimasukkan sebelum WSP. Misalnya, bidang tajuk:

       Subject: This is a test

dapat direpresentasikan sebagai:

       Subject: This
        is a test

Catatan: Meskipun badan bidang terstruktur didefinisikan sedemikian rupa sehingga pelipatan dapat terjadi di antara banyak token leksikal (dan bahkan dalam beberapa token leksikal), melipat HARUS dibatasi untuk
menempatkan CRLF pada jeda sintaksis tingkat tinggi. Misalnya, jika badan bidang didefinisikan sebagai nilai yang dipisah koma, direkomendasikan bahwa pelipatan terjadi setelah koma memisahkan item terstruktur dalam preferensi ke tempat-tempat lain di mana bidang bisa dilipat, bahkan jika diizinkan di tempat lain.

Proses memindahkan dari representasi beberapa baris yang dilipat dari bidang header ke representasi baris tunggal disebut "unfolding". Unfolding dilakukan dengan hanya menghapus CRLF yang segera diikuti oleh WSP. Setiap bidang tajuk harus diperlakukan dalam bentuk yang tidak dilipat untuk evaluasi sintaksis dan semantik lebih lanjut.

Ini bukan untuk mengurangi fakta bahwa NickW dengan tepat menunjuk saya pada apa yang perlu saya ketahui, hanya untuk membantu jawaban ini tetap relevan bagi siapa saja yang mungkin menemukannya di masa depan.

NickW
sumber
Saya tentu tidak tersinggung :)
NickW
1

Server Sendmail (SendMail) menetapkan batas panjang garis tetapi jauh lebih tinggi (990 byte atau lebih untuk mailer smtp).

SendMail! = SendEmail

Seperti yang saya mengerti, Nagios menggunakan klien SendEmail default untuk mengirim email. Tampaknya klien email yang Anda gunakan untuk Nagi menggunakan batasan "keras" seperti itu pada panjang tajuk email / baris subjek.

Periksa dan laporkan klien email yang dikonfigurasi dalam commands.cfgfile konfigurasi.
( notify-host-by-emaildan notify-service-by-emailpengaturan).

AnFi
sumber
Saya tahu tentang masalah panjang garis, dan L=/ F=Lparameter, dan saya setuju dengan Anda bahwa ini bukan masalah. NAGIOS saya mengirim hanya menggunakan echo "" | mail -s "$VARIABLE$ $ANOTHERVAR$"- tetapi bagaimanapun juga, masalahnya lebih dalam dari itu, itulah sebabnya saya mengutip contoh sederhana di mailatas - untuk mengambil NAGIOS dari gambar.
MadHatter