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

Фильтры exim, переменные заголовка и кодировка MIME

Я пишу фильтры exim для пересылки электронной почты (например, почтовый ящик). В условии фильтра я использую переменные заголовка. И я столкнулся с некоторыми трудностями с кодировкой $ h_subject. Попробуйте объяснить на примере.

Новое письмо, отправленное из Gmail, содержит несколько русских слов в теме. Конечно, заголовок темы закодирован в MIME. Выглядит это так:

Subject: =?utf-8?Q?[nr=5Fbill]=20=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20?=
 =?utf-8?Q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD?=

В фильтре Exim я хочу использовать следующее условие: $h_subject: contains "[nr_bill] Новый заказ оформлен"

Проблема в том, что exim декодирует только первую строку заголовка. Декодированный заголовок выглядит так:

[nr_bill] \320\235\320\276\320\262\321\213\320\271 \n =?utf-8?Q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD?=

Первая строка успешно декодирована и может использоваться в фильтрах. Но вторая строка не декодируется. И худшее: Exim сохраняет пробелы и символ новой строки между строками. Насколько я знаю, новые строки и пробелы в заголовках должны быть опущены во время синтаксического анализа.

Так $h_subject: contains "[nr_bill] Новый работает хорошо, а $h_subject: contains "[nr_bill] Новый заказ оформлен" не.

Руководство говорит, что новая строка + пробелы - нормальная практика. Но это ничего не говорит о многокомпонентном MIME-декодировании.

Может ли кто-нибудь предложить, как решить эту проблему, или просто объяснить, в чем смысл такого поведения?

Ответ был найден. Благодаря Фил :)

Exim очень тщательно соблюдает спецификацию MIME в RFC2047, которая устанавливает максимальную длину для каждого закодированного слова.

---------------------------- 8 <вырезать здесь> 8 ---------------- --------------

encoded-word = "=?" кодировка "?" кодировка "?" encoded-text "? =" [...]

«Кодированное слово» не может быть длиннее 75 символов, включая «набор символов», «кодировку», «закодированный текст» и разделители. Если желательно закодировать больше текста, чем умещается в «закодированном слове» из 75 символов, можно использовать несколько «закодированных слов» (разделенных пробелом CRLF).

---------------------------- 8 <вырезать здесь> 8 ---------------- --------------

Итак, декодер MIME пропускает эти длинные строки и буквально добавляет их.

...

Если вы установите "check_rfc2047_length" в ложь в основной конфигурации eximʻa, заголовок будет декодирован правильно; Я бы предположил (но не проверял), что Exim затем правильно перекодирует вещи по мере необходимости.

check_rfc2047_length = ложь

Итак, после установки check_rfc2047_length = false правильно расшифрованы все вариации проблемных сюжетов.