transport_filter altermime header handling cp1251

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
mvs
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-06-07 10:21:23

transport_filter altermime header handling cp1251

Непрочитанное сообщение mvs » 2016-06-07 10:54:28

Задача:
Дописывать к письмам подписи

Работает:

Вот так я дописываю заголовок в транспорте:

Код: Выделить всё

## транспорт вызывает altermime, в соответствии с переменной $sender_address
transport_filter = /bin/bash -c "${if exists{/etc/exim4/disclaimer/users/$sender_address.txt} {/usr/bin/altermime --input=- --disclaimer=/etc/exim4/disclaimer/users/$sender_address.txt --disclaimer-html=/etc/exim4/disclaimer/users/$sender_address.html} {/bin/cat}}"

## Кодировка подписи
file /etc/exim4/disclaimer/users/$sender_address.txt: UTF-8 Unicode text, with very long lines
Основная сложность, что некоторые письма:
Content-Type: text/plain; charset=windows-1251; format=flowed
Content-Transfer-Encoding: 7bit


Нагенерил ещё подписей в нужной кодировке:

Код: Выделить всё

file /etc/exim4/disclaimer/users/cp1251/$sender_address.txt: ISO-8859 text, with very long lines
Вопрос:
Можно как-то в transport_filter обработать Content-type письма и подставить подпись из нужного места? Или как иначе добавить подпись к письму в отличной от UTF8 кодировке?

Спасибо.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

transport_filter altermime header handling cp1251

Непрочитанное сообщение xM » 2016-06-07 13:35:27

А у вас всегда в письме одна часть внутри, а не несколько? Просто MIME позволяет для каждой из них добавлять свою кодировку.
В этом, с одной стороны, сложность, а с другой - решение. Можно тупо пихать подпись в виде отдельного MIME с нужной кодировкой забив на Content-type:
Второе решение - иметь два типа подписи в разных кодировках (вар. - конвертировать iconv на лету) подставляя нужную проверкой типа (не проверял)
${if match{$h_content-type:}{windows-1251}{/path/to/win}{/path/to/utf}}
IT voodoo blog https://kostikov.co

mvs
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-06-07 10:21:23

transport_filter altermime header handling cp1251

Непрочитанное сообщение mvs » 2016-06-07 16:45:03

Спасибо, сделал так:

Код: Выделить всё

transport_filter = /bin/bash -c '${if exists{/etc/exim4/disclaimer/users/$sender_address.txt} {/usr/bin/altermime --multipart-insert --input=- --disclaimer="${if match{$h_content-type:}{windows-1251}{/etc/exim4/disclaimer/users/cp1251/$sender_address.txt}{/etc/exim4/disclaimer/users/$sender_address.txt}}" --disclaimer-html="${if match{$h_content-type:}{windows-1251}{/etc/exim4/disclaimer/users/$sender_address.txt}{/etc/exim4/disclaimer/users/$sender_address.txt}}" {/bin/cat}}
и кажется проблема решилась, но:
повлекло письма, со странным содержимым:

Код: Выделить всё

From - Tue Jun  7 15:16:08 2016
X-Account-Key: account2
X-UIDL: 00033a6352147512
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
X-Mozilla-Keys:
можете прокоментировать?
Спасибо

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

transport_filter altermime header handling cp1251

Непрочитанное сообщение xM » 2016-06-07 18:11:25

Не понял, что за письма и от кого?

Отправлено спустя 1 час 20 минут 57 секунд:
Кстати, не понял зачем у вас bash и потом cat.
Вроде бы вот так можно:

Код: Выделить всё

transport_filter=/usr/bin/altermime --input=- --disclaimer=/path/to/footer --disclaimer-html=/path/to/footer_html
IT voodoo blog https://kostikov.co

mvs
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-06-07 10:21:23

transport_filter altermime header handling cp1251

Непрочитанное сообщение mvs » 2016-06-08 15:16:32

ну вы же сами предложили решение с "${if match.." Я его и дописал в transport_filter. А как иначе?

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

transport_filter altermime header handling cp1251

Непрочитанное сообщение xM » 2016-06-08 15:21:02

Читайте внимательно что я написал.
IT voodoo blog https://kostikov.co

mvs
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-06-07 10:21:23

