base64 и фильтрация в exim

SergeRRRRRR

Настроил файл .forward в exim (точнее написал веб-интерфейс для создания файлов фильтров всплыла следующая проблема - если в письме, например тема, закодирована в base64, то фильтрация по теме работать не будет.
Как-нибудь можно настроить exim, чтобы он переводил всю инфу в письме из base64 в обычный текст?

serega1604


The whole item, including the terminating colon, is replaced by the contents of the message header line. If there is more than one header line with the same name, their contents are concatenated. For header lines whose data consists of a list of addresses (for example, From: and To a comma and newline is inserted between each set of data. For all other header lines, just a newline is used.
Leading and trailing white space is removed from header line data, and if there are any MIME “words” that are encoded as defined by RFC 2047 (because they contain non-ASCII characters they are decoded and translated, if possible, to a local character set. Translation is attempted only on operating systems that have the iconv function. This makes the header line look the same as it would when displayed by an MUA. The default character set is ISO-8859-1, but this can be changed by means of the headers command (see below).
If you want to see the actual characters that make up a header line, you can specify $rheader_ instead of $header_. This inserts the “raw” header line, unmodified.
There is also an intermediate form, requested by $bheader_, which removes leading and trailing space and decodes MIME “words”, but does not do any character translation. If an attempt to decode what looks superficially like a MIME “word” fails, the raw string is returned. If decoding produces a binary zero character, it is replaced by a question mark.
краткая резолюция - все должно и так работать.

SergeRRRRRR

Тоже самое на русском.
http://www.rldp.ru/articles/exim46r/glava54.htm
Весь элемент, включая завершающее двоеточие, заменяется содержимым строки заголовка. Если есть более одного заголовка с одним и тем же именем, их содержимое объединяется. Для строк заголовков, чьи данные состоят из списка адресов (например, From: и To запятые и символы новой строки вставляются между каждым набором адресов. Для всех других строк заголовоков используется лишь символ новой строки.
Начальное и завершающее пустое пространство удаляется из данных строки заголовка, и если в них есть любые слова MIME, которые закодированы как задано в RFC 2047 (поскольку они содержат не-ASCII символы они декодируются и переводятся, если возможно, в локальную кодировку. Попытка перевода предпринимается лишь в операционных системах, которые обладают функцией iconv. Это создаёт такой же поиск по строкам заголовков, как и при показе MUA. Кодировка по умолчанию устанвливается в ISO-8859-1, но это может быть изменено посредством команды headers (смотрите ниже).
Если Вы хотите видеть фактическую кодировку, в которой созданы строки заголовков, можете определить $rheader_ вместо $header_. Этим вставляются немодифицированные строки заголовков.
Также есть промежуточная форма, запрашиваемая путём $bheader_, с удалёнными начальными и конечными пробелами и декодированными словами MIME, но не переведённой кодировкой. Если попытка декодирования того, что на первый взгляд показалось словами MIME, неудачна, возвращается сырая строка. Если декодирование производит бинарные нули, они заменяются знаком вопроса.

Как я понял, тут говорится просто про разные кодировки, а не про base64.

serega1604

если ты найдешь в твоей и моей цитате слово MIME, а также отсылку к некоторому RFC, то можешь открыть его и увидеть, что там идет речь про кодирование заголовков в base64 либо в quoted-printable. в твоей цитате русским по белому написано - заголовок "декодируется и переводится в локальную кодировку".
может у тебя проблема как раз в том что кодировка файла .filter не совпадает с той, в которой запущен exim?

SergeRRRRRR

думаю вопрос можно снять, у экзима есть разные хедеры - $bheader_ и $header_, первый производит перевод из base64, а второй может менять кодировки. Я использовал $header_subject. Взято от сюда http://ftp.exim.org/pub/exim/ChangeLogs/NewStuff-4.24
 
13. The way that the $h_ (and $header_) expansions work has been changed by the
    addition of RFC 2047 decoding. There are now three forms:
     $rh_xxx: and $rheader_xxx: give the original content of the header
     line(s with no processing at all.
     $bh_xxx: and $bheader_xxx: remove leading and trailing white space, and
     then decode base64 or quoted-printable "words" within the header text,
     but do not do charset translation. If decoding of what looks
     superficially like a "word" fails, the raw string is returned. If
     decoding produces a binary zero character, it is replaced by a question
     mark - this is what Exim does for binary zeros that are actually
     received in header lines.
     $h_xxx: and $header_xxx: attempt to translate the $bh_ string to a
     standard character set. If this translation fails, the $bh_ string is
     returned. Translation is attempted only on operating systems that have
     the iconv function. This is indicated by the compile-time macro
     HAVE_ICONV.
 

P.S. в принципе выше это и было написано, но тут в более явной форме, и вчера ночью в ту формулировку я не вкурил.

serega1604

>думаю вопрос можно снять, у экзима есть разные хедеры - $bheader_ и $header_, первый производит перевод из base64, а второй может менять кодировки.
эмм, я конечно может совсем не знаю английский, но вроде как в твоей цитате написано, что $header - это $bheader, перекодированный в локальную кодировку, нет? т.е. у тебя проблема как раз в несовпадении где-то кодировок.

SergeRRRRRR

Хз, мб, хотя это странно, инглиш (а фильтрация настроена на английские слова) в большинстве случае инвариантен.
Зато вылез трабл с длиной темы, при очень длинной теме фильтрация не происходила, помогло дописывание check_rfc2047_length=false в конфиг экзима. Мб кому пригодится.
Оставить комментарий
Имя или ник:
Комментарий: