dnl dnl Проверка комбинации адреса хоста отправителя, адресов отправителя и получателя dnl dnl NO - не проводить проверку dnl REJECT - возврат клиенту кода 5xx dnl REJECT_ALL - отказ в приеме письма для всех получателей dnl QUARANTINE - принять письмо с сохранением в карантин без доставки получателям dnl QUARANTINE_OTHER - при отказе в приеме письма текущему получателю и наличии других получателей dnl письмо доставляется в карантин без доставки этим остальным получателям dnl DEFER - возврат клиенту кода 451 dnl WARN - вывод в лог файл предупреждения dnl GREYLIST:XX - добавить XX баллов к счетчику опционального грейлистинга dnl REJECT:XX - добавить XX баллов к счетчику опционального reject'а dnl DELAY:XX - задержка XX секунд перед ответом на RCPT TO dnl define(`confCHECK_ACCESS_COMPAT_RELAY', `NO')dnl dnl dnl место хранения списков доступа dnl TEXT - хранение списков доступа в access-compat-relay dnl DBM - хранение списков доступа в dbm файле dnl SQLITE - хранение списков доступа в БД SQLite dnl MYSQL - хранение списков доступа в БД MySQL dnl define(`confCHECK_ACCESS_COMPAT_RELAY_BACKEND', `TEXT')dnl dnl dnl при TEXT в confCHECK_ACCESS_COMPAT_RELAY_BACKEND: dnl dnl комбинации адресов отправителей и получателей указываются в файле CONFDIR/access-compat-relay dnl в виде: dnl sender_host_address<@>sender_mailbox@sender.domain<@>rcpt_mailbox@rcpt.domain : действие : сообщение : сообщение в лог файл dnl sender_host_name<@>sender_mailbox@sender.domain<@>rcpt_mailbox@rcpt.domain : действие : сообщение : сообщение в лог файл dnl sender_host_address<@>sender_mailbox@sender.domain<@> : действие : сообщение : сообщение в лог файл dnl dnl в качестве "действия" могут быть использованы: dnl ok - принимать сообщения с данной парой mail from и rcpt to dnl whitelist - исключить из проверок пары адресов отправителя и получателя dnl warn - выдача предупреждения в лог файл и в заголовки письма dnl и добавление в заголовки сообщения поле X-Warn-Compat-Relay dnl текст сообщения об ошибке может быть указан через двоеточие dnl deny или reject - отказ в приеме сообщения dnl reject_all - отказ в приеме письма для всех получателей dnl quarantine - принять письмо с сохранением в карантин без доставки получателям dnl quarantine_other - при отказе в приеме письма текущему получателю при наличии других получателей dnl письмо доставляется в карантин без доставки этим другим получателям dnl drop - отказ в приеме сообщения с обрывом соединения dnl discard - прием письма без доставки получателю dnl defer - возврат временной ошибки отправителю dnl greylist=xx - добавление xx баллов к счетчику опционального greylisting'а dnl greylisting=xx - синоним greylist=xx dnl reject=yy - добавление yy баллов к счетчику опционального reject'а dnl deny=yy - синоним reject=yy dnl delay=zz - задержка на zz секунд перед продолжением обработки сообщения dnl pause=zz - синоним delay=zz dnl submit_mysql - занесение записи о хосте в базу MySQL (только в enterprise версии) dnl submit_sqlite - занесение записи о хосте в базу SQLite (только в enterprise версии) dnl submit_rbl - занесение записи о хосте в DNSBL (только в enterprise версии) dnl dnl если в файле CONFDIR/access-compat-relay будет отсутствовать поле "действие", dnl то будет выполнено действие по умолчанию из переменно confCHECK_ACCESS_COMPAT_RELAY dnl поле "сообщение" может отсутствовать dnl dnl допустимо использование регулярных выражений: dnl \N^.+<@><@>(hostmaster|ftpmaster)@rcpt\.domain$\N : deny : Null sender rejected. Thist is incoming address only. dnl dnl если доставка производится в unix mailbox'ы, то возможно указание dnl только почтового ящика в качестве адреса получателя, если домен dnl получателя входит в список локальных доменов dnl dnl при DBM в confCHECK_ACCESS_COMPAT_RELAY_BACKEND: dnl dnl путь к DBM файлу dnl define(`confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE', `confSPOOLDIR/db/access-compat-relay.dbm')dnl dnl ключ записи DBM файла указывается в виде: dnl адрес_отправителя<@>адрес_получателя dnl значение записи DBM файла указывается в виде: dnl expires="время в unixtime" action="действие" message="сообщение smtp клиенту" log_message="сообщение в файл протокола" dnl поле expires может отсуствовать, оно может использоваться для автоматически формируемых временных white lists dnl dnl при SQLITE в confCHECK_ACCESS_COMPAT_RELAY_BACKEND: dnl dnl путь к файлу sqlite dnl define(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_FILE', `confSPOOLDIR/db/access_list_relay.db')dnl dnl запрос к БД SQLite dnl define(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY', `SELECT action FROM access_list WHERE sender_host_address="${quote_sqlite:$sender_host_address}" AND recipient="${quote_sqlite:$local_part@$domain}" AND sender="${quote_sqlite:$sender_address}"')dnl dnl второй запрос к БД SQLite (опциональный) dnl define(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY2', `SELECT action FROM access_list WHERE sender_host_name="${quote_sqlite:$sender_host_name}" AND recipient="${quote_sqlite:$local_part@$domain}" AND sender="${quote_sqlite:$sender_address}"')dnl dnl третий запрос к БД SQLite (опциональный) dnl define(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY3', `SELECT action FROM access_list WHERE sender_host_address="${quote_sqlite:$sender_host_address}" AND sender="${quote_sqlite:$sender_address}"')dnl dnl четвертый запрос к БД SQLite (опциональный) dnl define(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY4', `SELECT action FROM access_list WHERE sender_host_name="${quote_sqlite:$sender_host_name}" AND sender="${quote_sqlite:$sender_address}"')dnl dnl dnl при MYSQL в confCHECK_ACCESS_COMPAT_RELAY_BACKEND: dnl dnl запрос к БД MySQL dnl define(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY', `SELECT action FROM access_list WHERE sender_host_address="${quote_mysql:$sender_host_address}" AND recipient="${quote_mysql:$local_part@$domain}" AND sender="${quote_mysql:$sender_address}"')dnl dnl второй запрос к БД MySQL (опциональный) dnl define(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY2', `SELECT action FROM access_list WHERE sender_host_name="${quote_mysql:$sender_host_name}" AND recipient="${quote_mysql:$local_part@$domain}" AND sender="${quote_mysql:$sender_address}"')dnl dnl третий запрос к БД MySQL (опциональный) dnl define(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY3', `SELECT action FROM access_list WHERE sender_host_address="${quote_mysql:$sender_host_address}" AND sender="${quote_mysql:$sender_address}"')dnl dnl четвертый запрос к БД MySQL (опциональный) dnl define(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY4', `SELECT action FROM access_list WHERE sender_host_name="${quote_mysql:$sender_host_name}" AND sender="${quote_mysql:$sender_address}"')dnl dnl dnl ############################################## dnl dnl Проверка комбинации страны хоста отправителя, адресов отправителя и получателя dnl NO - не проводить проверку dnl YES - проводить проверку dnl define(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY', `NO')dnl dnl dnl проверка комбинации страны хоста отправителя и адресов отправителя и dnl получателя является расширением проверки комбинации адреса хоста dnl отправителя, адресов отправителя и получателя. dnl т. е. confCHECK_ACCESS_COMPAT_RELAY_COUNTRY можно использовать только dnl вместе с confCHECK_ACCESS_COMPAT_RELAY. dnl dnl отличием confCHECK_ACCESS_COMPAT_RELAY_COUNTRY от dnl confCHECK_ACCESS_COMPAT_RELAY является лишь то, что вместе адреса dnl хоста отправителя или имени хоста отправителя можно указывать страну dnl хоста отправителя в виде двубуквенного кода. dnl dnl при этом запрос в access-compay-relay с комбинацией страны хоста и dnl адресов отправителя и получателя производится только в случае, если в dnl данном файле не найдены комбинации адреса хоста отправителя с dnl адресами отправителя и получателя или имени хоста отправителя с dnl адресами отправителя и получателя. dnl dnl в файле CONFDIR/access-compat-relay можно указать необходимые dnl действия для комбинации страны хоста отправителя, адреса dnl отправителя и адреса получателя в виде: dnl NN<@>sender_mailbox@sender.domain<@>rcpt_mailbox@rcpt.domain : действие : сообщение : сообщение в лог файл dnl dnl где dnl NN - двубуквенный код страны dnl действие - действие, применяемое к письму dnl сообщение - ответ SMTP клиенту (может отсутствовать) dnl сообщение в лог файл - сообщение в лог файл MTA (может отсутствовать) dnl dnl возможные значения для действия такие же, как при проверке кобминации dnl хоста отправителя и адресов отправителя и получателя (переменная dnl confCHECK_ACCESS_COMPAT_RELAY). dnl dnl ответ SMTP клиенту будет использован в случае указания reject/deny dnl или defer в качестве действия. если текст ответа не будет указан, dnl будет использован текст сообщения об ошибке по умолчанию dnl dnl если действие не будет указано, будет использоваться действие, dnl указанное в переменной confCHECK_ACCESS_COMPAT_RELAY dnl dnl пример: dnl CN<@>sender@ukr.net<@>recipient@local.domain.tld : ok dnl \N^CN<@>.+@ukr.net<@>.+@local\.domain\.tld$\N : warn pause=10 greylist=10 : Message with ukr.net sender address domain from China dnl \N^CN<@>.+@ukr.net<@>$\N : deny : Access denied : Message with ukr.net sender address domain from China dnl dnl в примере ко всем письмам из домена ukr.net, отправленным из Китая для пользователей домена local.domain.tld, будут применены пауза и "серые списки". dnl прием писем из домена ukr.net, отправленных из Китая для пользователей других доменов, будет отвергнут. dnl исключение сделано для пары адресов отправителя и получателя sender@ukr.net и recipient@local.domain.tld dnl dnl механизм определения страны по IP адресу можно указать в переменной confIP2COUNTRY_BACKEND dnl dnl при SQLITE в confCHECK_ACCESS_COMPAT_RELAY_BACKEND: dnl запрос к БД SQLite dnl define(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_SQLITE_QUERY', `SELECT action FROM access_list WHERE country="$acl_m_sender_host_address_country" AND recipient="${quote_sqlite:$local_part@$domain}" AND sender="${quote_sqlite:$sender_address}"')dnl dnl второй запрос к БД SQLite (опциональный) dnl define(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_SQLITE_QUERY2', `SELECT action FROM access_list WHERE country="$acl_m_sender_host_address_country" AND sender="${quote_sqlite:$sender_address}"')dnl dnl dnl при MYSQL в confCHECK_ACCESS_COMPAT_RELAY_BACKEND: dnl запрос к БД MySQL dnl define(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_MYSQL_QUERY', `SELECT action FROM access_list WHERE country="$acl_m_sender_host_address_country" AND recipient="${quote_mysql:$local_part@$domain}" AND sender="${quote_mysql:$sender_address}"')dnl dnl второй запрос к БД MySQL (опциональный) dnl define(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_MYSQL_QUERY2', `SELECT action FROM access_list WHERE country="$acl_m_sender_host_address_country" AND sender="${quote_mysql:$sender_address}"')dnl dnl # Проверка комбинации хоста отправителя и адресов отправителя и получателя warn set acl_m1 = set acl_m0 = ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `', `define(`confIP2COUNTRY', `YES')') ifdef(`confRECIPIENTS_SPAM_FRIENDS', `ifelse(confRECIPIENTS_SPAM_FRIENDS, `NO', `', `dnl warn condition = ${if or{\ # {eq{${extract{submitted}{$acl_m9}}}{1}}\ # {eq{${extract{relay_from_hosts}{$acl_m9}}}{1}}\ # {eq{${extract{authenticated}{$acl_m9}}}{1}}\ {eq{${extract{abuse_or_postmaster}{$acl_m9}}}{1}}\ # {eq{${extract{white_list_relays}{$acl_m9}}}{1}}\ # {eq{${extract{white_list_senders}{$acl_m9}}}{1}}\ # {eq{${extract{white_list_compat}{$acl_m9}}}{1}}\ }{yes}{no}} set acl_m0 = skip ')') dnl ifdef(`confRECIPIENTS_SPAM_FRIENDS', `ifelse(confRECIPIENTS_SPAM_FRIENDS, `NO', `')') ifdef(`confRECIPIENTS_SPAM_HATERS', `ifelse(confRECIPIENTS_SPAM_HATERS, `NO', `', `dnl warn condition = ${if or{\ {eq{${extract{spam_hater}{$acl_m9}}}{1}}\ }{yes}{no}} set acl_m0 = ')') dnl ifdef(`confRECIPIENTS_SPAM_HATERS', `ifelse(confRECIPIENTS_SPAM_HATERS, `NO', `')') ifelse_strstr(confCHECK_ACCESS_COMPAT_RELAY_BACKEND, `DBM', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup{$sender_host_adress<@>$sender_address<@>$local_part@$domain}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}{\ ${if eq{$acl_c_sender_host_name}{}{}{\ ${lookup{$sender_host_name<@>$sender_address<@>$local_part@$domain}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}{\ }}\ }}\ }} ifelse_strstr(confDELIVERY_TO, `MBOX', `dnl warn condition = ${if eq{$acl_m0}{}{yes}{no}} domains = +local_domains set acl_m0 = ${lookup{$sender_host_adress<@>$sender_address<@>$local_part}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}{\ ${if eq{$acl_c_sender_host_name}{}{}{\ ${lookup{$sender_host_name<@>$sender_address<@>$local_part}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}{\ }}\ }}\ }} ') dnl ifelse_strstr(confDELIVERY_TO, `MBOX', `') warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup{$sender_host_adress<@>$sender_address<@>}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}{\ ${if eq{$acl_c_sender_host_name}{}{}{\ ${lookup{$sender_host_name<@>$sender_address<@>}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}{\ }}\ }}\ }} ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{}{yes}{no}} acl = acl_ip2country $sender_host_address set acl_m_sender_host_address_country = $acl_m_ip2country_result warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} set acl_m0 = ${lookup{$acl_m_sender_host_address_country<@>$sender_address<@>$local_part@$domain}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}} ifelse_strstr(confDELIVERY_TO, `MBOX', `dnl warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} domains = +local_domains set acl_m0 = ${lookup{$acl_m_sender_host_address_country<@>$sender_address<@>$local_part}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}} ') dnl ifelse_strstr(confDELIVERY_TO, `MBOX', `') warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} set acl_m0 = ${lookup{$acl_m_sender_host_address_country<@>$sender_address<@>}dbm{confCHECK_ACCESS_COMPAT_RELAY_DBM_FILE}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}} ') dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `') ') dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_BACKEND, `DBM', `') ifelse_strstr(confCHECK_ACCESS_COMPAT_RELAY_BACKEND, `SQLITE', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup sqlite{confCHECK_ACCESS_COMPAT_RELAY_SQLITE_FILE \ confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY \ }{EXPAND_VALUE}{\ ifdef(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY2', `dnl ${lookup sqlite{confCHECK_ACCESS_COMPAT_RELAY_SQLITE_FILE \ confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY2 \ }{EXPAND_VALUE}{\ ifdef(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY3', `dnl ${lookup sqlite{confCHECK_ACCESS_COMPAT_RELAY_SQLITE_FILE \ confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY3 \ }{EXPAND_VALUE}{\ ifdef(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY4', `dnl ${lookup sqlite{confCHECK_ACCESS_COMPAT_RELAY_SQLITE_FILE \ confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY4 \ }{EXPAND_VALUE}{\ }}\ ') dnl ifdef(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY4', `') }}\ ') dnl ifdef(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY3', `') }}\ ') dnl ifdef(`confCHECK_ACCESS_COMPAT_RELAY_SQLITE_QUERY2', `') }} ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{}{yes}{no}} acl = acl_ip2country $sender_host_address set acl_m_sender_host_address_country = $acl_m_ip2country_result warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} set acl_m0 = ${lookup sqlite{confCHECK_ACCESS_COMPAT_RELAY_SQLITE_FILE \ confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_SQLITE_QUERY \ }{EXPAND_VALUE}{\ ifdef(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_SQLITE_QUERY2', `dnl ${lookup sqlite{confCHECK_ACCESS_COMPAT_RELAY_SQLITE_FILE \ confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_SQLITE_QUERY2 \ }{EXPAND_VALUE}{\ }}\ ') dnl ifdef(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_SQLITE_QUERY2', `') }} ') dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `') ') dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_BACKEND, `SQLITE', `') ifelse_strstr(confCHECK_ACCESS_COMPAT_RELAY_BACKEND, `MYSQL', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup mysql{\ confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY \ }{EXPAND_VALUE}{\ ifdef(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY2', `dnl ${lookup mysql{\ confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY2 \ }{EXPAND_VALUE}{\ ifdef(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY3', `dnl ${lookup mysql{\ confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY3 \ }{EXPAND_VALUE}{\ ifdef(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY4', `dnl ${lookup mysql{\ confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY4 \ }{EXPAND_VALUE}{\ }}\ ') dnl ifdef(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY4', `') }}\ ') dnl ifdef(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY3', `') }}\ ') dnl ifdef(`confCHECK_ACCESS_COMPAT_RELAY_MYSQL_QUERY2', `') }} ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{}{yes}{no}} acl = acl_ip2country $sender_host_address set acl_m_sender_host_address_country = $acl_m_ip2country_result warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} set acl_m0 = ${lookup mysql{\ confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_MYSQL_QUERY \ }{EXPAND_VALUE}{\ ifdef(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_MYSQL_QUERY2', `dnl ${lookup mysql{\ confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_MYSQL_QUERY2 \ }{EXPAND_VALUE}{\ }}\ ') dnl ifdef(`confCHECK_ACCESS_COMPAT_RELAY_COUNTRY_MYSQL_QUERY2', `') }} ') dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `') ') dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_BACKEND, `MYSQL', `') ifelse_strstr(confCHECK_ACCESS_COMPAT_RELAY_BACKEND, `TEXT', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup{$sender_host_address<@>$sender_address<@>$local_part@$domain}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {\ ${if eq{$acl_c_sender_host_name}{}{}{\ ${lookup{$sender_host_name<@>$sender_address<@>$local_part@$domain}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}}\ }}\ }} ifelse_strstr(confDELIVERY_TO, `MBOX', `dnl warn condition = ${if eq{$acl_m0}{}{yes}{no}} domains = +local_domains set acl_m0 = ${lookup{$sender_host_address<@>$sender_address<@>$local_part}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {\ ${if eq{$acl_c_sender_host_name}{}{}{\ ${lookup{$sender_host_name<@>$sender_address<@>$local_part}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}}\ }}\ }} ') dnl ifelse_strstr(confDELIVERY_TO, `MBOX', `') warn condition = ${if eq{$acl_m0}{}{yes}{no}} set acl_m0 = ${lookup{$sender_host_address<@>$sender_address<@>}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {\ ${if eq{$acl_c_sender_host_name}{}{}{\ ${lookup{$sender_host_name<@>$sender_address<@>}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}}\ }}\ }}\ ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `', ` warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{}{yes}{no}} acl = acl_ip2country $sender_host_address set acl_m_sender_host_address_country = $acl_m_ip2country_result warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} set acl_m0 = ${lookup{$acl_m_sender_host_address_country<@>$sender_address<@>$local_part@$domain}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}} ifelse_strstr(confDELIVERY_TO, `MBOX', `dnl warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} domains = +local_domains set acl_m0 = ${lookup{$acl_m_sender_host_address_country<@>$sender_address<@>$local_part}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}} ') dnl ifelse_strstr(confDELIVERY_TO, `MBOX', `') warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} set acl_m0 = ${lookup{$acl_m_sender_host_address_country<@>$sender_address<@>}\ wildlsearch{CONFDIR/access-compat-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_COMPAT_RELAY}{EXPAND_VALUE}}}\ {}}\ ') dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `') ') dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_BACKEND, `TEXT', `') warn condition = ${if eq{$acl_m0}{}{no}{yes}} acl = acl_normalize_action "${extract{1}{:}{$acl_m0}}" set acl_m1 = ${sg{$acl_m_normalize_action_result }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} # message = $acl_m2 # log_message = $acl_m0 set acl_m2 = ${expand:${sg{${extract{2}{:}{$acl_m0}}}{\N^\s+\N}{}}} set acl_m2 = ${if eq{$acl_m2}{}{Access denied}{$acl_m2}} set acl_m0 = ${expand:${sg{${extract{3}{:}{$acl_m0}}}{\N^\s+\N}{}}} set acl_m_check_compat_relay_msg = ${if eq{$acl_m0}{}{}{: $acl_m0}} set acl_m0 = ${if eq{$acl_m0}{}{relay address and sender/recipient addresses pair blacklisted${if eq{$acl_m2}{}{}{: $acl_m2}}}{$acl_m0}} accept condition = ${if eq{${extract{whitelist}{$acl_m1}}}{}{no}{yes}} set acl_m9 = ${sg{$acl_m9}{\Nspam_hater=1\N}{}} 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 ifdef(`confENTERPRISE_USER', `dnl warn condition = ${if match{$acl_m1}{submit_mysql}{yes}{no}} ENTERPRISE(`mysql', `submit', `mail-rcpt', `blacklisted', `$sender_address|$local_part@$domain', `0') warn condition = ${if match{$acl_m1}{submit_sqlite}{yes}{no}} ENTERPRISE(`sqlite', `submit', `mail-rcpt', `blacklisted', `$sender_address|$local_part@$domain', `0') warn condition = ${if match{$acl_m1}{submit_rbl}{yes}{no}} dnl ENTERPRISE(`rbl', `update', `mx.org.ua', `mail-rcpt.rbl.mx.org.ua', `blacklisted', `$sender_address|$local_part@$domain') ENTERPRISE(`rbl', `submit', `mail-rcpt', `blacklisted', `$sender_address|$local_part@$domain') ')dnl # warn warn condition = ${if match{$acl_m1}{warn}{yes}{no}} log_message = $acl_m0 add_header = X-Warn-Compat-Relay: $acl_m2 # pause warn condition = ${if eq{${extract{pause}{$acl_m1}}}{}{no}{yes}} delay = ${extract{pause}{$acl_m1}}s set acl_m_spam_action = ${acl_m_spam_action}\t\ delay=${extract{pause}{$acl_m1}}s\t\t\ $acl_m0\n # quarantine_other warn condition = ${if eq{${extract{quarantine_other}{$acl_m1}}}{00}{yes}{no}} add_header = X-Quarantine-Compat-Relay: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain triple blacklisted${acl_m_check_compat_relay_msg} log_message = message will be quarantined for all other recipients: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain pair blacklisted${acl_m_check_compat_relay_msg} set acl_m_add_x_orig_rcpt = yes set acl_m_quarantined = $acl_m_quarantined envelope ifdef(`confRECIPIENTS_SPAM_HATERS', `ifelse(confRECIPIENTS_SPAM_HATERS, `NO', `', `dnl set acl_m9 = spam_hater=1 $acl_m9 set acl_m_wl_flag_msg = spam_hater=1 $acl_m_wl_flag_msg ')') dnl ifdef(`confRECIPIENTS_SPAM_HATERS', `ifelse(confRECIPIENTS_SPAM_HATERS, `NO', `')') # reject all warn condition = ${if eq{${extract{reject_all}{$acl_m1}}}{00}{yes}{no}} set acl_m16 = relay address $sender_host_address, sender address $sender_address and recipient address $local_part@$domain blacklisted; message rejected for all the recipients: $acl_m0\ |message rejected for all the recipients: ${expand:$acl_m2} log_message = message will be rejected for all other recipients${acl_m_check_compat_relay_msg} # quarantine and !reject # accept \ warn \ condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if or{\ {eq{${extract{reject}{$acl_m1}}}{00}}\ {eq{${extract{reject_all}{$acl_m1}}}{00}}\ }{no}{yes}} add_header = X-Quarantine-Compat-Relay: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain triple blacklisted${acl_m_check_compat_relay_msg} log_message = message will be quarantined: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain pair blacklisted${acl_m_check_compat_relay_msg} # set acl_m_skip_verify_recipient = yes set acl_m_add_x_orig_rcpt = yes # set acl_m_quarantined = $acl_m_quarantined envelope set acl_m_quarantined_per_rcpt = ${if eq{$acl_m_quarantined_per_rcpt}{}{}{$acl_m_quarantined_per_rcpt, }}$local_part@$domain set acl_m_check_rcpt_and_accept = yes ifdef(`confRECIPIENTS_SPAM_HATERS', `ifelse(confRECIPIENTS_SPAM_HATERS, `NO', `', `dnl set acl_m9 = spam_hater=1 $acl_m9 set acl_m_wl_flag_msg = spam_hater=1 $acl_m_wl_flag_msg ')') dnl ifdef(`confRECIPIENTS_SPAM_HATERS', `ifelse(confRECIPIENTS_SPAM_HATERS, `NO', `')') # quarantine and reject # accept \ warn \ condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if or{\ {eq{${extract{reject}{$acl_m1}}}{00}}\ {eq{${extract{reject_all}{$acl_m1}}}{00}}\ }{yes}{no}} log_message = message will be quarantined: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain pair blacklisted${acl_m_check_compat_relay_msg} # set acl_m_fakereject_per_rcpt = \ # message will be quarantined: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain triple blacklisted${acl_m_check_compat_relay_msg}\ # |X-Quarantine-Compat-Relay: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain triple blacklisted${acl_m_check_compat_relay_msg}\ # |${expand:$acl_m2} acl = acl_update_fakereject_per_rcpt \ "message will be quarantined: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain triple blacklisted${acl_m_check_compat_relay_msg}" \ "X-Quarantine-Compat-Relay: relay address $sender_host_address, sender address ${if eq{$sender_address}{}{<>}{$sender_address}} and recipient address $local_part@$domain triple blacklisted${acl_m_check_compat_relay_msg}" \ "${expand:$acl_m2}" # set acl_m_skip_verify_recipient = yes set acl_m_add_x_orig_rcpt = yes # set acl_m_quarantined = $acl_m_quarantined envelope set acl_m_quarantined_per_rcpt = ${if eq{$acl_m_quarantined_per_rcpt}{}{}{$acl_m_quarantined_per_rcpt, }}$local_part@$domain set acl_m_check_rcpt_and_accept = yes ifdef(`confRECIPIENTS_SPAM_HATERS', `ifelse(confRECIPIENTS_SPAM_HATERS, `NO', `', `dnl set acl_m9 = spam_hater=1 $acl_m9 set acl_m_wl_flag_msg = spam_hater=1 $acl_m_wl_flag_msg ')') dnl ifdef(`confRECIPIENTS_SPAM_HATERS', `ifelse(confRECIPIENTS_SPAM_HATERS, `NO', `')') # !quarantine and reject deny condition = ${if eq{$acl_m_check_rcpt_and_accept}{yes}{no}{yes}} condition = ${if or{\ {eq{${extract{reject}{$acl_m1}}}{00}}\ {eq{${extract{reject_all}{$acl_m1}}}{00}}\ }{yes}{no}} condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{no}{yes}} log_message = $acl_m0 message = ${expand:$acl_m2} defer condition = ${if eq{$acl_m_check_rcpt_and_accept}{yes}{no}{yes}} condition = ${if match{$acl_m1}{defer}{yes}{no}} log_message = $acl_m0 message = ${expand:$acl_m2} drop condition = ${if eq{$acl_m_check_rcpt_and_accept}{yes}{no}{yes}} condition = ${if match{$acl_m1}{drop}{yes}{no}} log_message = $acl_m0 message = ${expand:$acl_m2} discard condition = ${if eq{$acl_m_check_rcpt_and_accept}{yes}{no}{yes}} condition = ${if match{$acl_m1}{discard}{yes}{no}} log_message = $acl_m0 ifelse(confGREYLIST, `OPTIONAL', `dnl warn condition = ${if eq{$acl_m_check_rcpt_and_accept}{yes}{no}{yes}} condition = ${if eq{${extract{greylist}{$acl_m1}}}{}{no}{yes}} set acl_m_optional_greylist = \ scores=${eval:${extract{scores}{$acl_m_optional_greylist}}+${extract{greylist}{$acl_m1}}} \ log_message="${extract{log_message}{$acl_m_optional_greylist}} $acl_m0;" set acl_m_spam_action = ${acl_m_spam_action}\t\ greylist scores=${extract{greylist}{$acl_m1}}\t\ $acl_m0\n ') dnl ifelse(confGREYLIST, `OPTIONAL', `') ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `dnl', `dnl warn condition = ${if eq{$acl_m_check_rcpt_and_accept}{yes}{no}{yes}} condition = ${if eq{${extract{reject}{$acl_m1}}}{}{no}{yes}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{no}{yes}} set acl_m_optional_reject = \ scores=${eval:${extract{scores}{$acl_m_optional_reject}}+${extract{reject}{$acl_m1}}} \ log_message="${extract{log_message}{$acl_m_optional_reject}} $acl_m0;" set acl_m_spam_action = ${acl_m_spam_action}\t\ reject scores=${extract{reject}{$acl_m1}}\t\t\ $acl_m0\n ')') dnl ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `', `')')