dnl dnl использование автоматического белого списка: dnl dnl NO - не использовать автоматический белый список dnl DBM - хранить данные автоматического белого списка в dbm файле dnl SQLITE - хранить данные автоматического белого списка в БД SQLite dnl MYSQL - хранить данные автоматического белого списка в БД MySQL dnl MEMCACHED - хранить данные автоматического белого списка в memcached dnl REDIS - хранить данные автоматического белого списка в memcached dnl define(`confAWL', `NO')dnl dnl dnl домены отправителей, на основании писем от которых будет формироваться белый список dnl define(`confAWL_SENDER_DOMAINS', `+local_domains')dnl dnl в ряде случаев (например, для транзитных рилеев, которые одновременно являются смартхостами) dnl можно указывать необходимость формирования белых списков и на основании писем от рилеемых доменов dnl define(`confAWL_SENDER_DOMAINS', `+local_domains : +relay_to_domains')dnl dnl dnl период жизни записи в кеше белого списка (в мин): dnl define(`confAWL_PERIOD', `60*24*2')dnl dnl dnl префикс записей при использовании MEMCACHED и REDIS в качестве dnl значений переменной confAWL: dnl define(`confAWL_RECORD_PREFIX', `awl:')dnl dnl dnl разделитель полей в ключе записи при использовании DBM, MEMCACHED и dnl REDIS в качестве значений переменной confAWL: dnl define(`confAWL_FIELD_DELIMITER', `<@>')dnl dnl dnl при DBM в confAWL: dnl dnl путь к DBM файлу dnl define(`confAWL_DBM_FILE', `confSPOOLDIR/db/awl.dbm')dnl dnl dnl ключ записи в AWL файле такой же, как в access-compat dnl значением записи является время жизни записи dnl dnl при SQLITE в confAWL: dnl dnl путь к SQLITE файлу dnl define(`confAWL_SQLITE_FILE', `confSPOOLDIR/db/awl.db')dnl dnl dnl define(`confAWL_SQLITE_CHECK', `SELECT expires FROM awl WHERE recipient="${quote_sqlite:${lc:$local_part@$domain}}" AND sender="${quote_sqlite:${lc:$sender_address}}" AND expires > $tod_epoch;')dnl dnl define(`confAWL_SQLITE_SELECT', `SELECT expires FROM awl WHERE recipient="${quote_sqlite:${lc:$sender_address}}" AND sender="${quote_sqlite:${lc:$local_part@$domain}}";')dnl dnl define(`confAWL_SQLITE_INSERT', `INSERT INTO awl (recipient, sender, expires) VALUES ("${quote_sqlite:${lc:$sender_address}}", "${quote_sqlite:${lc:$local_part@$domain}}", $tod_epoch+confAWL_PERIOD*60);')dnl dnl define(`confAWL_SQLITE_UPDATE', `UPDATE awl SET expires = $tod_epoch+confAWL_PERIOD*60 WHERE recipient="${quote_sqlite:${lc:$sender_address}}" AND sender="${quote_sqlite:${lc:$local_part@$domain}}";')dnl dnl define(`confAWL_SQLITE_DELETE', `DELETE FROM awl WHERE expires < strftime(\"%s\",\"now\");')dnl dnl dnl при MYSQL в confAWL: dnl dnl define(`confAWL_MYSQL_CHECK', `SELECT UNIX_TIMESTAMP(expires) FROM awl WHERE recipient="${quote_mysql:${lc:$local_part@$domain}}" AND sender="${quote_mysql:${lc:$sender_address}}" AND expires > NOW()')dnl dnl define(`confAWL_MYSQL_SELECT', `SELECT UNIX_TIMESTAMP(expires) FROM awl WHERE recipient="${quote_mysql:${lc:$sender_address}}" AND sender="${quote_mysql:${lc:$local_part@$domain}}"')dnl dnl define(`confAWL_MYSQL_INSERT', `INSERT INTO awl (recipient, sender, expires) VALUES ("${quote_mysql:${lc:$sender_address}}", "${quote_mysql:${lc:$local_part@$domain}}", ADDTIME(NOW(), SEC_TO_TIME(confAWL_PERIOD*60)))')dnl dnl define(`confAWL_MYSQL_UPDATE', `UPDATE awl SET expires = ADDTIME(NOW(), SEC_TO_TIME(confAWL_PERIOD*60)) WHERE recipient="${quote_mysql:${lc:$sender_address}}" AND sender="${quote_mysql:${lc:$local_part@$domain}}"')dnl dnl define(`confAWL_MYSQL_DELETE', `DELETE FROM awl WHERE expires < NOW()')dnl dnl ifelse(SECTION, `ACL_CHECK_RCPT', `dnl warn set acl_m0 = ifdef(`confWHITE_LIST_RELAYS', `ifelse(confWHITE_LIST_RELAYS, `NO', `', ` warn condition = ${if eq{${extract{white_list_relays}{$acl_m_wl_flag_msg}}}{1}{yes}{no}} set acl_m0 = skip ')') warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{${lc:$sender_address}}{${lc:$local_part@$domain}}{yes}{no}} set acl_m0 = skip ifelse_strstr(confAWL, `DBM', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup{${lc:$sender_address}confAWL_FIELD_DELIMITER${lc:$local_part@$domain}}dbm{confAWL_DBM_FILE}} condition = ${if <{$acl_m0}{$tod_epoch}{yes}{no}} set acl_m0 = ') dnl ifelse_strstr(confAWL, `DBM', `') ifelse_strstr(confAWL, `MEMCACHED', ` define(`confMEMCACHED_ENABLED', `YES')dnl warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${acl{acl_memcached_get}{confAWL_RECORD_PREFIX`'${lc:$sender_address}confAWL_FIELD_DELIMITER`'${lc:$local_part@$domain}}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{$acl_m0}{$tod_epoch}{yes}{no}} set acl_m0 = ') dnl ifelse(confAWL, `MEMCACHED', `') ifelse_strstr(confAWL, `REDIS', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${acl{acl_redis_get}{confAWL_RECORD_PREFIX`'${lc:$sender_address}confAWL_FIELD_DELIMITER`'${lc:$local_part@$domain}}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{$acl_m0}{$tod_epoch}{yes}{no}} set acl_m0 = ') dnl ifelse(confAWL, `REDIS', `') ifelse(confAWL, `MYSQL', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup mysql{confAWL_MYSQL_CHECK}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{$acl_m0}{$tod_epoch}{yes}{no}} set acl_m0 = ') dnl ifelse(confAWL, `MYSQL', `') ifelse(confAWL, `SQLITE', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup sqlite{confAWL_SQLITE_FILE confAWL_SQLITE_CHECK}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{$acl_m0}{$tod_epoch}{yes}{no}} set acl_m0 = ') dnl ifelse(confAWL, `SQLITE', `') warn condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{$acl_m0}{skip}{no}{yes}} log_message = $sender_address => $local_part@$domain autowhitelisted add_header = X-Spam-Info-Envelope: $sender_address => $local_part@$domain autowhitelisted on $primary_hostname\n accept condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{$acl_m0}{skip}{no}{yes}} set acl_m9 = white_list_compat=1 $acl_m9 set acl_m_wl_flag_msg = white_list_compat=1 $acl_m_wl_flag_msg acl = acl_check_rcpt_before_accept ') dnl ifelse(SECTION, `ACLS_CHECK_RCPT', `') ifelse(SECTION, `ACL_SMTP_RCPT_BEFORE_ACCEPT', `dnl warn set acl_m0 = no warn hosts = +relay_from_hosts set acl_m0 = yes warn authenticated = * set acl_m0 = yes warn sender_domains = confAWL_SENDER_DOMAINS condition = ${if eq{${lc:$sender_address_local_part}}{postmaster}{no}{yes}} condition = ${if eq{${lc:$local_part}}{postmaster}{no}{yes}} condition = ${if eq{$sender_address}{}{no}{yes}} condition = ${if eq{$h_Auto-Submitted:}{auto-replied}{no}{yes}} condition = $acl_m0 ifelse_strstr(confAWL, `DBM', ` set acl_m_status = ${perl{dbm_save}{confAWL_DBM_FILE}\ {${lc:$local_part@$domain}confAWL_FIELD_DELIMITER`'${lc:$sender_address}}\ {${eval:$tod_epoch+confAWL_PERIOD*60}}\ } condition = ${if eq{$acl_m_status}{}{no}{yes}} log_message = Could not store AWL record to confAWL_DBM_FILE: $acl_m_status ') dnl ifelse(confAWL, `DBM', `') ifelse_strstr(confAWL, `MEMCACHED', ` condition = ${if eq{\ ${acl{acl_memcached_set}\ {confAWL_RECORD_PREFIX`'${lc:$local_part@$domain}confAWL_FIELD_DELIMITER`'${lc:$sender_address}}\ {${eval:$tod_epoch+confAWL_PERIOD*60}}\ {${eval:confAWL_PERIOD*60}}\ }\ }{ok}{no}{yes}} log_message = Could not store AWL record to memcahed ') dnl ifelse(confAWL, `MEMCACHED', `') ifelse_strstr(confAWL, `REDIS', ` condition = ${if eq{\ ${acl{acl_redis_set}\ {confAWL_RECORD_PREFIX`'${lc:$local_part@$domain}confAWL_FIELD_DELIMITER`'${lc:$sender_address}}\ {${eval:$tod_epoch+confAWL_PERIOD*60}}\ }\ }{ok}{no}{yes}} log_message = Could not store AWL record to redis ') dnl ifelse(confAWL, `REDIS', `') ifelse_strstr(confAWL, `MYSQL', ` set acl_m1 = ${if eq{${lookup mysql{confAWL_MYSQL_SELECT}}}{}{\ ${lookup mysql{confAWL_MYSQL_INSERT}}\ }{\ ${lookup mysql{confAWL_MYSQL_UPDATE}}\ }} ') dnl ifelse(confAWL, `MYSQL', `') ifelse_strstr(confAWL, `SQLITE', ` set acl_m1 = ${if eq{${lookup sqlite{confAWL_SQLITE_FILE confAWL_SQLITE_SELECT}}}{}{\ ${lookup sqlite{confAWL_SQLITE_FILE confAWL_SQLITE_INSERT}}\ }{\ ${lookup sqlite{confAWL_SQLITE_FILE confAWL_SQLITE_UPDATE}}\ }} ') dnl ifelse(confAWL, `SQLITE', `') ') dnl ifelse(SECTION, `ACLS_ADDITIONAL', `')