EXIM: пользователь включает перенаправление

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Biogef
проходил мимо

EXIM: пользователь включает перенаправление

Непрочитанное сообщение Biogef » 2011-02-09 11:13:51

Цель: Пользователь, при уходе в отпуск, отправляет на адрес redirect@domain.ru письмо, в теме которого пишет почтовые адреса через запятую, на которые он бы хотел получать почту, приходящую на его корпоративный адрес.
С этим проблем нет. Но вот хочется, чтобы ему при включении редиректа сразу же приходил ответ от exim'a о том, что переадресация включена для таких-то адресов. (Вобщем-то можно и без этого, но лучше так, чтобы человек был спокоен, что переадресация включена и адреса те, которые он указал).
Вот это у меня и не получается сделать.

Вот как сделал включение этой возможности:

Макросы:

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

#REDIRECTION
INSERT_REDIRECTION=INSERT INTO redirection(recipient) values ('${quote_mysql:$sender_address}');
CHECK_REDIRECTION=SELECT COUNT(*) FROM redirection WHERE recipient='${quote_mysql:$sender_address}';
DELETE_REDIRECTION=DELETE FROM redirection WHERE recipient='${quote_mysql:$sender_address}';

INSERT_BODY=UPDATE redirection SET forward_to='${quote_mysql:$h_subject:}' WHERE recipient='${quote_mysql:$sender_address}' AND forward_to IS NULL;
#REDIRECTION END
RCPT acl:

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


#REDIRECTION
  warn    hosts         = +relay_from_hosts
          domains       = +local_domains
          local_parts   = redirect
          set acl_m15   = ${lookup mysql{CHECK_REDIRECTION}{$value}{0}}
          condition     = ${if == {$acl_m15}{0}{yes}{no}}
          set acl_m16   = ${lookup mysql{INSERT_REDIRECTION}{$value}{0}}

  warn    hosts         = +relay_from_hosts
          domains       = +local_domains
          local_parts   = redirect
          condition     = ${if == {$acl_m15}{1}{yes}{no}}
          set acl_m16   = ${lookup mysql{DELETE_REDIRECTION}{$value}{0}}
#REDIRECTION END
DATA acl:

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

#REDIRECTION

    warn
        hosts           =+relay_from_hosts
        set acl_m17     = ${lookup mysql{CHECK_REDIRECTION}{$value}{0}}
        condition       = ${if == {$acl_m17}{1}{yes}{no}}
        set acl_m18     = ${lookup mysql{INSERT_BODY}{$value}{0}}

#REDIRECTION END
router:

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

redirect_user:
driver = redirect
condition = ${if eq{} {${lookup mysql{SELECT `recipient` FROM `redirection` WHERE `recipient`='${quote_mysql:$local_part}@${quote_mysql:$domain}'}}}{no}{yes}}
unseen
data = ${lookup mysql{SELECT `forward_to` FROM `redirection` WHERE `recipient`='${quote_mysql:$local_part}@${quote_mysql:$domain}'}}

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

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение blade_007 » 2011-02-09 11:41:22

Как вариант (требует домысления/доработки). Суть: написав письмо на redirect, вносятся данные в БД mysql, сначала отрабатывает роутер router_test, который запускает transport_test (собственно autoreply один раз для пользователя, отправившего письмо на redirect@). Далее отрабатывает ваш роутер ,который собственно делает редирект. Как то так.

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

router_test:
driver = accept
local_parts = redirect
domains = +local_domains
condition = ${if eq{} {${lookup mysql{SELECT `recipient` FROM `redirection` WHERE `recipient`='${quote_mysql:$local_part}@${quote_mysql:$domain}'}}}{no}{yes}}
transport = transport_test
unseen

redirect_user:
*****

transport_test:
driver = autoreply
text = Some text. Autoreply active. Redirects to $h_subject
from = $local_part@$domain
to = $sender_address
subject = Autoreply Re: ${rfc2047:$h_Subject:}
once

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

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение Biogef » 2011-02-09 13:45:30

Да вот я уже так попробовал, что-то получилось.

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

--------> router_test router <--------
local_part=test domain=domain.ru
checking domains
search_open: mysql "NULL"
  cached open
