Страница 1 из 1

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

Добавлено: 2008-12-16 1:02:04
dm07
Всем привет!
Кто нибудь решил проблему в сабже?
Независимо от кодировки таблицы 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}}
Спасибо за ответ.

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

Добавлено: 2008-12-16 10:37:27
dikens3
В полезных скриптах.

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

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

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

Добавлено: 2008-12-19 22:02:36
dm07
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.

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

Добавлено: 2012-02-19 22:16:52
Ingiboy
Можно без правки 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}}}?="

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

Добавлено: 2012-03-10 17:52:46
ingiboy
Вдогонку: туда же добавить:

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

  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}'}}

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

Добавлено: 2017-04-26 22:27:21
sergio
Может кому пригодится. Работает и такой метод!

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

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

[mysqld]

init_connect="SET NAMES utf8;"

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