У меня 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
С дополнительной новой строкой между продолжением исходного заголовка и «новым» началом тела.