search_find: file="NULL"
  key="SELECT `domain` FROM `domain` WHERE `active`='1'" partial=-1 affix=NULL starflags=0
LRU list:
internal_search_find: file="NULL"
  type=mysql key="SELECT `domain` FROM `domain` WHERE `active`='1'"
cached data used for lookup of SELECT `domain` FROM `domain` WHERE `active`='1'
lookup yielded: ALL
domain.ru
bytik.ru
domain.loc
domain.ru in "ALL:domain.ru:bytik.ru:domain.loc"? yes (matched "domain.ru")
domain.ru in "+local_domains"? yes (matched "+local_domains")
checking local_parts
test in "redirect"? no (end of list)
router_test router skipped: local_parts mismatch

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

--------> router_test router <--------
local_part=test domain=domain.ru
checking domains
search_open: mysql "NULL"
  cached open
search_find: file="NULL"
  key="SELECT `domain` FROM `domain` WHERE `active`='1'" partial=-1 affix=NULL starflags=0
LRU list:
internal_search_find: file="NULL"
  type=mysql key="SELECT `domain` FROM `domain` WHERE `active`='1'"
cached data used for lookup of SELECT `domain` FROM `domain` WHERE `active`='1'
lookup yielded: ALL
domain.ru
bytik.ru
domain.loc
domain.ru in "ALL:domain.ru:bytik.ru:domain.loc"? yes (matched "domain.ru")
domain.ru in "+local_domains"? yes (matched "+local_domains")
checking local_parts
test in "redirect"? no (end of list)
router_test router skipped: local_parts mismatch

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение blade_007 » 2011-02-09 14:21:07

вы пишете письмо на test@domain, а не redirect@ исходя из лога.. или я вас не правильно понял?

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

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение Biogef » 2011-02-09 15:07:56

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

(echo "HELO SYS"; echo "MAIL FROM:test@domain.ru"; echo "RCPT TO: redirect@domain.ru"; echo "DATA"; echo "Subject: test@gmail.com"; echo "."; echo "QUIT";) \
| exim -d+transport -bhc 192.168.0.20 > mysql_test.log 2>&1
В том то и дело, что пишу на redirect

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение blade_007 » 2011-02-09 15:36:21

Странно, проверьте еще раз, потому, как local_part относится к адресам в команде rcpt to.

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

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение Biogef » 2011-02-09 15:53:30

Вот все, что в конфиге по этому роутеру. Скрипт sh который тест проводит такой:

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

(echo "HELO SYS"; echo "MAIL FROM:test@domain.ru"; echo "RCPT TO: redirect@domain.ru"; echo "DATA"; echo "Subject: test@gmail.com"; echo "."; echo "QUIT";) \
| exim -d+all -bhc 192.168.0.20 > mysql_test.log 2>&1
При этом тесте добавляется адрес из темы в таблицу.

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

router_test:
driver = accept
local_parts = redirect
condtestion = ${if eq{} {${lookup mysql{SELECT `recipient` FROM `redirection` WHERE `recipient`='${quote_mysql:$local_part}@${quote_mysql:$domain}'}}}{no}{yes}}
domains = +local_domains
transport = transport_test
unseen

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

