exim + русская кодировка в автоответах = проблема

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
dm07
сержант
Сообщения: 222
Зарегистрирован: 2008-07-27 19:58:25
Откуда: Уфа
Контактная информация:

exim + русская кодировка в автоответах = проблема

Непрочитанное сообщение dm07 » 2008-12-16 1:02:04

Всем привет!
Кто нибудь решил проблему в сабже?
Независимо от кодировки таблицы mysql с русским текстом автоответа (пробовал кодировки utf8, koi8-r, windows-1251), автоответ в теле содержит символы вопросительного знака. Причем, в самом mysql клиенте при запросе select получаем текст в нормальном виде. Пробовал также запустить exim в режиме отладки, где можно увидеть результат запроса select на получение текста автоответа. Опять, не зависимо от кодировки таблицы автоответа, получаем символы вопросительного знака. Складывается впечатление, что exim при автоответе не желает учитывать кодировку текста автоответа, кроме как латинскую. Попытка выставить явно заголовок кодировки отправляемого письма в транспорте также не дала результата.
Часть конфиг файла exim:
Роутер:

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

vacation_director:
  driver = accept
  domains = ${lookup mysql{SELECT domain FROM vacation WHERE \
                       domain='${quote_mysql:$domain}' AND \
                       email='${quote_mysql:$local_part@$domain}' AND \
                       active='1'}{$value}}
  transport = vacation_autoreply
  unseen

Транспорт:

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

 vacation_autoreply:
  driver = autoreply
#  headers = "Content-Type: text/plain; charset=utf-8"
  user = mailnull
  group = mail
  to = ${sender_address}
  from = "${local_part}@${domain}"
  log = /var/log/vacation.log
  subject = "Auto Reply from ${local_part}@${domain}"
  text = ${lookup mysql {SELECT body FROM vacation \
        WHERE domain='${quote_mysql:$domain}' AND \
        email='${quote_mysql:$local_part@$domain}'}{$value}}

Спасибо за ответ.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: exim + русская кодировка в автоответах = проблема

Непрочитанное сообщение dikens3 » 2008-12-16 10:37:27

В полезных скриптах.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

neyro
сержант
Сообщения: 187
Зарегистрирован: 2008-03-07 20:24:25
Контактная информация:

Re: exim + русская кодировка в автоответах = проблема

Непрочитанное сообщение neyro » 2008-12-16 17:12:30

