Всем привет,хочу вот такой конструкцией отмести все письма на ящик, у которого превышен лимит
во время 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 означает что ящик переполнен.
>Всем привет,
>
>хочу вот такой конструкцией отмести все письма на ящик, у которого превышен
>лимит
>во время 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 разрешает идти дальше.
Спасибо, но уже по другому сделал - в 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 разрешает
>идти дальше.