# определяем необходимость использования "серого списка" warn set acl_m0 = skip domains = +local_domains ! authenticated = * ! hosts = +relay_from_hosts condition = ${if eq{$local_part}{postmaster}{no}{yes}} condition = ${if eq{$local_part}{abuse}{no}{yes}} condition = ${if eq{$sender_address_local_part}{postmaster}{no}{yes}} condition = ${if eq{$sender_address_local_part}{}{no}{yes}} ! recipients = @@lsearch;CONFDIR/skip_greylist_recipients ! senders = @@lsearch;CONFDIR/skip_greylist_senders set acl_m0 = no_skip # если использовать серый список необходимо, # ищем запись а рилее/отправителе/получателе в "сером списке" warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} set acl_m0 = ${lookup{$sender_host_address|$sender_address|$local_part@$domain}\ dbm{/var/spool/exim/db/greylist.dbm}} # добавляем ключ к первому значению # это связано с тем, что первая версия dbm_save к началу значения каждой записи добавляла дату и время warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} set acl_m0 = datetime=$acl_m0 # если запись в "сером списке не найдена, создаем ее defer condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{/var/spool/exim/db/greylist.dbm}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch+55*60} \ record_expires=${eval:$tod_epoch+36*24*60*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = Temporary local problem - please try later log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain # если запись в "сером списке найдена, но истек record_expires defer condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{${extract{record_expires}{$acl_m0}}}{$tod_epoch}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{/var/spool/exim/db/greylist.dbm}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch+55*60} \ record_expires=${eval:$tod_epoch+36*24*60*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = Temporary local problem - please try later log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain # если запись в "сером списке найдена, но не истек block_expires defer condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if >{${extract{block_expires}{$acl_m0}}}{$tod_epoch}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{/var/spool/exim/db/greylist.dbm}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${extract{record_expires}{$acl_m0}} \ blocked_count=${eval:${extract{blocked_count}{$acl_m0}}+1} \ passed_count=${extract{passed_count}{$acl_m0}} \ aborted_count=${extract{aborted_count}{$acl_m0}} \ origin_type=${extract{origin_type}{$acl_m0}} \ create_time=${extract{create_time}{$acl_m0}} \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = Temporary local problem - please try later log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain # если запись в "сером списке найдена, block_expires истек, а record_expires не истек warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{\ ${perl{dbm_save}{/var/spool/exim/db/greylist.dbm}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${eval:$tod_epoch+36*24*60*60} \ blocked_count=${extract{blocked_count}{$acl_m0}} \ passed_count=${eval:${extract{passed_count}{$acl_m0}}+1} \ aborted_count=${extract{aborted_count}{$acl_m0}} \ origin_type=${extract{origin_type}{$acl_m0}} \ create_time=${extract{create_time}{$acl_m0}} \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}}