Назад | Перейти на главную страницу

Почему sendmail добавляет в заголовки дополнительный возврат каретки?

У меня SendMail 8.14.4 работает на сервере CentOS 5.

Пользователь из Японии отправляет сообщение, и когда оно обрабатывается сервером, SendMail по какой-то причине добавляет дополнительный возврат каретки.

Электронное письмо содержит X-заголовок со значениями, которые (предположительно) содержат международные символы. Я говорю «предположительно», потому что, когда я изучаю источник MIME с помощью notepad ++, я вижу странности вроде STXи CAN.

Мне удалось сузить область тестирования до следующего:

Если я отправлю это через Sendmail, он в конечном итоге оставит SendMail следующим образом:

(IPS, Q-ID и имя хоста изменены для защиты невиновных)

Очевидно, здесь есть потенциальный красный флаг: значение заголовка начинается с цитаты, но не есть закрывающий. Это требуется стандартами RFC? Или это отвлекающий маневр?

Конечным результатом является то, что значения заголовка просачиваются в тело сообщения:

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

На самом деле это довольно просто: RFC 2822, раздел 2.2.3 позволяет использовать длинные заголовки, где заголовок - это имя поля, за которым следует : свернуть и продолжить на следующей строке, пока (упрощенно) следующая строка начинается с пробела .

Общее правило состоит в том, что везде, где этот стандарт допускает складывание пробелов (а не просто символов WSP), CRLF может быть вставлен перед любым WSP. Например, поле заголовка:
Subject: This is a test
можно представить как:

Subject: This  
 is a test

Строка 3 исходного ввода начинается не с пробела, а с символа c и не содержит двоеточия : что не делает его ни продолжением предыдущего заголовка, ни следующим полем заголовка (§2.2).

Это отмечает конец заголовков ...

И начало тела.

Sendmail "исправляет" это искаженное сообщение и добавляет необходимую пустую строку между тем, что он воспринимает как конец заголовков и начало тела.

Простая сессия электронной почты telnet может воспроизвести это поведение:

[user@example ~]$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

<<< 220 example.com ESMTP Sendmail 8.14.4/8.14.4; Fri, 17 Jul 2015 20:29:26 +0200

helo localhost

<<< 250 example.com Hello localhost [127.0.0.1], pleased to meet you

mail from:me@localhost

<<< 250 2.1.0 me@localhost... Sender ok

RCPT TO:user@example.com

<<< 250 2.1.5 user@example.com... Recipient ok

data

<<< 354 Enter mail, end with "." on a line by itself

Subject: test
X-header: do not try
this at home

start the body
.
<<< 250 2.0.0 t6HITQXA020072 Message accepted for delivery
quit

В результате появляется сообщение, подобное вашему примеру:

[user@example ~/Maildir/new]$ cat 1437157845.20091_2.example.com

Return-Path: <me@example.com>
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on example.com
X-Spam-Level:
X-Spam-Status: No, score=-1.9 required=5.0 tests=ALL_TRUSTED,BAYES_00,
        MISSING_HEADERS autolearn=no version=3.3.1
Received: from localhost (localhost [127.0.0.1])
        by example.com (8.14.4/8.14.4) with SMTP id t6HITQXA020072
        for herman@example.com; Fri, 17 Jul 2015 20:30:06 +0200
Date: Fri, 17 Jul 2015 20:29:26 +0200
From: me@example.com
Message-Id: <201507171830.t6HITQXA020072@example.com>
Subject: test
X-header: do not try

this at home

start the body

С дополнительной новой строкой между продолжением исходного заголовка и «новым» началом тела.