URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 71851
[ Назад ]

Исходное сообщение
"Помогите разобраться с exim"

Отправлено Dimka , 01-Фев-07 11:34 
Всем привет,

хочу вот такой конструкцией отмести все письма на ящик, у которого превышен лимит
во время SMTP сессии

maildir_overquota:
        driver = redirect
        condition = ${if eq{} \
                {${lookup pgsql{SELECT isoverquota('${quote_pgsql:$local_part}','${quote_pqsql:$domain}') }}}\
                {yes}{no}}
        data = :fail:Mailbox quota exceeded
        allow_fail

А оно не работает, подскажите почему?
-----------------------------
mail=> CREATE OR REPLACE FUNCTION isoverquota(character varying, character varying) returns text
mail-> AS $_$
mail$> SELECT login from mailbox where (localpart = $1 AND domain = $2 AND overquota=1);
mail$> $_$
mail-> LANGUAGE sql;
--------------------------------
overquota =1 означает что ящик переполнен.


Содержание

Сообщения в этом обсуждении
"Помогите разобраться с exim"
Отправлено bass , 01-Фев-07 13:58 
>Всем привет,
>
>хочу вот такой конструкцией отмести все письма на ящик, у которого превышен
>лимит
>во время SMTP сессии
>
>maildir_overquota:
>        driver = redirect
>        condition = ${if eq{}
>\
>            
>    {${lookup pgsql{SELECT isoverquota('${quote_pgsql:$local_part}','${quote_pqsql:$domain}') }}}\
>            
>    {yes}{no}}
>        data = :fail:Mailbox quota
>exceeded
>        allow_fail
>
>А оно не работает, подскажите почему?
>-----------------------------
>mail=> CREATE OR REPLACE FUNCTION isoverquota(character varying, character varying) returns text
>mail-> AS $_$
>mail$> SELECT login from mailbox where (localpart = $1 AND domain = $2 AND overquota=1);
>mail$> $_$
>mail-> LANGUAGE sql;
>--------------------------------
>overquota =1 означает что ящик переполнен.


зависит от того где стоит роутер, его синтаксис и правильно ли сделан запрос внутри условия.

посмотрите exim в debug режиме. у вас вообще есть обращение к этому роутеру? если да, то смотрите что возвращает. debug пишет всё довольно подробно и понятно.

вот у меня этот роутер в самом начале локальных роутеров

quota_router:
no_verify
driver = redirect
data = "${if eqi {${perl{quotacheck}}}{yes}{:fail:Mailbox overquota}{$local_part@$domain}}"
allow_fail

И работает так: процедурка на перле сверяется с imap сервером о квоте и если возвращает "yes" (превышена квота), то отправитель получает отлуп с сообщением Mailbox overquota. если с квотой всё в порядке, то идём в следующий роутер. Если пользовательский ящик не найден, то allow_fail разрешает идти дальше.


"Помогите разобраться с exim"
Отправлено Dimka , 01-Фев-07 14:08 
Спасибо, но уже по другому сделал - в ACL прописал:
deny    condition=${lookup pgsql{SELECT overquota_reject('${quote_pgsql:$local_part}', '${quote_pgsql:$domain}')}}
          message       =  Overquota in a mailbox

Где:
create function overquota_reject(text,text)
RETURNS text AS $_$ begin if exists(select * from mailbox
where localpart=$1 and domain=$2 and overquota=1) then return 'yes';
else return 'no'; end if; end; $_$ LANGUAGE plpgsql;

У меня ночью скрипт шерстит и пишет признак overquota=1 пользователю
при оверквоте. Другое дело, что если пользователь выкачает всю почту,
очистит почту, все равно до ночи ему никто письмо не пришлет.
Вот думаю как пропатчить вход в хорде на обнуление этого признака, ну
и соответственно как сделать обнуление признака при заборе через тот же
бат...

------------------------------------------------------------------
>зависит от того где стоит роутер, его синтаксис и правильно ли сделан
>запрос внутри условия.
>
>посмотрите exim в debug режиме. у вас вообще есть обращение к этому
>роутеру? если да, то смотрите что возвращает. debug пишет всё довольно
>подробно и понятно.
>
>вот у меня этот роутер в самом начале локальных роутеров
>
>quota_router:
>no_verify
>driver = redirect
>data = "${if eqi {${perl{quotacheck}}}{yes}{:fail:Mailbox overquota}{$local_part@$domain}}"
>allow_fail
>
>И работает так: процедурка на перле сверяется с imap сервером о квоте
>и если возвращает "yes" (превышена квота), то отправитель получает отлуп с
>сообщением Mailbox overquota. если с квотой всё в порядке, то идём
>в следующий роутер. Если пользовательский ящик не найден, то allow_fail разрешает
>идти дальше.