Настройка автоответчика

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
storm
рядовой
Сообщения: 48
Зарегистрирован: 2008-09-26 16:04:39
Откуда: Киев
Контактная информация:

Настройка автоответчика

Непрочитанное сообщение storm » 2010-06-10 13:50:22

Необходимо настроить автоответчик с возможностью управления для рядовых юзеров.

ОС Debian Lenny
exim 4.69-9
mysql 5.0.51a-24+lenny3
postfixadmin 2.3

При включении автоответчика через postfixadmin, например, у юзера test@example.com добавляется соответствующая запись в таблицу vacation, а также добавляется в таблицу alias в поле goto test#example.com@example.com. Соответственно ничего не работает.

Кусок в config.inc.php:

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

$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'example.com';
$CONF['vacation_control'] ='YES';
$CONF['vacation_control_admin'] = 'YES';
Если $CONF['vacation_domain'] сделать пустым, то в таблицу алиасов добавляется test#example.com@

Соответственно когда шлем письмо на test@example.com, когда на нем активирован автоответчик, получаем оутлуп:

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

This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

  test#example.com@example.com
    (generated from test@example.com)
    Unknown user
------ This is a copy of the message, including all the headers. ------

Return-path: <111@example.com>
Received: from admin.example.local ([192.168.37.11]:38131)
        by example.com with esmtpa (Exim 4.69)
        (envelope-from <111@example.com>)
        id 1OMew9-0002CY-V3
        for test@example.com; Thu, 10 Jun 2010 13:24:38 +0300
Message-ID: <4C10BD65.4060505@example.com>
Disposition-Notification-To: 111 <111@example.com>
Date: Thu, 10 Jun 2010 13:24:37 +0300
From: 111 <111@example.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100515 Icedove/3.0.4
MIME-Version: 1.0
To: storm <test@example.com>
Subject: 13132
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Хостинговая компания 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/

Аватара пользователя
storm
рядовой
Сообщения: 48
Зарегистрирован: 2008-09-26 16:04:39
Откуда: Киев
Контактная информация:

Re: Настройка автоответчика

Непрочитанное сообщение storm » 2010-06-11 14:33:19

Нашел решение своего вопроса тут - http://forum.lissyara.su/viewtopic.php? ... 50#p175980

Настроил все работает. Работает тогда когда прописываю в транспорте какую тему и текст отправлять. Но хочу брать тему и текст из mysql. Однако, при этом вместо русских символов присылаются «?????». Нашел это - http://forum.lissyara.su/viewtopic.php? ... 84#p124882

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

Рабочий вариант cat edit-vacation.php, при котором в БД вставляет обычный текст и присылаются "???":

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

<?php
/** 
 * Postfix Admin 
 * 
 * LICENSE 
 * This source file is subject to the GPL license that is bundled with  
 * this package in the file LICENSE.TXT. 
 * 
 * Further details on the project are available at : 
 *     http://www.postfixadmin.com or http://postfixadmin.sf.net 
 * 
 * @version $Id: edit-vacation.php 711 2009-08-21 12:02:55Z christian_boltz $ 
 * @license GNU GPL v2 or later. 
 * 
 * File: edit-vacation.php 
 * Responsible for allowing users to update their vacation status.
 *
 * Template File: edit-vacation.php
 *
 * Template Variables:
 *
 * tUseremail
 * tMessage
 * tSubject
 * tBody
 *
 * Form POST \ GET Variables:
 *
 * fUsername
 * fDomain
 * fCanceltarget
 * fChange
 * fBack
 * fQuota
 * fActive
 */

require_once('common.php');

if($CONF['vacation'] == 'NO') { 
   header("Location: " . $CONF['postfix_admin_url'] . "/list-virtual.php");
   exit(0);
}

$SESSID_USERNAME = authentication_get_username();
$tmp = preg_split ('/@/', $SESSID_USERNAME);
$USERID_DOMAIN = $tmp[1];

// only allow admins to change someone else's 'stuff'
if(authentication_has_role('admin')) {
   if (isset($_GET['username'])) $fUsername = escape_string ($_GET['username']);
   if (isset($_GET['domain'])) $fDomain = escape_string ($_GET['domain']);
}
else {
   $fUsername = $SESSID_USERNAME;
   $fDomain = $USERID_DOMAIN;
}

$vacation_domain = $CONF['vacation_domain'];
//$vacation_goto = preg_replace('/@/', '#', $fUsername);
//$vacation_goto = $vacation_goto . '@' . $vacation_domain;
$vacation_goto = $fUsername;

