dnl dnl Поддержка spamassassin dnl dnl исключения из проверки (список) dnl NO - не делать исключений из проверки dnl AUTH - не проводить проверку аутентифицированных отправителей dnl RELAY_FROM - не проводить проверку исходящих сообщений dnl define(`confSPAMASSASSIN_SKIP', `AUTH RELAY_FROM')dnl dnl ограничение размера проверяемых сообщений dnl NO - не ограничивать размер проверяемых сообщений dnl размер - указать максимальный размер проверяемых сообщений dnl define(`confSPAMASSASSIN_MAX_MSG_SIZE', `128k')dnl dnl величина sore, при которой клиенту возвращается 5xx вместо пометки сообщения dnl define(`confSPAMASSASSIN_REJECT_SCORE', `15')dnl dnl имя файла, в котором указаны индивидуальные баллы для пометки и отвержения сообщений dnl в зависимости от адреса получателя dnl NO - не использовать индивидуальные баллы dnl имя_файла - имя файла с индивидуальных баллов dnl define(`confSPAMASSASSIN_SCORE_FILE', `NO')dnl dnl пример: dnl define(`confSPAMASSASSIN_SCORE_FILE', `CONFDIR/sa-scores')dnl dnl баллы в файле указываются в виде: dnl recipient@address : балл_для_пометки : балл_для_отвержения dnl в адресах допустимы шаблоны dnl баллы должны быть целыми числами dnl в качестве балла для пометки можно использовать символ "*" (звездочку) dnl в этом случае сообщение будет помечено как спам, если оно наберет количество dnl баллов, указанное в настройках SpamAssassin dnl в качестве балла для отвержения можно использовать символ "*" (звездочку) dnl в этом случае сообщение будет отвержено, если наберет confSPAMASSASSIN_REJECT_SCORE баллов dnl пример: dnl vasya@pupkin.org : * : 10 dnl *@pupkin.org : 7 : 15 dnl *@local.domain : * : * dnl * : 6 : 10 dnl dnl сообщение полностью исключается из проверки, если значение $acl_m9 равно "white_list_relays" dnl ifelse(CHAPTER, `MAIN', `dnl spamd_address = 127.0.0.1 783 dnl ifelse(len(X`'confSPAMASSASSIN_SCORE_FILE), `1', `dnl define(`confSPAMASSASSIN_SCORE_FILE', `NO')dnl ')dnl dnl ')dnl dnl ifelse(CHAPTER, `ACL_CHECK_MAIL', `dnl warn set acl_m9 = no_skip warn set acl_m8 = *:* ') dnl ifelse(CHAPTER, `ACL_CHECK_RCPT', `dnl warn local_parts = postmaster : abuse domains = +local_domains confDOMAINS_ABUSE set acl_m9 = skip ') dnl ifelse(CHAPTER, `ACL_CHECK_RCPT_BOTTOM', `dnl dnl ifdef(`confSPAMASSASSIN_SCORE_FILE', `ifelse(confSPAMASSASSIN_SCORE_FILE, `NO', `dnl', `dnl # SpamAssassin # поиск индивидуальных баллов исходя из адреса получателя warn set acl_m0 = ifelse_strstr(confSPAMASSASSIN_SKIP, `RELAY_FROM', `dnl hosts = !+relay_from_hosts ') ifelse_strstr(confSPAMASSASSIN_SKIP, `AUTH', `dnl ! authenticated = * ') # поиск записи с баллами в файле в зависимости от адреса получателя 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 = ${if match{${extract{1}{:}{$acl_m8}}}{\N\*\N}{\ ${extract{1}{:}{$acl_m0}}\ }{\ ${if >{${extract{1}{:}{$acl_m8}}}{${extract{1}{:}{$acl_m0}}}\ {${extract{1}{:}{$acl_m8}}}{${extract{1}{:}{$acl_m0}}}}\ }}:${extract{2}{:}{$acl_m8}} # вычисление индивидуального балла для отвержения исходя из найденного в файле и вычисленного ранее warn condition = ${if eq{$acl_m0}{}{no}{yes}}\ # если в качестве второго балла (для отвержения) в файле confSPAMASSASSIN_SCORE_FILE указана звездочка, # заменяем ее на значение по умолчанию из конфига (confSPAMASSASSIN_REJECT_SCORE) set acl_m0 = ${if match{${extract{2}{:}{$acl_m0}}}{\N\*\N}\ {${extract{1}{:}{$acl_m0}}:confSPAMASSASSIN_REJECT_SCORE}{$acl_m0}} set acl_m8 = ${extract{1}{:}{$acl_m8}}:\ ${if match{${extract{2}{:}{$acl_m8}}}{\N\*\N}{\ ${extract{2}{:}{$acl_m0}}\ }{\ ${if >{${extract{2}{:}{$acl_m8}}}{${extract{2}{:}{$acl_m0}}}\ {${extract{2}{:}{$acl_m8}}}{${extract{2}{:}{$acl_m0}}}}\ }} ') ') dnl ') dnl ifelse(CHAPTER, `ACL_CHECK_DATA', `dnl # SpamAssassin # проверяем, надо ли делать исключение из проверки warn set acl_m0 = skip # делаем исключение, если хост отправителя указан в глобальном white list condition = ${if eq{$acl_m9}{white_list_relays}{no}{yes}} ifelse_strstr(confSPAMASSASSIN_SKIP, `RELAY_FROM', `dnl # делаем исключение, если хост отправителя указан в +relay_from_hosts hosts = !+relay_from_hosts ') ifelse_strstr(confSPAMASSASSIN_SKIP, `AUTH', `dnl # делаем исключение, если отправитель авторизовался ! authenticated = * ') ifdef(`confSPAMASSASSIN_MAX_MSG_SIZE', `ifelse(confSPAMASSASSIN_MAX_MSG_SIZE, `NO', `dnl', `dnl # делаем исключение, если размер сообщения превышает confSPAMASSASSIN_MAX_MSG_SIZE condition = ${if <{$message_size}{confSPAMASSASSIN_MAX_MSG_SIZE}{yes}{no}} ')') set acl_m0 = no_skip # Always add X-Spam-Score and X-Spam-Report headers, using SA system-wide settings # (user "nobody"), no matter if over threshold or not. warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} message = X-Spam-Score: $spam_score ($spam_bar) spam = nospam:true warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} message = X-Spam-Report: $spam_report spam = nospam:true # Reject spam messages if spam score is over confSPAMASSASSIN_REJECT_SCORE deny condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m9}{skip}{no}{yes}} ifdef(`confSPAMASSASSIN_SCORE_FILE', `ifelse(confSPAMASSASSIN_SCORE_FILE, `NO', `dnl condition = ${if <{$spam_score_int}{eval(confSPAMASSASSIN_REJECT_SCORE*10)}{no}{yes}} ', `dnl condition = ${if <{$spam_score_int}{\ ${if match{${extract{2}{:}{$acl_m8}}}{\N\*\N}\ {eval(confSPAMASSASSIN_REJECT_SCORE*10)}\ {${eval:${extract{2}{:}{$acl_m8}}*10}}}\ }{no}{yes}} ')') message = Spam is blocked ($spam_score ($spam_bar)) spam = nospam:true 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_m0}{skip}{no}{yes}} message = X-Spam-Flag: YES log_message = probably spam (score: $spam_score) spam = nospam ', `dnl если используется файл с индивидуальными баллами по получателям # Add X-Spam-Flag if spam is over system-wide threshold # если используется балл для пометки по умолчанию warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if match{${extract{1}{:}{$acl_m8}}}{\N\*\N}{yes}{no}} spam = nospam message = X-Spam-Flag: YES log_message = probably spam (score: $spam_score) # Add X-Spam-Flag if spam is over individual threshold # если используется вычисленный балл для пометки warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} # если используется вычисленный балл для пометки condition = ${if match{${extract{1}{:}{$acl_m8}}}{\N\*\N}{no}{yes}} # если набранный бал не меньше, чем вычисленный балл для пометки condition = ${if <{$spam_score_int}{${eval:${extract{1}{:}{$acl_m8}}*10}}{no}{yes}} message = X-Spam-Flag: YES log_message = probably spam (score: $spam_score) ')') ')