transport_filter altermime header handling cp1251

Непрочитанное сообщение mvs » 2016-06-09 23:58:49

xM писал(а):
А у вас всегда в письме одна часть внутри, а не несколько? Просто MIME позволяет для каждой из них добавлять свою кодировку.
В этом, с одной стороны, сложность, а с другой - решение. Можно тупо пихать подпись в виде отдельного MIME с нужной кодировкой забив на Content-type:
добавил --multipart-insert
вы не только это имели в виду?

Второе решение - иметь два типа подписи в разных кодировках (вар. - конвертировать iconv на лету) подставляя нужную проверкой типа (не проверял)
я отдельно iconv уже сделал в отдельную папку
${if match{$h_content-type:}{windows-1251}{/path/to/win}{/path/to/utf}}
вот это "если" сделал в этом выражении, которое частично заимствовал:

Код: Выделить всё

transport_filter = /bin/bash -c '${if exists{/etc/exim4/disclaimer/users/$sender_address.txt} {/usr/bin/altermime --multipart-insert --input=- --disclaimer="${if match{$h_content-type:}{windows-1251}{/etc/exim4/disclaimer/users/cp1251/$sender_address.txt}{/etc/exim4/disclaimer/users/$sender_address.txt}}" --disclaimer-html="${if match{$h_content-type:}{windows-1251}{/etc/exim4/disclaimer/users/$sender_address.txt}{/etc/exim4/disclaimer/users/$sender_address.txt}}" {/bin/cat}}}'
и трактую так:
Если подпись отправителя есть, то подставляем, и ещё одно условие где идёт content-type match, else - просто /bin/cat.

Влечёт за собой пустые письма. Нужен рабочий вариант.

Где ошибка?
Спасибо.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

transport_filter altermime header handling cp1251

Непрочитанное сообщение xM » 2016-06-10 10:10:16

Я имел ввиду, что что вам не нужен bash и cat! Зачем вы их запускаете, я не пойму, если вы не используете shell-скрипт?
Скорее всего, отсюда ноги и растут.
IT voodoo blog https://kostikov.co

mvs
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-06-07 10:21:23

transport_filter altermime header handling cp1251

Непрочитанное сообщение mvs » 2016-06-10 12:23:10

поставил:

Код: Выделить всё

transport_filter=/usr/bin/altermime --multipart-insert --input=- --disclaimer="${if match{$h_content-type:}{windows-1251}{/etc/exim4/disclaimer/users/cp1251/$sender_address.txt}{/etc/exim4/disclaimer/users/$sender_address.txt}}" --disclaimer-html="${if match{$h_content-type:}{windows-1251}{/etc/exim4/disclaimer/users/$sender_address.txt}{/etc/exim4/disclaimer/users/$sender_address.txt}}"
получаю:

Код: Выделить всё