transport_test:
driver = autoreply
to = $sender_address
from = "$local_part@$domain"
subject = HELLO
text = ${lookup mysql{SELECT forward_to FROM redirection WHERE recipient='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}{0}}
once =

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

15:46:38 11193 --------> router_test router <--------
15:46:38 11193 local_part=test domain=domain.ru
15:46:38 11193 checking domains
15:46:38 11193 expanding: SELECT `domain` FROM `domain` WHERE `active`='1'
15:46:38 11193    result: SELECT `domain` FROM `domain` WHERE `active`='1'
15:46:38 11193 search_open: mysql "NULL"
15:46:38 11193   cached open
15:46:38 11193 search_find: file="NULL"
15:46:38 11193   key="SELECT `domain` FROM `domain` WHERE `active`='1'" partial=-1 affix=NULL starflags=0
15:46:38 11193 LRU list:
15:46:38 11193 internal_search_find: file="NULL"
15:46:38 11193   type=mysql key="SELECT `domain` FROM `domain` WHERE `active`='1'"
15:46:38 11193 cached data used for lookup of SELECT `domain` FROM `domain` WHERE `active`='1'
15:46:38 11193 lookup yielded: ALL
15:46:38 11193 domain.ru
15:46:38 11193 domain.ru
15:46:38 11193 domain.loc
15:46:38 11193 expanding: ${lookup mysql {SELECT `domain` FROM `domain` WHERE `active`='1'}}
15:46:38 11193    result: ALL
15:46:38 11193 domain.ru
15:46:38 11193 domain.ru
15:46:38 11193 domain.loc
15:46:38 11193 expanding: "\n"
15:46:38 11193    result: "
15:46:38 11193 "
15:46:38 11193 expanding: :
15:46:38 11193    result: :
15:46:38 11193 expanding: ${tr{${lookup mysql {SELECT `domain` FROM `domain` WHERE `active`='1'}}}{"\n"}{:}}
15:46:38 11193    result: ALL:domain.ru:domain.ru:domain.loc
15:46:38 11193 domain.ru in "ALL:domain.ru:domain.ru:domain.loc"? yes (matched "domain.ru")
15:46:38 11193 domain.ru in "+local_domains"? yes (matched "+local_domains")
15:46:38 11193 checking local_parts
15:46:38 11193 test in "redirect"? no (end of list)
15:46:38 11193 router_test router skipped: local_parts mismatch





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

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение Biogef » 2011-02-09 17:01:17

Т.е. если в -bhc Ip внутрилокальный то local_parts = адресу отправителя. Иначе - адресу получателя. Кажется я уже наступал на эти грабли. :-)

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

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение Гость » 2011-02-09 17:37:30

Вот так работает, приходит автоответ сразу.

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

router_test:
driver = accept
condition = ${if eq{$sender_address}{redirect@domain.ru}{no}{yes}}
domains = +local_domains
transport = transport_test
unseen

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

transport_test:
driver = autoreply
to = $sender_address
from = "$local_part@$domain"
subject = Ecomplished
text = ${lookup mysql{SELECT forward_to FROM redirection WHERE recipient='${quote_mysql:$local_part}@${quote_mysql:$domain}'}{$value}{0}}
once =

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

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение Biogef » 2011-02-09 17:49:16

Спасибо огромное вы здорово помогли. Все работает. Чуть позже отпишу как чего сделал.

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение blade_007 » 2011-02-09 18:21:15

заморочился, сделал табличку в mysql с полями recipient(varchar(64)) и forward_to(varchar(255))

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

insert into redirection values('jack@domain','test@domain,jack@domain');
роутеры. Важный момент - выборка идет по SENDER_ADDRESS, т.е. от mail_from, а не от local_part

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

router_test:
        driver = accept
        local_parts = redirect
        domains = +local_domains
        condition = ${if eq{} {${lookup mysql{SELECT `recipient` FROM `redirection` WHERE `recipient`='${quote_mysql:$sender_address}'}}}{no}{yes}}
        transport = transport_test
        unseen

redirect_user:
        driver = redirect
        condition = ${if eq{} {${lookup mysql{SELECT `recipient` FROM `redirection` WHERE `recipient`='${quote_mysql:$sender_address}'}}}{no}{yes}}
        data = ${lookup mysql{SELECT `forward_to` FROM `redirection` WHERE `recipient`='${quote_mysql:$sender_address}'}}
        no_more
транспорты

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

transport_test:
        driver = autoreply
        text = Some text. Autoreply active. Redirects to $h_subject
        from = $local_part@$domain
        to = $sender_address
        subject = Autoreply Re: ${rfc2047:$h_Subject:}
тестируйте/критикуйте


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

Re: EXIM: пользователь включает перенаправление

Непрочитанное сообщение Biogef » 2011-02-10 11:19:38

Так как у вас, автоответ приходит только когда удаляется из бд. Я оставил так:

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

router_test:
driver = accept
local_parts = redirect
domains = +local_domains
transport = transport_test
unseen

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

transport_test:
driver = autoreply
from = $local_part@$domain
to = $sender_address
subject = RE:
text = ${lookup mysql{SELECT forward_to FROM redirection WHERE recipient='${quote_mysql:$sender_address}'}{$value}{0}}
Вроде все корректно работает.
Спасибо еще раз за помощь.