$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 = $row['subject'];
      $tBody = $row['body'];
////////////////////////////////////////////////////
//    $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'); }

}

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

   $tSubject   = safepost('fSubject');
   $tBody      = safepost('fBody');
   $fChange    = escape_string (safepost('fChange'));
   $fBack      = escape_string (safepost('fBack'));

   $fBody      = escape_string ($tBody);
   $fSubject   = escape_string ($tSubject);
//////////////////////////////////////////////////
//    $fBody    = base64_encode($fBody);
//    $fSubject = base64_encode($fSubject);
//////////////////////////////////////////////////


   if(authentication_has_role('admin') && isset($_GET['domain'])) {
      $fDomain = escape_string ($_GET['domain']);
   }
   else {
      $fDomain = $USERID_DOMAIN;
   }
   if(authentication_has_role('admin') && isset ($_GET['username'])) {
      $fUsername = escape_string($_GET['username']);
   }
   else {
      $fUsername = authentication_get_username();
   }

   $tUseremail = $fUsername;
   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'); }

   //if change, remove old one, then perhaps set new one
   if (!empty ($fBack) || !empty ($fChange))
   {
      //if we find an existing vacation entry, disable it
      $result = db_query("SELECT * FROM $table_vacation WHERE email='$fUsername'");
      if ($result['rows'] == 1)
      {
         $db_false = db_get_boolean(false);
         // retain vacation message if possible - i.e disable vacation away-ness.
         $result = db_query ("UPDATE $table_vacation SET active = '$db_false' WHERE email='$fUsername'");
         $result = db_query("DELETE FROM $table_vacation_notification WHERE on_vacation='$fUsername'");

         $result = db_query ("SELECT * FROM $table_alias WHERE address='$fUsername'");
         if ($result['rows'] == 1)
         {
            $row = db_array ($result['result']);
            $goto = $row['goto'];
            //only one of these will do something, first handles address at beginning and middle, second at end
            //$goto= preg_replace ( "/$vacation_goto,/", '', $goto);
            //$goto= preg_replace ( "/,$vacation_goto/", '', $goto);
            //$goto= preg_replace ( "/$vacation_goto/", '', $goto);
            if($goto == '') {
               $sql = "DELETE FROM $table_alias WHERE address = '$fUsername'";
            }
            else {
               $sql = "UPDATE $table_alias SET goto='$goto',modified=NOW() WHERE address='$fUsername'";
            }
            $result = db_query($sql);
            if ($result['rows'] != 1)
            {
               $error = 1;
            }
         }
      }
   }


   //Set the vacation data for $fUsername

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

   if (!empty ($fChange))
   {
      $goto = '';
      $result = db_query ("SELECT * FROM $table_alias WHERE address='$fUsername'");
      if ($result['rows'] == 1)
      {
         $row = db_array ($result['result']);
         $goto = $row['goto'];
      }
      $Active = db_get_boolean(True);
      $notActive = db_get_boolean(False);
      // I don't think we need to care if the vacation entry is inactive or active.. as long as we don't try and
      // insert a duplicate
      $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(),'$Active')");
      }

      if ($result['rows'] != 1)
      {
         $error = 1;
      }
      if($goto == '') {
         $goto = $vacation_goto;
         $sql = "INSERT INTO $table_alias (goto, address, domain, modified) VALUES ('$goto', '$fUsername', '$fDomain', NOW())";
      }
      else {
         $goto = $goto . "," . $vacation_goto;
         $sql = "UPDATE $table_alias SET goto='$goto',modified=NOW() WHERE address='$fUsername'";
      }
      $result = db_query ($sql);
      if ($result['rows'] != 1)
      {
         $error = 1;
      }
   }
}

if($error == 0) {
   if(!empty ($fBack)) {
      $tMessage = $PALANG['pVacation_result_removed'];
   }
   if(!empty($fChange)) {
      $tMessage= $PALANG['pVacation_result_added'];   
   }
}
else {
   $tMessage = $PALANG['pVacation_result_error'];
}

include ("templates/header.php");
include ("templates/menu.php");
include ("templates/edit-vacation.php");
include ("templates/footer.php");
/* vim: set expandtab softtabstop=3 tabstop=3 shiftwidth=3: */
?>
Если закомментировать «ненужные» параметры и раскомментировать те которые нужны, то поля subject и body таблицы vacation при включении автоответчика остаются пустыми :(