2016-06-10 11:42:55 [27141] 1bBI1n-00073a-Mj == user1@yourteam.ru <user2@yourteam.ru> R=virtual_user T=virtual_user defer (-1): Expansion of "--disclaimer="${if" from command "/usr/bin/altermime --multipart-insert --input=- --disclaimer="${if match{$h_content-type:}{windows-1251}{/etc/exim4/disclaimer/users/cp1251/$sender_address.txt}{/etc/exim4/disclaimer/users/$sender_address.txt}}" --disclaimer-html="${if match{$h_content-type:}{windows-1251}{/etc/exim4/disclaimer/users/$sender_address.txt}{/etc/exim4/disclaimer/users/$sender_address.txt}}"" in transport filter failed: condition name expected, but found ""

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

transport_filter altermime header handling cp1251

Непрочитанное сообщение xM » 2016-06-10 15:40:09

Ошибка в выражении. Кавычки, наверняка. Не нужны они.
IT voodoo blog https://kostikov.co

mvs
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-06-07 10:21:23

transport_filter altermime header handling cp1251

Непрочитанное сообщение mvs » 2016-06-10 16:34:43

Без кавычек та же ошибка:
...in transport filter failed: condition name expected, but found ""

Помогите написать условие

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

transport_filter altermime header handling cp1251

Непрочитанное сообщение xM » 2016-06-10 17:47:12

mvs писал(а): Помогите написать условие
Попробуйте как-то так.

Код: Выделить всё

DISPATH=/etc/exim4/disclaimer/users
transport_filter="${if match{$h_content-type:}{windows-1251} \
{/usr/bin/altermime --multipart-insert --input=- --disclaimer=DISPATH/cp1251/$sender_address.txt --disclaimer-html=DISPATH/cp1251/$sender_address.html} \
{/usr/bin/altermime --multipart-insert --input=- --disclaimer=DISPATH/$sender_address.txt --disclaimer-html=DISPATH/$sender_address.html}}"
или

Код: Выделить всё

DISPATH=/etc/exim4/disclaimer/users
transport_filter="/usr/bin/altermime --multipart-insert --input=- ${if match{$h_content-type:}{windows-1251} \
{--disclaimer=DISPATH/cp1251/$sender_address.txt --disclaimer-html=DISPATH/cp1251/$sender_address.html} \
{--disclaimer=DISPATH/$sender_address.txt --disclaimer-html=DISPATH/$sender_address.html}}"
Обратите внимание, что кавычек только две. Возможно ругань в этом. Они экранируют пробелы в condition.
Ну и отлаживайте.
IT voodoo blog https://kostikov.co

mvs
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-06-07 10:21:23

transport_filter altermime header handling cp1251

Непрочитанное сообщение mvs » 2016-06-13 3:14:45

не получилось,
Ошибка та же самая, строка не раскрывается.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

transport_filter altermime header handling cp1251

Непрочитанное сообщение xM » 2016-06-13 11:31:45

Короче, проблема с раскрытием строки в полях типа command= и transport_filter= состоит в том, что сначала она разбивается по пробелам на части, а потом обрабатывается.
То есть любое выражение в этих строках либо не должно содержать пробелов, либо быть закавычено.
Таким образом в этом случае условие нужно выносить из строки transport_filter= либо в переменную, которую уже подставлять, либо уходить на уровень скрипта и там разбираться переданными параметрами.
Примеры.

Вариант 1.

Код: Выделить всё

begin routers

dnslookup:
  driver        = dnslookup
  domains       = !+local_domains
  transport = ${if условие{что}{чему}{remote_smtp_filter}{remote_smtp}} # критерий добавления disclaimer
  ignore_target_hosts = 0.0.0.0 : +relay_from_hosts : +primary_ip
  no_more
...

begin transports
...
DISPATH = /etc/exim4/disclaimer/users
DISPLAIN =  ${if match{$h_content-type:}{windows-1251}{DISPATH/cp1251/$sender_address.txt}{DISPATH/$sender_address.txt}}
DISHTML = ${if match{$h_content-type:}{windows-1251}{DISPATH/cp1251/$sender_address.html}{DISPATH/$sender_address.html}}

remote_smtp_filter:
     driver = smtp
     transport_filter = /usr/bin/altermime --multipart-insert --input=- --disclaimer=DISPLAIN --disclaimer-html=DISHTML

remote_smtp:
  driver                = smtp
...
    
Вариант 2.

Код: Выделить всё

begin routers

dnslookup:
  driver        = dnslookup
  domains       = !+local_domains
  transport = ${if условие{что}{чему}{remote_smtp_filter}{remote_smtp}} # критерий добавления disclaimer
  ignore_target_hosts = 0.0.0.0 : +relay_from_hosts : +primary_ip
  no_more
...

begin transports
...
DISFLAG = ${if match{$h_content-type:}{windows-1251}{win}{utf}}

remote_smtp_filter:
     driver = smtp
     transport_filter = /path/to/yourshellscript.sh DISFLAG $sender_address

remote_smtp:
  driver                = smtp
...
    
# cat /path/to/yourshellscript.sh
#!/bin/sh

dispath="/etc/exim4/disclaimer/users"

if [ $1 == win ]; then
	altermime --multipart-insert --input=- --disclaimer=${dispath}/cp1251/$2.txt --disclaimer-html=${dispath}/cp1251/$2.html
else
if [ $1 == utf ]; then
	altermime --multipart-insert --input=- --disclaimer=${dispath}/$2.txt --disclaimer-html=${dispath}/$2.html
fi
fi
IT voodoo blog https://kostikov.co