Эксим насколько я выяснил из поисков обрабатывает сообщения в utf-7 и из-за 1 бита обрезанного получаем кракозябры...вроде бы уже давно обещали пофиксить..но на это забили судя по всему.
workaround есть в полезных скриптах..но способ кривоват т.к. юзер не может сам выбрать вариант авто-ответа(да и очень много хороших идей из-за этого не реализовать) =(.
____________________________________________
Попробовал поискать опять...способ уже есть..скоро выложу в полезных скриптах.

dm07
сержант
Сообщения: 222
Зарегистрирован: 2008-07-27 19:58:25
Откуда: Уфа
Контактная информация:

Re: exim + русская кодировка в автоответах = проблема

Непрочитанное сообщение dm07 » 2008-12-19 22:02:36

neyro писал(а):Эксим насколько я выяснил из поисков обрабатывает сообщения в utf-7 и из-за 1 бита обрезанного получаем кракозябры...вроде бы уже давно обещали пофиксить..но на это забили судя по всему.
workaround есть в полезных скриптах..но способ кривоват т.к. юзер не может сам выбрать вариант авто-ответа(да и очень много хороших идей из-за этого не реализовать) =(.
____________________________________________
Попробовал поискать опять...способ уже есть..скоро выложу в полезных скриптах.


Вот вариант решения проблемы: идея в том, чтобы кодировать сообщения в base64... В exim в транспорте:

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

 vacation_autoreply:
  driver = autoreply
  headers = "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: base64"
  user = mailnull
  group = mail
  to = ${sender_address}
  from = "${local_part}@${domain}"
  log = /var/log/vacation.log
  subject = "=?UTF-8?B?${lookup mysql {SELECT subject FROM vacation \
        WHERE domain='${quote_mysql:$domain}' AND \
        email='${quote_mysql:$local_part@$domain}'}{$value}}?="
  text = ${lookup mysql {SELECT body FROM vacation \
        WHERE domain='${quote_mysql:$domain}' AND \
        email='${quote_mysql:$local_part@$domain}'}{$value}}

Теперь нам надо немного подредактировать php файлы в postfixadmin, а именно - перед занесением данных в таблицу vacation, кодировать их в base64. Редактируем части в edit-vacation.php:

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

$fCanceltarget = $CONF['postfix_admin_url'] . "/list-virtual.php?domain=$fDomain";

if ($_SERVER['REQUEST_METHOD'] == "GET")
{

   $result = db_query("SELECT * FROM $table_vacation WHERE email='$fUsername'");
   if ($result['rows'] == 1)
   {
      $row = db_array($result['result']);
      $tMessage = '';
      $tSubject = base64_decode( $row['subject'] );
      $tBody    = base64_decode( $row['body']    );
   }

   $tUseremail = $fUsername;
   $tDomain = $fDomain;
   if ($tSubject == '') { $tSubject = html_entity_decode($PALANG['pUsersVacation_subject_text'], ENT_QUOTES , 'UTF-8'); }
   if ($tBody == '') { $tBody = html_entity_decode($PALANG['pUsersVacation_body_text'], ENT_QUOTES , 'UTF-8'); }
}
...
 $fBody    = base64_encode( $fBody    );
      $fSubject = base64_encode( $fSubject );

      $result = db_query("SELECT * FROM $table_vacation WHERE email = '$fUsername'");
      if($result['rows'] == 1) {
          $result = db_query("UPDATE $table_vacation SET active = $Active, subject = '$fSubject', body = '$fBody', created = NOW() WHERE email = '$fUsername'");
      }
      else {
          $result = db_query ("INSERT INTO $table_vacation (email,subject,body,domain,created,active) VALUES ('$fUsername','$fSubject','$fBody','$fDomain',NOW(),$Ac
      }

      $fBody    = base64_decode( $fBody    );
      $fSubject = base64_decode( $fSubject );

По аналогии тоже выполняем в vacation.php.

Ingiboy
проходил мимо

Re: exim + русская кодировка в автоответах = проблема

Непрочитанное сообщение Ingiboy » 2012-02-19 22:16:52

Можно без правки postfixadmin. У еxim-а есть функции работы со строками, у меня сработало вот так

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

subject = "=?Windows-1251?B?${str2b64:${lookup mysql{SELECT subject FROM vacation \
  WHERE domain='${quote_mysql:$domain}' AND \
  email='${quote_mysql:$local_part@$domain}'}{$value}}}?="

ingiboy
проходил мимо
Сообщения: 3
Зарегистрирован: 2012-03-08 20:20:14

Re: exim + русская кодировка в автоответах = проблема

Непрочитанное сообщение ingiboy » 2012-03-10 17:52:46

Вдогонку: туда же добавить:

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

  headers = "Content-Type: text/plain; charset=Windows-1251"

Гость
проходил мимо

Re: exim + русская кодировка в автоответах = проблема

Непрочитанное сообщение Гость » 2012-03-11 21:19:17

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

users_autoreply:
    driver = autoreply
    to = $sender_address
    from = "$local_part@$domain"
    subject = AutoReply: ${rfc2047:$h_Subject:}
    headers = "Content-Transfer-Encoding: quoted-printable\nContent-Type: text/plain; \
        charset=UTF-8\nMIME-Version:1.0"
    text = ${lookup mysql{SELECT message FROM autoreply \
        WHERE local_part='${quote_mysql:$local_part}' AND domain='${quote_mysql:$domain}'}}

Аватара пользователя
sergio
мл. сержант
Сообщения: 78
Зарегистрирован: 2006-12-30 2:47:28
Откуда: Русь Києвська

exim + русская кодировка в автоответах = проблема

Непрочитанное сообщение sergio » 2017-04-26 22:27:21

Может кому пригодится. Работает и такой метод!

файлы постфикадмина не трогал.
Пошел по простому пути:
В файле настроек мускула /usr/local/my.cnf

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

[mysqld]

init_connect="SET NAMES utf8;"



Автоответы приходят в нормальном виде.


Вернуться в «MTA - Mail Transfer Agent»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей