была проверка по relay_ip, стало - relay_ip+sender+recipient
за время блокировки отвечает
Код: Выделить всё
interval 5 minuteвот что получилось:
Код: Выделить всё
######################################################################################
# Tables
######################################################################################
create table `greylist_ink` (
`id` bigint not null primary key auto_increment
,`relay_ip` varchar(15) not null
,`sender` varchar(64) not null
,`recipient` varchar(64) not null
,`ctime` datetime not null
,`mtime` timestamp not null default CURRENT_TIMESTAMP()
,`bcount` integer not null default '1'
, unique (`relay_ip`,`sender`,`recipient`)) ENGINE=MYISAM;
CREATE VIEW expire_time_ink AS
select
`id` AS `id`
,(case when (now() > (`ctime` + interval 5 minute)) then 'accept' else 'deferred' end) AS `result`
,`relay_ip` AS `relay_ip`
,`sender` AS `sender`
,`recipient` AS `recipient`
from
`greylist_ink`;Код: Выделить всё
#########################################################################################
# Greylisting server config
#########################################################################################
GREYLIST_ENABLED_GREY = yes
.ifdef GREYLIST_ENABLED_GREY
GREYLIST_TEST = SELECT result, id FROM expire_time_ink WHERE \
`relay_ip` = '${quote_mysql:$sender_host_address}' AND \
`sender` = '${quote_mysql:$sender_address}' AND \
`recipient` = '${quote_mysql:$local_part@$domain}' ORDER BY result DESC LIMIT 1
GREYLIST_ADD = REPLACE INTO greylist_ink (relay_ip, sender, recipient, ctime) VALUES \
('${quote_mysql:$sender_host_address}', \
'${quote_mysql:$sender_address}', \
'${quote_mysql:$local_part@$domain}',now())
GREYLIST_DEFER_HIT = UPDATE greylist_ink SET bcount=bcount+1, mtime=now() WHERE id = $acl_m9
GREYLIST_OK_COUNT = UPDATE greylist_ink SET bcount=0, mtime=now() WHERE id = $acl_m9
.endifКод: Выделить всё
##########################################################################################
# Greylist Access control list
##########################################################################################
.ifdef GREYLIST_ENABLED_GREY
greylist_acl:
warn set acl_m8 = ${lookup mysql{GREYLIST_TEST}{$value}{result=unknown}}
set acl_m9 = ${extract{id}{$acl_m8}{$value}{-1}}
set acl_m8 = ${extract{result}{$acl_m8}{$value}{unknown}}
accept condition = ${if eq {$acl_m8} {unknown} {1}}
condition = ${lookup mysql{GREYLIST_ADD}{yes}{no}}
accept condition = ${if eq{$acl_m8} {deferred} {1}}
condition = ${lookup mysql{GREYLIST_DEFER_HIT}{yes}{yes}}
warn condition = ${lookup mysql{GREYLIST_OK_COUNT}}
deny
.endifКод: Выделить всё
.ifdef GREYLIST_ENABLED_GREY
defer hosts = !+relay_from_hosts
!authenticated= *
!senders = : postmaster@*
acl = greylist_acl
message = GreyListed: please try again later after 5 minutes
.endif$user $passwd $db заменить на своё
Код: Выделить всё
1 3 * * * /usr/local/bin/mysql -u $user -p$passwd $db -e 'delete from greylist_ink where bcount>0;'
1 3 * * * /usr/local/bin/mysql -u user -p$passwd $db -e 'delete from greylist_ink where now()>(`mtime` + interval 2 month);'