Я пишу фильтры 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
правильно расшифрованы все вариации проблемных сюжетов.