Страница 1 из 1
EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 11:13:51
Biogef
Цель: Пользователь, при уходе в отпуск, отправляет на адрес
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}'}}
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 11:41:22
blade_007
Как вариант (требует домысления/доработки). Суть: написав письмо на 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
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 13:45:30
Biogef
Да вот я уже так попробовал, что-то получилось.
Код: Выделить всё
--------> 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
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 14:21:07
blade_007
вы пишете письмо на test@domain, а не redirect@ исходя из лога.. или я вас не правильно понял?
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 15:07:56
Biogef
Код: Выделить всё
(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
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 15:36:21
blade_007
Странно, проверьте еще раз, потому, как local_part относится к адресам в команде rcpt to.
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 15:53:30
Biogef
Вот все, что в конфиге по этому роутеру. Скрипт 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
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 16:07:54
blade_007
condtestion это описка или как?
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 16:34:13
Biogef
Да, именно очепятка в конфиге все ок.
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 16:52:59
Biogef
Понял, что local_parts это зависит от -bhc.
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 17:01:17
Biogef
Т.е. если в -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 =
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 17:49:16
Biogef
Спасибо огромное вы здорово помогли. Все работает. Чуть позже отпишу как чего сделал.
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 18:21:15
blade_007
заморочился, сделал табличку в 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:}
тестируйте/критикуйте
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-09 21:04:02
Biogef
Ну вот в итоге я также и сделал :-)
Re: EXIM: пользователь включает перенаправление
Добавлено: 2011-02-10 11:19:38
Biogef
Так как у вас, автоответ приходит только когда удаляется из бд. Я оставил так:
Код: Выделить всё
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}}
Вроде все корректно работает.
Спасибо еще раз за помощь.