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

Переадресация exim.

Добавлено: 2010-09-21 10:39:33
Дмитрий
Доброго времени суток!
Нужна помощь зала как никогда.

Итак, задача состоит в следующем:
Нужно организовать переадресацию с ящика пользовтаеля нескольким получателям с возможностью копирования писем на изначальные ящики (которые идут в загловках письма).

Тут я буду описывать три способа

Способ первый.
Задачу шал следющим образом:
1.Создал таблицу в mysql:

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

+--------+-------------+------+-----+-------------------+-----------------------------+
| Field  | Type        | Null | Key | Default           | Extra                       |
+--------+-------------+------+-----+-------------------+-----------------------------+
| id     | int(11)     | NO   | PRI | NULL              | auto_increment              | 
| adress | varchar(40) | NO   |     | NULL              |                             | 
| goto   | varchar(40) | NO   |     | NULL              |                             | 
| copy   | tinyint(1)  | NO   |     | 0                 |                             | 
| date   | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+--------+-------------+------+-----+-------------------+-----------------------------+
2. Написал в системном фильтре следующее:

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

if $recipients is "${lookup mysql{SELECT adress  FROM `forward` WHERE \
                   adress='$recipients' AND `copy`=1 LIMIT 0,1}}"
then 
         unseen deliver "${lookup mysql{SELECT `goto` FROM `forward` WHERE \
                           adress='$recipients' LIMIT 0,1}}"
endif

if $recipients is "${lookup mysql{SELECT adress  FROM `forward` WHERE \
                   adress='$recipients' AND `copy`=0 LIMIT 0,1}}"
then 
         deliver "${lookup mysql{SELECT `goto` FROM `forward` WHERE \
                           adress='$recipients' LIMIT 0,1}}"
endif
Всё работает но есть большое НО, а именно переадресация НЕ работает когда письмо направляется на несколько адресов, разделённых через запятую, потому что переменная $recipients - это список адресов через запятую.

Способ второй.
Немного подумав, я решил сделать по другому свой системный фильтр:

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

if $recipients is "${lookup mysql{SELECT  '$recipients' FROM `forward` WHERE \
                    FIND_IN_SET(`adress`,'$recipients') AND `copy`=0 LIMIT 0,1}}"
then

#для адресов, с которых есть переадресация
       mail from $header_from  subject $header_subject text $message_body to
               "${lookup mysql{SELECT group_concat(`goto`) FROM `forward` WHERE \
                FIND_IN_SET(`adress`,replace('$recipients',' ','')) }}"  extra_headers "Content-Type:$header_content-type\nContent-Transfer-Encoding: 8bit"

#для адресов, с которых нет переадресации
       mail from $header_from  subject $header_subject text $message_body to
               "${lookup mysql{SELECT group_concat(`username`) FROM `mailbox` WHERE \
                username not in (select adress from forward) and FIND_IN_SET(`username`,replace('$recipients',' ','')) }}" extra_headers "Content Type:$header_content-type\nContent-Transfer-Encoding: 8bit"

endif
Переадресация работал на Ура , письма уходили и на переад. ящики и на ящики, с которых нет переадреции, но тут был косяк - тело письма почему то изменялось, а именно, удалялись символы перевода строк. Тело письма выглядело одной сторокой.

Способ третий.
Поматерившись, решил сделать по - другому:

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

if  foranyaddress "$recipients" ( $thisaddress is "${lookup mysql{SELECT adress FROM `forward` WHERE adress='$thisaddress'}}" )
     
        then     deliver "${lookup mysql{SELECT goto FROM `forward` WHERE adress='$thisaddress' }}"
        else 
            deliver $thisaddress        
        endif
Но и тут был косяк, так как почему обрабатывался только один первый адрес. Остальные же тупо игнорировались. Цикл выполнялся ровно один раз, хотя в доках написано, что foranyaddress служит для ЦИКЛИЧЕСКОЙ обработки сообщений.

Я уже выбился из сил и решил попросить помощь Зала, ибо уже не вмоготу. :st:

Re: Переадресация exim.

Добавлено: 2010-09-27 16:15:48
Alex Keda
отладочку юзаем.
смотрим чё происходит

Re: Переадресация exim.

Добавлено: 2010-09-30 12:46:26
Дмитрий
А по - подробнее можно?

Re: Переадресация exim.

Добавлено: 2010-09-30 19:03:31
Alex Keda
в прилепленной теме посмотрите

Re: Переадресация exim.

Добавлено: 2010-10-08 13:03:49
Дмитрий
Не понял в какой теме... Дайте пожалуйста ссылку на неё.

Re: Переадресация exim.

Добавлено: 2010-10-08 16:18:06
hizel

Re: Переадресация exim.

Добавлено: 2010-10-18 7:48:32
Дмитрий
Спасибо!!!
Ларчик, как всегда, просто открылся:

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

forwarding_no_copy:
  driver      = redirect
  data = ${lookup mysql{SELECT goto  FROM `forwardnew` WHERE  adress='${quote_mysql:$local_part@$domain}' AND `copy`=2 }}

forwarding_copy:
  driver  = redirect
  unseen
  data = ${lookup mysql{SELECT goto  FROM `forwardnew` WHERE  adress='${quote_mysql:$local_part@$domain}' AND `copy`=3 }}