dnl dnl использование серых списков с кешем в DBM dnl dnl использование серых списков с кешем в DBM dnl NO - не использовать серые списки dnl YES - использовать серые списки dnl LEARN - использовать серые списки в режиме обучения (аналог define(`confGREYLIST_DBM_BLOCKED', `0')) dnl BLOCK_FIRST_ONLY - использовать серые списки в режиме блокирования только первого письма dnl (аналог define(`confGREYLIST_DBM_BLOCKED', `-1')) dnl OPTIONAL - опциональный грейлистинг dnl define(`confGREYLIST_DBM', `NO')dnl dnl dnl путь к файлу DBM кеша dnl define(`confGREYLIST_DBM_CACHE', `/var/spool/exim/db/greylist.db')dnl dnl dnl время блокировки записи в "сером списке" в минутах dnl define(`confGREYLIST_DBM_BLOCKED', `55')dnl dnl dnl режим обучения: dnl define(`confGREYLIST_DBM_BLOCKED', `0')dnl dnl время блокировки записи в "сером списке" равно нулю dnl (принимаем все сообщения, производится лишь обучение кеша) dnl dnl режим обучения с блокированием лишь первой попытки отправки почты: dnl define(`confGREYLIST_DBM_BLOCKED', `-1')dnl dnl время блокировки записи в "сером списке" меньше нуля dnl (первое сообщение задерживается, остальные пропускаются) dnl dnl минимальное время жизни записи в "сером списке" в минутах dnl define(`confGREYLIST_DBM_RECORD_EXPIRE_MIN', `300')dnl dnl dnl время жизни записи в "сером списке" в днях dnl define(`confGREYLIST_DBM_RECORD_EXPIRE', `36')dnl dnl dnl исключения из greylisting'а: dnl AUTH - исключения для аутентифицированных отправителей dnl FROM_<> - исключения для писем от пустого отправителя dnl FROM_POSTMASTER - исключения для писем от postmaster@ dnl TO_POSTMASTER - исключения для писем для postmaster@ dnl TO_ABUSE - исключения для писем для abuse@ dnl SPF_PASS - исключения для писем, успешно прошедших проверку соответствия хоста отправителя SPF записи домена отправителя dnl TLS_PASS - исключения для писем, при отправке которых использовался STARTTLS dnl define(`confGREYLIST_SKIP', `AUTH FROM_<> FROM_POSTMASTER TO_POSTMASTER TO_ABUSE') dnl dnl сообщение, возвращаемое клиенту при задержке почтового сообщения dnl define(`confGREYLIST_MESSAGE', `Message delayed as part of spam avoidance measure')dnl dnl define(`confGREYLIST_MESSAGE', `System too busy. Please try again later')dnl dnl define(`confGREYLIST_MESSAGE', `Temporary local problem - please try later')dnl dnl dnl домены получателей, проверяемые по серым спискам, перечисляются в domains-greylist dnl хосты и сети, исключаемые из проверки по серым спискам, перечисляются в skip_greylist_relays dnl списки отправителей, исключаемых из проверки по серым спискам, перечисляются в файле skip_greylist_senders dnl список указывается в виде: dnl domain : addr1 : addr2 : addr3 dnl пример: dnl zuper.domain.com : user : info : admin dnl списки отправителей, исключаемых из проверки по серым спискам, перечисляются в файле skip_greylist_recipients dnl список указывается в виде: dnl domain : addr1 : addr2 : addr3 dnl пример: dnl zuper.domain.com : user : info : admin dnl триплеты адрес_рилея/адрес_отправителя/адрес_получателя, исключаемые из проверки по серым спискам, dnl перечисляются в файле skip_greylist в виде: dnl A.B.C.D|sender@domain1.tld|recipient@domain2.tld dnl пример: dnl 113.130.15.19|corvax@test.org.ua|test@local.domain dnl dnl страны, сети которых будут исключены из skip_greylist_relays dnl define(`confGREYLIST_DBM_COUNTRIES', `ar br cl cn co hk jp kr mx ng pe ph th tw')dnl dnl команда получения списка сетей по странам dnl define(`confGREYLIST_DBM_COUNTRIES_SYNC', `rsync -avz rsync://rsync.blackholes.us/zones/countries/${COUNTRY}.txt ../countries/${COUNTRY}.txt')dnl dnl dnl количество баллов, при которых письмо задерживается (применяется при define(`confGREYLIST_DBM', `OPTIONAL')) dnl define(`confGREYLIST_DBM_BLOCKED_OPTIONAL', `10')dnl dnl dnl путь к файлу динамического серого списка: dnl define(`confGREYLIST_DBM_RELAYS', `/var/spool/exim/db/greylist_relays.db') dnl dnl внесение в исключения серого списка записи при отсылке письма из dnl локальной сети или от аутентифицированного отправителя dnl NO - не вносить исключающую запись dnl YES - вносить исключающую запись dnl define(`confGREYLIST_DBM_ADDR_PRELOAD', `NO') dnl запись вносится в исключения на confGREYLIST_DBM_ADDR_PRELOAD_TTL минут dnl define(`confGREYLIST_DBM_ADDR_PRELOAD_TTL',`240') dnl dnl ############################################## dnl dnl списки сетей для принудительного greylistng'а при использовании опционального greylistng'а dnl NO - не проводить проверку dnl WARN - вывода по умолчанию в лог файл предупреждения dnl GREYLIST:XX - добавить XX баллов к счетчику опционального greylisting'а dnl define(`confCHECK_RELAY_GREYLIST', `WARN GREYLIST:confGREYLIST_DBM_BLOCKED_OPTIONAL')dnl dnl dnl действия WARN, GREYLIST:XX можно указывать через пробел dnl dnl списки хостов и сетей для опционального greylisting'а можно указывать dnl в виде A записей и номеров сетей в виде CIDR в файле CONFDIR/access-relay-greylist dnl dnl confCHECK_RELAY_GREYLIST используется только при использовании dnl confGREYLIST_DBM, равном `OPTIONAL' dnl ifdef(`confGREYLIST_MESSAGE', `dnl ifelse(len(X`'confGREYLIST_MESSAGE), `1', `dnl define(`confGREYLIST_MESSAGE', `Temporary local problem - please try later')dnl ')', `dnl define(`confGREYLIST_MESSAGE', `Temporary local problem - please try later')dnl ') ifelse(confGREYLIST_DBM, `LEARN', ` define(`confGREYLIST_DBM_BLOCKED', `0') ') ifelse(confGREYLIST_DBM, `BLOCK_FIRST_ONLY', ` define(`confGREYLIST_DBM_BLOCKED', `-1') ') ifelse(SECTION, `MAIN', `dnl dnl domainlist greylist_domains = lsearch;CONFDIR/domains-greylist hostlist skip_greylist_hosts = CONFDIR/skip_greylist_relays dnl ifelse(confGREYLIST_DBM, `OPTIONAL', ` hostlist greylist_hosts = CONFDIR/access-relay-greylist ') dnl ifelse(confGREYLIST_DBM, `OPTIONAL', `') dnl ') dnl ifelse(SECTION, `MAIN', `') ifelse(SECTION, `ACL_CHECK_RCPT_TOP', `dnl # обнуляем счетчик баллов для опционального грейлистинга warn set acl_c8 = scores=0 log_message= ') dnl ifelse(SECTION, `ACL_CHECK_RCPT_TOP', `') ifelse(SECTION, `ACL_CHECK_RCPT_MIDDLE', `dnl dnl ifelse(confGREYLIST_DBM_ADDR_PRELOAD, `YES', `dnl warn set acl_m1 = no hosts = +relay_from_hosts set acl_m1 = yes warn authenticated = * set acl_m1 = yes warn condition = $acl_m1 condition = ${if eq{$acl_m0}{accept}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {0.0.0.0|$local_part@$domain|$sender_address}\ {\ block_expires=$tod_epoch \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_ADDR_PRELOAD_TTL*60} \ blocked_count=0 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} ')dnl dnl ') dnl ifelse(SECTION, `ACL_CHECK_RCPT_MIDDLE', `') ifelse(SECTION, `ACLS_ADDITIONAL', `dnl ifelse(confGREYLIST_DBM, `OPTIONAL', ` ifdef(`confGREYLIST_DATETIME', ` FEATURE(`greylist-datetime') ') dnl ifdef(`confGREYLIST_DATETIME', `') define(`confGREYLIST_RELAYS', `NO') ifelse_strstr(confCHECK_MESSAGE_ID, `GREYLIST', `define(`confGREYLIST_RELAYS', `YES')') ifelse_strstr(confSPAMASSASSIN_ACTION, `GREYLIST', `define(`confGREYLIST_RELAYS', `YES')') ifelse(confGREYLIST_RELAYS, `YES', `FEATURE(`greylist-relays')') ') dnl ifelse(confGREYLIST_DBM, `OPTIONAL', `') ') dnl ifelse(SECTION, `ACLS_ADDITIONAL', `') ifelse(SECTION, `ACL_CHECK_RCPT', `dnl # Использование серых списков с кешем в DBM ifelse(confGREYLIST_DBM, `OPTIONAL', ` ifdef(`confGREYLIST_DATETIME', ` FEATURE(`greylist-datetime') ') ifelse_strstr(confCHECK_MESSAGE_ID, `GREYLIST', ` FEATURE(`greylist-relays') ') ') dnl ifelse(confGREYLIST_DBM, `OPTIONAL', `') # определяем необходимость использования "серого списка" warn set acl_m0 = no_skip warn ! domains = +greylist_domains : +local_domains set acl_m0 = skip ifelse(confGREYLIST_DBM, `OPTIONAL', `dnl set acl_m15 = ${acl_m15}\t\ skip optional greylist for non greylisted domain\n ') dnl ifelse(confGREYLIST_DBM, `OPTIONAL', `') ifelse_strstr(confGREYLIST_SKIP, `AUTH', `dnl warn authenticated = * set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist for authenticated sender\n ')dnl ifelse_strstr(confGREYLIST_SKIP, `AUTH', `') warn hosts = +skip_greylist_hosts : +relay_from_hosts set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist for +skip_greylist_hosts or +relay_from_hosts\n ifelse_strstr(confGREYLIST_SKIP, `TO_POSTMASTER', `dnl warn condition = ${if eq{$local_part}{postmaster}{yes}{no}} set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist for postmaster address\n ')dnl ifelse_strstr(confGREYLIST_SKIP, `TO_POSTMASTER', `') ifelse_strstr(confGREYLIST_SKIP, `TO_ABUSE', `dnl warn condition = ${if eq{$local_part}{abuse}{yes}{no}} set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist for abuse address\n ')dnl ifelse_strstr(confGREYLIST_SKIP, `TO_ABUSE', `') ifelse_strstr(confGREYLIST_SKIP, `<>', `dnl warn condition = ${if eq{$sender_address_local_part}{}{yes}{no}} set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist for empty sender address\n ')dnl ifelse_strstr(confGREYLIST_SKIP, `<>', `') ifelse_strstr(confGREYLIST_SKIP, `FROM_POSTMASTER', `dnl warn condition = ${if eq{$sender_address_local_part}{postmaster}{yes}{no}} set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist for postmaster sender address local part\n ')dnl ifelse_strstr(confGREYLIST_SKIP, `FROM_POSTMASTER', `') warn condition = ${lookup{$sender_host_address|$sender_address|$local_part@$domain}\ lsearch{CONFDIR/skip_greylist}{yes}{no}} set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist by triplet of sender host address, sender address and recipient address\n warn recipients = @@wildlsearch;CONFDIR/skip_greylist_recipients set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist by recipient address\n warn senders = @@wildlsearch;CONFDIR/skip_greylist_senders set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist sender address\n ifelse_strstr(confGREYLIST_SKIP, `SPF_PASS', ` ifdef(`confSPF2', `ifelse(confSPF2, `NO', `', ` warn acl = acl_spf_pass condition = ${if eq{$acl_m_spf_result}{pass}{yes}{no}} set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist for spf passed address\n ')')dnl ifdef(`confSPF2', `ifelse(confSPF2, `NO', `dnl', `')') ')dnl ifelse_strstr(confGREYLIST_SKIP, `SPF_PASS', `') ifelse_strstr(confGREYLIST_SKIP, `TLS_PASS', `dnl warn encrypted = * set acl_m0 = skip set acl_m15 = ${acl_m15}\t\ skip greylist for encrypted message\n ')dnl ifelse_strstr(confGREYLIST_SKIP, `TLS_PASS', `') ifelse(confGREYLIST_DBM, `OPTIONAL', ` warn condition = ${if eq{$acl_m0}{no_skip}{yes}{no}} hosts = +greylist_hosts set acl_c8 = scores=${eval:${extract{scores}{$acl_c8}}+confGREYLIST_DBM_BLOCKED_OPTIONAL} \ log_message="${extract{log_message}{$acl_c8}} relay $sender_host_address greylisted;" set acl_m15 = ${acl_m15}\t\ greylist scores=confGREYLIST_DBM_BLOCKED_OPTIONAL\t\ relay $sender_host_address in +greylist_hosts\n warn condition = ${if eq{$acl_m0}{no_skip}{yes}{no}} set acl_m0 = ${if <{${extract{scores}{$acl_c8}}}{confGREYLIST_DBM_BLOCKED_OPTIONAL}{skip}{no_skip}} ') # если использовать серый список необходимо, # ищем запись о рилее/отправителе/получателе в "сером списке" ifelse(confGREYLIST_DBM_ADDR_PRELOAD, `YES', `dnl warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} set acl_m0 = ${lookup{0.0.0.0|$sender_address|$local_part@$domain}\ dbm{confGREYLIST_DBM_CACHE}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{${extract{record_expires}{$acl_m0}}}{$tod_epoch}{yes}{no}} set acl_m0 = warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup{$sender_host_address|$sender_address|$local_part@$domain}\ dbm{confGREYLIST_DBM_CACHE}} ', `dnl warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} set acl_m0 = ${lookup{$sender_host_address|$sender_address|$local_part@$domain}\ dbm{confGREYLIST_DBM_CACHE}} ')dnl ifdef(`confGREYLIST_DBM_BLOCKED', `ifelse(eval(confGREYLIST_DBM_BLOCKED > 0), `1', `dnl # время блокировки записи в "сером списке" больше нуля # если запись в "сером списке" не найдена, создаем ее defer condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch+confGREYLIST_DBM_BLOCKED*60} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE ifelse(confGREYLIST_DBM, `OPTIONAL', ` log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain; reason:${extract{log_message}{$acl_c8}} ',` 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}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch+confGREYLIST_DBM_BLOCKED*60} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE 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}{confGREYLIST_DBM_CACHE}\ {$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 = confGREYLIST_MESSAGE ifelse(confGREYLIST_DBM, `OPTIONAL', ` log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain; reason:${extract{log_message}{$acl_c8}} ',` 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}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE*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}} set acl_m15 = ${acl_m15}\t\ skip greylist: blocking time have expired but record TTL does not\n ')') dnl ifdef(`confGREYLIST_DBM_BLOCKED', `ifelse(eval(confGREYLIST_DBM_BLOCKED == 0), `1', `dnl # время блокировки записи в "сером списке" равно нулю # (принимаем все сообщения, производится лишь обучение кеша) # если запись в "сером списке не найдена, создаем ее warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} # если запись в "сером списке найдена, но истек record_expires warn 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}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} # если запись в "сером списке найдена и не истек record_expires warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE*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}} ')') dnl ifdef(`confGREYLIST_DBM_BLOCKED', `ifelse(eval(confGREYLIST_DBM_BLOCKED < 0), `1', `dnl # время блокировки записи в "сером списке" меньше нуля # (первое сообщение задерживается, остальные пропускаются) # если запись в "сером списке не найдена, создаем ее defer condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE ifelse(confGREYLIST_DBM, `OPTIONAL', ` log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain; reason:${extract{log_message}{$acl_c8}} ',` 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}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE ifelse(confGREYLIST_DBM, `OPTIONAL', ` log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain; reason:${extract{log_message}{$acl_c8}} ',` log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain ') # если запись в "сером списке найдена и record_expires не истек warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXPIRE*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}} ')') ')