dnl dnl Поддержка spamassassin dnl dnl ВНИМАНИЕ!!! dnl при использовании spamassassin необходимо включить использование dnl системного фильтра (см. параметр confSYSTEM_FILTER) dnl dnl команда получения названия и версии демона spamassassin dnl define(`confSPAMASSASSIN_NAME_VERSION', `spamd -V 2>/dev/null | head -n 1 | perl -p -e "chomp"') dnl define(`confSPAMASSASSIN_NAME_VERSION_DEFAULT', `SpamAssassin Server') dnl dnl параметры подключения к spamd dnl define(`confSPAMASSASSIN_SPAMD_ADDRESS', `127.0.0.1 783') dnl dnl пользователь по умолчанию, от имени которого будут выполняться dnl запросы к spamd dnl define(`confSPAMASSASSIN_USER', `spamd')dnl dnl dnl имя файла, в котором указаны пользователи, от имени которых будут выполняться запросы к spamd, dnl в зависимости от адреса получателя dnl NO - не использовать файл с именами пользователей для запросов к spamd dnl YES - использовать файл sa-users с именами пользователей для запросов к spamd dnl имя_файла - использовать альтернативный файл с именами пользователей для запросов к spamd dnl define(`confSPAMASSASSIN_USERS_FILE', `NO')dnl dnl в файле допустимы шаблоны. имя получателя без домена указывается в виде %1 dnl dnl пример: dnl define(`confSPAMASSASSIN_USERS_FILE', `CONFDIR/sa-users')dnl dnl пользователи в файле указываются в виде: dnl recipient@address : nospam dnl recipient@domain.tld : spamd2 dnl *@another-domain.tld : spamd_user_%1 dnl * : spamd dnl dnl если в письме несколько получателей и для них будут указаны разные пользователи, dnl то будет использовано значение confSPAMASSASSIN_USER dnl dnl действие в случае отсутствия ответа от spamd либо возврата кода ошибки dnl NO - возвращать клиенту 4xx dnl YES - продолжать обработку письма dnl define(`confSPAMASSASSIN_DEFER_OK', `YES') dnl dnl исключения из проверки (список) dnl NO - не делать исключений из проверки dnl AUTH - не проводить проверку аутентифицированных отправителей dnl RELAY_FROM - не проводить проверку исходящих сообщений dnl define(`confCONTENT_SCANNING_SKIP', `AUTH RELAY_FROM')dnl dnl dnl ограничение размера проверяемых сообщений dnl NO - не ограничивать размер проверяемых сообщений dnl размер - указать максимальный размер проверяемых сообщений dnl define(`confCONTENT_SCANNING_MAX_MSG_SIZE', `192k')dnl dnl dnl действие для писем, набравших confSPAMASSASSIN_ACTION_SCORE баллов dnl REJECT - отказ в приеме письма (возврат клиенту кода 5xx) dnl DENY - синоним для REJECT dnl DROP - отказ в приеме сообщения с обрывом соединения dnl DISCARD - прием письма без доставки получателю dnl QUARANTINE - вывод в лог файл предупреждения и помещение письма в карантин dnl QUARANTINE_MAILLIST - сохранение в карантине писем из списков рассылки вместо отказа в приеме письма dnl (используется только одновременно с REJECT) dnl DISCARD_MAILLIST - игнорирование писем из списков рассылки вместо отказа в приеме письма dnl (используется только одновременно с REJECT) dnl SUBMIT_GREYLIST_SPAM_CERTAINLY=XX - занесение хоста в greylist_relays на XX минут, dnl если письмо идентифицировано как certainly-spam dnl SUBMIT_GREYLIST_SPAM_CUSTOM=XX - занесение хоста в greylist_relays на XX минут, dnl если письмо идентифицировано как шаблонное спамовое письмо dnl SUBMIT_GREYLIST_SPAM_RAZOR=XX - занесение хоста в greylist_relays на XX минут, dnl если письмо залистено в razor dnl SUBMIT_MYSQL_SPAM_CERTAINLY - внесение в базу MySQL информации о certainly-spam письме dnl (только для enterprise версии) dnl SUBMIT_MYSQL_SPAM_CUSTOM - внесение в базу MySQL информации о шаблонном письме dnl (только для enterprise версии) dnl SUBMIT_MYSQL_SPAM_RAZOR - внесение в базу MySQL информации о залистинном в razor письме dnl (только для enterprise версии) dnl SUBMIT_SQLITE_SPAM_CERTAINLY - внесение в базу SQLite информации о certainly-spam письме dnl (только для enterprise версии) dnl SUBMIT_SQLITE_SPAM_CUSTOM - внесение в базу SQLite информации о шаблонном письме dnl (только для enterprise версии) dnl SUBMIT_SQLITE_SPAM_RAZOR - внесение в базу SQLite информации о залистинном в razor письме dnl (только для enterprise версии) dnl define(`confSPAMASSASSIN_ACTION', `REJECT QUARANTINE')dnl dnl если не будут указаны действия REJECT, DROP или DISCARD, то письмо будет просто помечено dnl действие QUARANTINE можно указывать вместо с REJECT, DROP и DISCARD через пробел dnl действия QUARANTINE_MAILLIST и DISCARD_MAILLIST можно указывать вместе с REJECT и DROP dnl действия SUBMIT_* могут использоваться вместе с REJECT, DROP и DISCARD dnl dnl величина score, при которой производится действие confSPAMASSASSIN_ACTION вместо пометки сообщения dnl define(`confSPAMASSASSIN_ACTION_SCORE', `15')dnl dnl dnl значение по умолчанию времени жизни записи о хосте в кеше greylisting'а в минутах dnl define(`confSPAMASSASSIN_GREYLIST_PERIOD', `eval(24*60)')dnl dnl dnl месторасположение общесистемного каратнина: dnl доставка в maildir: dnl define(`confSPAMASSASSIN_QUARANTINE_DIR', `/var/vmail/domain.tld/admin/spam-quarantine/')dnl dnl сохранение всех писем в одном каталоге в простых текстовых файлах: dnl define(`confSPAMASSASSIN_QUARANTINE_DIR', `/usr/local/mail/sa/${tod_zulu}-${message_id}')dnl dnl сохранение всех писем в подкаталогах одного каталога в простых текстовых файлах, имя подкаталога состоит из даты: dnl define(`confSPAMASSASSIN_QUARANTINE_DIR', `/usr/local/mail/sa/${substr_1_8:{${tod_zulu}}/${tod_zulu}-${message_id}')dnl dnl сохранение в mailbox'е: dnl define(`confSPAMASSASSIN_QUARANTINE_DIR', `/var/mail/sa-quarantine')dnl dnl сохранение в mailbox'е в зависимости от текущей даты: dnl define(`confSPAMASSASSIN_QUARANTINE_DIR', `/var/mail/sa-quarantine-${substr_1_8:{${tod_zulu}}')dnl dnl dnl месторасположение каратнина для писем, не получивших максимальную dnl оценку bayes фильтра: dnl define(`confSPAMASSASSIN_QUARANTINE_DIR_LEARN', `/usr/local/mail/sa-learn/${tod_zulu}-${message_id}')dnl dnl правила формирования confSPAMASSASSIN_QUARANTINE_DIR_LEARN такие же, dnl как и для confSPAMASSASSIN_QUARANTINE_DIR dnl dnl действие для старых заголовков (X-Spam-Status, X-Spam-Flag, X-Spam-Score, X-Spam-Report) dnl RENAME - переименование старых заголовков (в конец имени добавляется -Old) dnl REMOVE - удаление старых заголовков dnl NOTHING - оставлять заголовки без изменений dnl define(`confSPAMASSASSIN_OLD_HEADERS', `RENAME')dnl dnl dnl заголовки spamassassin dnl define(`confSPAMASSASSIN_HEADERS', `X-Spam-Checker-Version:X-Spam-Info:X-Spam-Score:X-Spam-Status:X-Spam-Report:X-Spam-Flag:X-Spam-Level:X-Spam-Action:X-Spam-Original-Recipients')dnl dnl define(`confSPAMASSASSIN_HEADERS', confSPAMASSASSIN_HEADERS`:X-Spam-DSPAM-Result:X-Spam-DSPAM-Processed:X-Spam-DSPAM-Confidence:X-Spam-DSPAM-Improbability:X-Spam-DSPAM-Probability:X-Spam-DSPAM-Signature:X-Spam-DSPAM-Factors')dnl dnl dnl имя файла, в котором указаны индивидуальные баллы для пометки и отказа приема сообщений dnl в зависимости от адреса получателя dnl NO - не использовать индивидуальные баллы dnl имя_файла - имя файла с индивидуальных баллов dnl define(`confSPAMASSASSIN_SCORE_FILE', `NO')dnl dnl dnl пример: dnl define(`confSPAMASSASSIN_SCORE_FILE', `CONFDIR/sa-scores')dnl dnl dnl баллы в файле указываются в виде: dnl recipient@address : балл_для_пометки : балл_для_отказа_в_приеме_письма dnl dnl в адресах допустимы шаблоны dnl баллы должны быть целыми числами dnl в качестве балла для пометки можно использовать символ "*" (звездочку) dnl в этом случае сообщение будет помечено как спам, если оно наберет количество dnl баллов, указанное в настройках SpamAssassin dnl в качестве балла для отвержения можно использовать символ "*" (звездочку) dnl в этом случае сообщение будет отвергнуто, если наберет confSPAMASSASSIN_ACTION_SCORE баллов dnl dnl пример: dnl vasya@pupkin.org : * : 10 dnl *@pupkin.org : 7 : 15 dnl *@local.domain : * : * dnl * : 6 : 10 dnl dnl сообщение полностью исключается из проверки, если в значении $acl_m_wl_flag_msg dnl поля white_list_relays, white_list_senders или white_list_compat равны 1 dnl и поле spam_hater не равно 1 dnl ifdef(`confSYSTEM_FILTER',`',` errprint(`*** ERROR: confSYSTEM_FILTER variable required ')') ifelse(confSPAMASSASSIN_USERS_FILE, `YES', `define(`confSPAMASSASSIN_USERS_FILE', `CONFDIR/sa-users')') ifelse(len(X`'confSPAMASSASSIN_SCORE_FILE), `1', `define(`confSPAMASSASSIN_SCORE_FILE', `NO')')dnl ifelse(SECTION, `ACL_CHECK_MAIL', `dnl warn set acl_m8 = mark_hits=* action_hits=* user=* ') dnl ifelse(SECTION, `ACL_CHECK_MAIL', `') ifelse(SECTION, `ACL_CHECK_RCPT_BOTTOM', `dnl dnl ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `dnl', `dnl # SpamAssassin # вычисление пользователя, от имени которого будут выполняться запросы к spamd warn set acl_m0 = ifelse_strstr(confCONTENT_SCANNING_SKIP, `RELAY_FROM', `dnl hosts = !+relay_from_hosts ') dnl ifelse_strstr(confCONTENT_SCANNING_SKIP, `RELAY_FROM', `') ifelse_strstr(confCONTENT_SCANNING_SKIP, `AUTH', `dnl ! authenticated = * ') dnl ifelse_strstr(confCONTENT_SCANNING_SKIP, `AUTH', `') # поиск записи с именем пользователя в файле в зависимости от адреса получателя set acl_m0 = ${lookup{$local_part@$domain}wildlsearch{confSPAMASSASSIN_USERS_FILE}\ {${sg{$value}{\N%1\N}{$local_part}}}{}} warn set acl_m1 = ${extract{user}{$acl_m8}} condition = ${if eq{$acl_m1}{*}{yes}{no}} set acl_m1 = warn condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{$acl_m1}{}{no}{yes}} set acl_m8 = \ user=${if eq{$acl_m0}{$acl_m1}{$acl_m1}{confSPAMASSASSIN_USER}} \ mark_hits=${extract{mark_hits}{$acl_m8}} \ action_hits=${extract{action_hits}{$acl_m8}} warn condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if or{\ {eq{$acl_m1}{}}\ {eq{$acl_m1}{*}}\ }{yes}{no}} set acl_m8 = \ user=$acl_m0 \ mark_hits=${extract{mark_hits}{$acl_m8}} \ action_hits=${extract{action_hits}{$acl_m8}} ')') dnl ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `dnl', `')') dnl ifdef(`confSPAMASSASSIN_SCORE_FILE', `ifelse(confSPAMASSASSIN_SCORE_FILE, `NO', `dnl', `dnl # SpamAssassin # вычисление индивидуальных баллов исходя из адреса получателя warn set acl_m0 = ifelse_strstr(confCONTENT_SCANNING_SKIP, `RELAY_FROM', `dnl hosts = !+relay_from_hosts ') dnl ifelse_strstr(confCONTENT_SCANNING_SKIP, `RELAY_FROM', `') ifelse_strstr(confCONTENT_SCANNING_SKIP, `AUTH', `dnl ! authenticated = * ') dnl ifelse_strstr(confCONTENT_SCANNING_SKIP, `AUTH', `') # поиск записи с баллами в файле в зависимости от адреса получателя set acl_m0 = ${lookup{$local_part@$domain}wildlsearch{confSPAMASSASSIN_SCORE_FILE}\ {$value}{*:*}} # вычисление индивидуального балла для пометки исходя из найденного в файле и вычисленного ранее warn condition = ${if eq{$acl_m0}{}{no}{yes}} # прерываем вычисления, если в качестве первого балла (для пометки) указана звездочка condition = ${if match{${extract{1}{:}{$acl_m0}}}{\N\*\N}{no}{yes}} set acl_m8 = mark_hits=\ # если ранее балл для пометки не был вычислен (равен "*") ${if match{${extract{mark_hits}{$acl_m8}}}{\N\*\N}{\ # в качестве балла для пометки используем первый балл из файла confSPAMASSASSIN_SCORE_FILE ${extract{1}{:}{$acl_m0}}\ }{\ # в противном случае # если ранее вычисленный балл для пометки больше балла для пометки, полученного из файла ${if >{${extract{mark_hits}{$acl_m8}}}{${extract{1}{:}{$acl_m0}}}\ # то в качестве балла для пометки оставляем ранее вычисленный балл {${extract{mark_hits}{$acl_m8}}}\ # иначе в качестве балла для пометки используем балл из файла {${extract{1}{:}{$acl_m0}}}}\ }} \ # балл для отвержения и имя пользователя оставляем без изменений action_hits=${extract{action_hits}{$acl_m8}} \ user=${extract{user}{$acl_m8}} # вычисление индивидуального балла для отвержения исходя из найденного в файле и вычисленного ранее warn condition = ${if eq{$acl_m0}{}{no}{yes}} set acl_m0 = \ # если в качестве второго балла (для отвержения) в файле # confSPAMASSASSIN_SCORE_FILE указана звездочка ${if match{${extract{2}{:}{$acl_m0}}}{\N\*\N}\ # заменяем ее на значение по умолчанию из конфига (confSPAMASSASSIN_ACTION_SCORE) {${extract{1}{:}{$acl_m0}}:confSPAMASSASSIN_ACTION_SCORE}\ # в противном случае оставляем старое значение баллов из файла {$acl_m0}} set acl_m8 = action_hits=\ # если вычисленный балл для отвержения не определен (равен звездочке) ${if match{${extract{action_hits}{$acl_m8}}}{\N\*\N}\ # тогда используем балл для отвержения из файла {${extract{2}{:}{$acl_m0}}}\ # в противном случае {\ # если вычисленный балл для отвержения больше балла для отвержения из файла ${if >{${extract{action_hits}{$acl_m8}}}{${extract{2}{:}{$acl_m0}}}\ # тогда используем вычисленный балл {${extract{action_hits}{$acl_m8}}}\ # иначе используем балл из файла {${extract{2}{:}{$acl_m0}}}}\ }} \ # балл для пометки и имя пользователя оставляем без изменений mark_hits=${extract{mark_hits}{$acl_m8}} \ user=${extract{user}{$acl_m8}} ')') dnl ifdef(`confSPAMASSASSIN_SCORE_FILE', `ifelse(confSPAMASSASSIN_SCORE_FILE, `NO', `', `')') dnl ') dnl ifelse(SECTION, `ACL_CHECK_RCPT_BOTTOM', `') ifelse(SECTION, `ACLS_ADDITIONAL', `dnl acl_check_data_sa: warn set acl_m_spam_scores = set acl_m_spam_score = set acl_m_spam_score_int = set acl_m_spam_report = set acl_m_spam_bar = set acl_m_spam_status = no warn set acl_m_contentscan_result = defer warn set acl_m0 = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{spamd}\ {confSPAMASSASSIN_SPAMD_ADDRESS}{defer_ok}{ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `confSPAMASSASSIN_USER', `${extract{user}{$acl_m8}}:true')')}{report}} # добавляем информацию о версии spamassassin warn add_header = X-Spam-Checker-Version: _SPAMD_VER_ on confCONTENT_SCANNING_HOSTNAME\n accept condition = ${if eq{$acl_m0}{}{yes}{no}} logwrite = SPAMD check failed accept condition = ${if match{$acl_m0}{\N^spamd dlfunc:\s*\N}{yes}{no}} logwrite = SPAMD check defer: ${sg{$acl_m0}{\N^spamd dlfunc:\s*\N}{}} # warn condition = ${if eq{$acl_m0}{}{no}{yes}} # set acl_m1 = ${if match{$acl_m0}\ # {\N^SPAMD answer: SPAMD/(\S+) 0 EX_OK\N}{$1}{}} # logwrite = SPAMD check: SPAMD version: ${if eq{$acl_m1}{}{not found}{$acl_m1}} warn condition = ${if eq{$acl_m0}{}{no}{yes}} set acl_m1 = ${if match{$acl_m0}\ {\N^SPAMD answer: SPAMD/.+\r\nSpam: (\S+) ; (-?\d+\.\d+ / \d+\.\d+)\N}{$1}{}} set acl_m_spam_status = ${if match{$acl_m1}{\N^(?i)true$\N}{Yes}{No}} # logwrite = SPAMD check: SPAMD status: ${if eq{$acl_m1}{}{not found}{$acl_m_spam_status}} warn condition = ${if eq{$acl_m0}{}{no}{yes}} set acl_m1 = ${if match{$acl_m0}\ {\N^SPAMD answer: SPAMD/.+\r\nSpam: \S+ ; (-?\d+\.\d+ / \d+\.\d+)\N}{$1}{}} set acl_m_spam_scores = ${if eq{$acl_m1}{}{not found}{$acl_m1}} # logwrite = SPAMD check: SPAMD scores: $acl_m_spam_scores warn condition = ${if eq{$acl_m_spam_scores}{}{no}{yes}} set acl_m_spam_score = ${sg{$acl_m_spam_scores}{\N\s*\/.+$\N}{}} # logwrite = SPAMD check: SPAMD score: $acl_m_spam_score warn condition = ${if eq{$acl_m_spam_score}{}{no}{yes}} set acl_m_spam_score_int = ${if match{$acl_m_spam_score}{\N\.\N}{\ ${sg{$acl_m_spam_score}{\N\.(\d).*$\N}{\$1}}\ }{${acl_m_spam_score}0}} # logwrite = SPAMD check: SPAMD score*10: $acl_m_spam_score_int warn condition = ${if eq{$acl_m0}{}{no}{yes}} set acl_m1 = ${if match{$acl_m0}\ {\N(?s)^SPAMD answer: SPAMD/.+?\r\nSpam:.+?\r\n\r\n(.+)$\N}{$1}{}} set acl_m_spam_report = ${if eq{$acl_m1}{}{not found}{$acl_m1}} # logwrite = SPAMD check: SPAMD report: $acl_m_spam_report warn condition = ${if eq{$acl_m_spam_score}{}{no}{yes}} set acl_m_spam_score_trunc = ${sg{$acl_m_spam_score}{\N\..*$\N}{}} warn condition = ${if eq{$acl_m_spam_score}{}{no}{yes}} condition = ${if >{$acl_m_spam_score_trunc}{0}{yes}{no}} set acl_m_spam_bar = ${length{$acl_m_spam_score_trunc}{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}} warn condition = ${if eq{$acl_m_spam_score}{}{no}{yes}} condition = ${if <{$acl_m_spam_score_trunc}{0}{yes}{no}} set acl_m_spam_bar = ${length{${eval:(-1)*$acl_m_spam_score_trunc}}{--------------------------------------------------------------------------------------------------------------}} warn condition = ${if eq{$acl_m_spam_score}{}{no}{yes}} condition = ${if ={$acl_m_spam_score_trunc}{0}{yes}{no}} set acl_m_spam_bar = / # warn condition = ${if eq{$acl_m_spam_score}{}{no}{yes}} # logwrite = SPAMD check: SPAMD spam bar: $acl_m_spam_bar warn set acl_m_contentscan_result = set acl_m_spamd_headers = \ X-Spam-Score: $acl_m_spam_score ($acl_m_spam_bar)\n\ ${sg{\ ${sg{X-Spam-Report: $acl_m_spam_report\n}{\N\n\s+(X-Spam-\S*:\s)\N}{\n\$1}}\ }{\N\n\s+(X-Daemon-Classification:\s)\N}{\n\$1}} warn condition = ${if eq{$acl_m_spam_status}{Yes}{yes}{no}} set acl_m_contentscan_result = spam set acl_m_spamd_headers = ${sg{${acl_m_spamd_headers}}{\NX-Spam-Status: No\N}{X-Spam-Status: Yes}}\ X-Spam-Flag: YES\n\ X-Spam-Original-Recipients: $recipients\n accept ') dnl ifelse(SECTION, `ACLS_ADDITIONAL', `') ifelse(SECTION, `ACL_CHECK_DATA_TOP', `dnl ifelse(confSPAMASSASSIN_OLD_HEADERS, `REMOVE', `dnl warn remove_header = confSPAMASSASSIN_HEADERS ') dnl ifelse(confSPAMASSASSIN_OLD_HEADERS, `REMOVE', `') ifelse(confSPAMASSASSIN_OLD_HEADERS, `RENAME', `dnl warn remove_header = confSPAMASSASSIN_HEADERS RENAME_HEADERS(confSPAMASSASSIN_HEADERS) ') dnl ifelse(confSPAMASSASSIN_OLD_HEADERS, `RENAME', `') ') dnl ifelse(SECTION, `ACL_CHECK_DATA_TOP', `') ifelse(SECTION, `ACL_CHECK_DATA', `dnl # SpamAssassin ifdef(`confSPAMASSASSIN_NAME_VERSION',`define(`_SPAMD_VER_', `esyscmd(confSPAMASSASSIN_NAME_VERSION)')')dnl ifelse(len(X`'_SPAMD_VER_), `1', `ifdef(`confSPAMASSASSIN_NAME_VERSION_DEFAULT',`define(`_SPAMD_VER_', confSPAMASSASSIN_NAME_VERSION_DEFAULT)',`define(`_SPAMD_VER_', `SpamAssassin Server')')')dnl ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `dnl', `dnl # если ранее не вычислен пользователь, от имени которого нужно выполнять запросы к spamd warn condition = ${if or{\ {eq{${extract{user}{$acl_m8}}}{*}}\ {eq{${extract{user}{$acl_m8}}}{}}\ }{yes}{no}} set acl_m8 = \ mark_hits=${extract{mark_hits}{$acl_m8}} \ action_hits=${extract{action_hits}{$acl_m8}} \ user=confSPAMASSASSIN_USER ')') dnl ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `')') warn condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} acl = acl_check_data_sa ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_GREYLIST_SPAM_CUSTOM', `ENTERPRISE(`greylist', `submit_spam_custom')') ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_MYSQL_SPAM_CUSTOM', `ENTERPRISE(`mysql', `submit_spam_custom')') ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_SQLITE_SPAM_CUSTOM', `ENTERPRISE(`sqlite', `submit_spam_custom')') ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_GREYLIST_SPAM_RAZOR', `ENTERPRISE(`greylist', `submit_spam_razor')') ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_MYSQL_SPAM_RAZOR', `ENTERPRISE(`mysql', `submit_spam_razor')') ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_SQLITE_SPAM_RAZOR', `ENTERPRISE(`sqlite', `submit_spam_razor')') warn set acl_m0 = condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{no}{yes}} condition = ${if eq{$acl_m_spam_score_int}{}{no}{yes}} ifdef(`confSPAMASSASSIN_SCORE_FILE', `ifelse(confSPAMASSASSIN_SCORE_FILE, `NO', `dnl condition = ${if <{$acl_m_spam_score_int}{eval(confSPAMASSASSIN_ACTION_SCORE*10)}{no}{yes}} ', `dnl condition = ${if <{$acl_m_spam_score_int}{\ ${if match{${extract{action_hits}{$acl_m8}}}{\N\*\N}\ {eval(confSPAMASSASSIN_ACTION_SCORE*10)}\ {${eval:${extract{action_hits}{$acl_m8}}*10}}}\ }{no}{yes}} ')') set acl_m0 = certainly_spam ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_GREYLIST_SPAM_CERTAINLY', `ENTERPRISE(`greylist', `submit_spam_certainly')') ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_MYSQL_SPAM_CERTAINLY', `ENTERPRISE(`mysql', `submit_spam_certainly')') ifelse_strstr(confSPAMASSASSIN_ACTION, `SUBMIT_SQLITE_SPAM_CERTAINLY', `ENTERPRISE(`sqlite', `submit_spam_certainly')') ifdef(`confSPAMASSASSIN_DEFER_OK', `ifelse(confSPAMASSASSIN_DEFER_OK, `YES', `dnl warn condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{yes}{no}} add_header = X-Spam-Info: spamd connection deferred on $primary_hostname\n log_message = spamd connection deferred ', ` dnl ifdef(`confSPAMASSASSIN_DEFER_OK', `ifelse(confSPAMASSASSIN_DEFER_OK, `YES', `')') defer condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{yes}{no}} message = System busy. Try again later log_message = spamd connection deferred ')') dnl ifdef(`confSPAMASSASSIN_DEFER_OK', `ifelse(confSPAMASSASSIN_DEFER_OK, `YES', `')') ifdef(`confSPAMASSASSIN_SCORE_FILE', `ifelse(confSPAMASSASSIN_SCORE_FILE, `NO', `dnl # Add X-Spam-Flag if spam is over system-wide threshold warn condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{no}{yes}} ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `dnl spam = confSPAMASSASSIN_USER ', `dnl spam = ${extract{user}{$acl_m8}} ')') dnl ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `')') set acl_m_spamd_headers = ${sg{${acl_m_spamd_headers}}{\NX-Spam-Status: No\N}{X-Spam-Status: Yes}}\ X-Spam-Flag: YES\n\ X-Spam-Original-Recipients: $recipients\n logwrite = SpamAssassin check: probably spam (score: $acl_m_spam_score) ', `dnl если используется файл с индивидуальными баллами по получателям # Add X-Spam-Flag if spam is over system-wide threshold # если используется балл для пометки по умолчанию warn condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{no}{yes}} condition = ${if match{${extract{mark_hits}{$acl_m8}}}{\N\*\N}{yes}{no}} ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `dnl spam = confSPAMASSASSIN_USER ', `dnl spam = ${extract{user}{$acl_m8}} ')') dnl ifdef(`confSPAMASSASSIN_USERS_FILE', `ifelse(confSPAMASSASSIN_USERS_FILE, `NO', `')') set acl_m_spamd_headers = ${sg{${acl_m_spamd_headers}}{\NX-Spam-Status: No\N}{X-Spam-Status: Yes}}\ X-Spam-Flag: YES\n\ X-Spam-Original-Recipients: $recipients\n logwrite = SpamAssassin check: probably spam (score: $acl_m_spam_score) # Add X-Spam-Flag if spam is over individual threshold # если используется вычисленный балл для пометки warn condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{no}{yes}} # если используется вычисленный балл для пометки condition = ${if match{${extract{mark_hits}{$acl_m8}}}{\N\*\N}{no}{yes}} # если набранный бал не меньше, чем вычисленный балл для пометки condition = ${if <{$acl_m_spam_score_int}{${eval:${extract{mark_hits}{$acl_m8}}*10}}{no}{yes}} set acl_m_spamd_headers = ${sg{${acl_m_spamd_headers}}{\NX-Spam-Status: No\N}{X-Spam-Status: Yes}}\ X-Spam-Flag: YES\n\ X-Spam-Original-Recipients: $recipients\n logwrite = SpamAssassin check: probably spam (score: $acl_m_spam_score) ')') dnl ifdef(`confSPAMASSASSIN_SCORE_FILE', `ifelse(confSPAMASSASSIN_SCORE_FILE, `NO', `')') warn add_header = $acl_m_spamd_headers define(`confSPAMASSASSIN_ACTION', confSPAMASSASSIN_ACTION` ') ifelse_strstr(confSPAMASSASSIN_ACTION, `REJECT ', ` dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE_MAILLIST ', ` # Quarantine spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE warn condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = SpamAssassin check: Spam is blocked and quarantined ($acl_m_spam_score ($acl_m_spam_bar)) set acl_m_quarantined = $acl_m_quarantined content_scanner add_header = \ X-Spam-Action: quarantined${if match{$acl_m_spam_report}{BAYES_99}{}{ for learning}}\n\ \texim-conf version=confPAROVOZ_VERSION\n\ ifelse(confGREYLIST, `OPTIONAL', `\ttotal greylist scores=${extract{scores}{$acl_m_optional_greylist}}/confGREYLIST_BLOCKED_OPTIONAL\n')\ ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `', `\ttotal reject scores=${extract{scores}{$acl_m_optional_reject}}/confOPTIONAL_REJECT_SCORES\n')')\ $acl_m_spam_action accept condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = original recipients: $recipients ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE_MAILLIST ', `') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `DISCARD_MAILLIST ', ` # Discard spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE discard condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = SpamAssassin check: Spam is discarded ($acl_m_spam_score ($acl_m_spam_bar)) ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `DISCARD_MAILLIST ', `') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE ', ` # Reject and quarantine spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE warn condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} control = fakereject/${if eq{$acl_m_dnsbl}{}{Spam blocked by content scanner}{$acl_m_dnsbl}} (${message_id})\n\ You may contact postmaster@$qualify_domain logwrite = SpamAssassin check: Spam is blocked and quarantined ($acl_m_spam_score ($acl_m_spam_bar)) set acl_m_quarantined = $acl_m_quarantined content_scanner add_header = \ X-Spam-Action: quarantined${if match{$acl_m_spam_report}{BAYES_99}{}{ for learning}}\n\ \texim-conf version=confPAROVOZ_VERSION\n\ ifelse(confGREYLIST, `OPTIONAL', `\ttotal greylist scores=${extract{scores}{$acl_m_optional_greylist}}/confGREYLIST_BLOCKED_OPTIONAL\n')\ ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `', `\ttotal reject scores=${extract{scores}{$acl_m_optional_reject}}/confOPTIONAL_REJECT_SCORES\n')')\ $acl_m_spam_action accept condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = original recipients: $recipients ',` dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE ', `') # Reject spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE deny condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = SpamAssassin check: Spam is rejected ($acl_m_spam_score ($acl_m_spam_bar)) message = ${if eq{$acl_m_dnsbl}{}{Spam blocked by content scanner}{$acl_m_dnsbl}} (${message_id})\n\ You may contact postmaster@$qualify_domain ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE ', `') ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `REJECT ', `') ifelse_strstr(confSPAMASSASSIN_ACTION, `DROP ', ` dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE_MAILLIST ', ` # Quarantine spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE warn condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = SpamAssassin check: Spam is blocked and quarantined ($acl_m_spam_score ($acl_m_spam_bar)) set acl_m_quarantined = $acl_m_quarantined content_scanner add_header = \ X-Spam-Action: quarantined${if match{$acl_m_spam_report}{BAYES_99}{}{ for learning}}\n\ \texim-conf version=confPAROVOZ_VERSION\n\ ifelse(confGREYLIST, `OPTIONAL', `\ttotal greylist scores=${extract{scores}{$acl_m_optional_greylist}}/confGREYLIST_BLOCKED_OPTIONAL\n')\ ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `', `\ttotal reject scores=${extract{scores}{$acl_m_optional_reject}}/confOPTIONAL_REJECT_SCORES\n')')\ $acl_m_spam_action accept condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = original recipients: $recipients ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE_MAILLIST ', `') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `DISCARD_MAILLIST ', ` # Discard spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE discard condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = SpamAssassin check: Spam is discarded ($acl_m_spam_score ($acl_m_spam_bar)) ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `DISCARD_MAILLIST ', `') dnl # Drop spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE drop condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = SpamAssassin check: Spam is rejected ($acl_m_spam_score ($acl_m_spam_bar)) message = ${if eq{$acl_m_dnsbl}{}{Spam blocked by content scanner}{$acl_m_dnsbl}} (${message_id})\n\ You may contact postmaster@$qualify_domain ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `REJECT ', `') ifelse_strstr(confSPAMASSASSIN_ACTION, `DISCARD ', ` ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE ', ` # Discard and quarantine spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE warn condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = SpamAssassin check: Spam is quarantined ($acl_m_spam_score ($acl_m_spam_bar)) set acl_m_quarantined = $acl_m_quarantined content_scanner add_header = \ X-Spam-Action: quarantined${if match{$acl_m_spam_report}{BAYES_99}{}{ for learning}}\n\ \texim-conf version=confPAROVOZ_VERSION\n\ ifelse(confGREYLIST, `OPTIONAL', `\ttotal greylist scores=${extract{scores}{$acl_m_optional_greylist}}/confGREYLIST_BLOCKED_OPTIONAL\n')\ ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `', `\ttotal reject scores=${extract{scores}{$acl_m_optional_reject}}/confOPTIONAL_REJECT_SCORES\n')')\ $acl_m_spam_action accept condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = original recipients: $recipients ',` dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE ', `') # Discard spam messages if spam score is over confSPAMASSASSIN_ACTION_SCORE discard condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = SpamAssassin check: Spam is discarded ($acl_m_spam_score ($acl_m_spam_bar)) ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `QUARANTINE ', `') ') dnl ifelse_strstr(confSPAMASSASSIN_ACTION, `DISCARD ', `') ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `')