dnl dnl проверка ошибок MIME dnl NO - не проводить проверку ошибок MIME dnl YES - проводить проверку ошибок MIME dnl define(`confCHECK_MIME_ERRORS', `NO')dnl dnl dnl действия для разных уровней ошибок: dnl WARN - вывод предупреждения в лог файл и добавление поля в заголовки письма dnl REJECT - отказ в приеме письма (возврат клиенту кода 5xx) dnl DENY - синоним для REJECT dnl FAKEREJECT - доставка письма получателю с возвратом клиенту кода 5xx dnl DISCARD - прием письма без доставки получателю dnl QUARANTINE - вывод в лог файл предупреждения и помещение письма в карантин dnl QUARANTINE_MAILLIST - сохранение в карантине писем из списков рассылки вместо отказа в приеме письма dnl (используется только одновременно с REJECT, FAKEREJECT и DROP) dnl DISCARD_MAILLIST - игнорирование писем из списков рассылки вместо отказа в приеме письма dnl (используется только одновременно с REJECT, FAKEREJECT и DROP) dnl dnl для каждого из трех уровней ошибок (1, 2 и >2) действия описываются отдельно dnl define(`confCHECK_MIME_ERRORS_1', `WARN')dnl dnl define(`confCHECK_MIME_ERRORS_2', `WARN')dnl dnl define(`confCHECK_MIME_ERRORS_3', `WARN')dnl dnl dnl какой механизм проверки ошибок MIME использовать: dnl MIME_ANOMALY - проверка в acl_smtp_mime dnl OLD_DEMIME - проверка в acl_smtp_data (depricated, используется для совместимости, dnl необходима сборка exim с WITH_OLD_DEMIME) dnl define(`confCHECK_MIME_ERRORS_BACKEND', `MIME_ANOMALY')dnl dnl ifelse(confCHECK_MIME_ERRORS, `REJECT', `define(`confCHECK_MIME_ERRORS_3', `REJECT')') ifelse(SECTION, `ACL_CHECK_DATA_TOP', `dnl # First unpack MIME containers and warn serious errors warn demime = * warn set acl_m_mime_errorlevel = $demime_errorlevel set acl_m1 = ${if eq{$demime_errorlevel}{0}{}{\ ${if eq{$demime_errorlevel}{1}{confCHECK_MIME_ERRORS_1}{\ ${if eq{$demime_errorlevel}{2}{confCHECK_MIME_ERRORS_2}{\ ${if >{$demime_errorlevel}{2}{confCHECK_MIME_ERRORS_3}{unknown}}\ }}\ }}\ }} acl = acl_normalize_action "$acl_m1" set acl_m1 = ${sg{$acl_m_normalize_action_result }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} # message = $acl_m2 # log_message = $acl_m2. $acl_m0 set acl_m2 = This message contains a MIME error set acl_m0 = errorlevel: $demime_errorlevel; reason: $demime_reason ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') ifelse(SECTION, `ACL_CHECK_MIME', `dnl # First unpack MIME containers and warn serious errors warn decode = default warn set acl_m_mime_errorlevel = $mime_anomaly_level set acl_m1 = ${if eq{$mime_anomaly_level}{0}{}{\ ${if eq{$mime_anomaly_level}{1}{confCHECK_MIME_ERRORS_1}{\ ${if eq{$mime_anomaly_level}{2}{confCHECK_MIME_ERRORS_2}{\ ${if >{$mime_anomaly_level}{2}{confCHECK_MIME_ERRORS_3}{unknown}}\ }}\ }}\ }} acl = acl_normalize_action "$acl_m1" set acl_m1 = ${sg{$acl_m_normalize_action_result }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} # message = $acl_m2 # log_message = $acl_m2. $acl_m0 set acl_m2 = This message contains a MIME error set acl_m0 = errorlevel: $mime_anomaly_level; reason: $mime_anomaly_text ') dnl ifelse(SECTION, `ACL_CHECK_MIME', `') warn hosts = +relay_from_hosts ! authenticated = * set acl_m2 = This message from relayed host contains a MIME error set acl_m1 = $acl_m1 skip ifdef(`confWHITE_LIST_RELAYS', `ifelse(confWHITE_LIST_RELAYS, `NO', `', ` warn hosts = +relay_white_list ! authenticated = * set acl_m2 = This message from whitelisted host contains a MIME error set acl_m1 = $acl_m1 skip ')') ifdef(`confWHITE_LIST_SENDERS', `ifelse(confWHITE_LIST_SENDERS, `NO', `', ` warn senders = @@wildlsearch;CONFDIR/senders-whitelist set acl_m2 = This message from whitelisted sender contains a MIME error set acl_m1 = $acl_m1 skip ')') warn authenticated = * set acl_m2 = This message from authenticated sender contains a MIME error set acl_m1 = $acl_m1 skip warn condition = ${if match{$acl_m1}{\N(drop|reject|discard|quarantine)\N}{yes}{no}} condition = ${if match{$acl_m1}{skip}{yes}{no}} log_message = $acl_m2. $acl_m0 add_header = X-Warn-MIME: $acl_m2. $acl_m0 set acl_m1 = warn condition = ${if match{$acl_m1}{warn}{yes}{no}} log_message = $acl_m2. $acl_m0 add_header = X-Warn-MIME: $acl_m2. $acl_m0 # discard_maillist discard condition = ${if match{$acl_m1}{\N(drop|reject)\N}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} condition = ${if match{$acl_m1}{discard_maillist}{yes}{no}} log_message = $acl_m2. $acl_m0 ifelse(SECTION, `ACL_CHECK_DATA', `dnl logwrite = original recipients: $recipients ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') # quarantine maillist accept condition = ${if match{$acl_m1}{\N(drop|reject)\N}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} condition = ${if match{$acl_m1}{quarantine_maillist}{yes}{no}} add_header = X-Quarantine-MIME: $acl_m2. $acl_m0 log_message = message will be quarantined: $acl_m2. $acl_m0 set acl_m_quarantined = $acl_m_quarantined data ifelse(SECTION, `ACL_CHECK_DATA', `dnl logwrite = original recipients: $recipients add_header = X-Original-Recipients: $recipients ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') ifelse(SECTION, `ACL_CHECK_MIME', `dnl set acl_m_add_x_orig_rcpt = yes ') dnl ifelse(SECTION, `ACL_CHECK_MIME', `') # fakereject ifelse(SECTION, `ACL_CHECK_DATA', `dnl warn condition = ${if eq{${extract{fakereject}{$acl_m1}}}{00}{yes}{no}} log_message = message will be fakerejected: $acl_m2. $acl_m0 control = fakereject/${expand:$acl_m2} ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') ifelse(SECTION, `ACL_CHECK_MIME', `dnl warn condition = ${if eq{${extract{fakereject}{$acl_m1}}}{00}{yes}{no}} log_message = message will be fakerejected: $acl_m2. $acl_m0 set acl_m_fakereject = \ message will be fakerejected: $acl_m2. $acl_m0\ |\ |${expand:$acl_m2} set acl_m_add_x_orig_rcpt = yes ') dnl ifelse(SECTION, `ACL_CHECK_MIME', `') # quarantine and !reject warn condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{no}{yes}} add_header = X-Quarantine-MIME: $acl_m2. $acl_m0 log_message = message will be quarantined: $acl_m2. $acl_m0 set acl_m_quarantined = $acl_m_quarantined data ifelse(SECTION, `ACL_CHECK_DATA', `dnl logwrite = original recipients: $recipients add_header = X-Original-Recipients: $recipients ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') ifelse(SECTION, `ACL_CHECK_MIME', `dnl set acl_m_add_x_orig_rcpt = yes ') dnl ifelse(SECTION, `ACL_CHECK_MIME', `') accept condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{no}{yes}} # quarantine and reject ifelse(SECTION, `ACL_CHECK_DATA', `dnl accept condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{yes}{no}} log_message = message will be quarantined: $acl_m2. $acl_m0 add_header = X-Quarantine-MIME: $acl_m2. $acl_m0 control = fakereject/${expand:$acl_m2} logwrite = original recipients: $recipients add_header = X-Original-Recipients: $recipients set acl_m_quarantined = $acl_m_quarantined data ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') ifelse(SECTION, `ACL_CHECK_MIME', `dnl accept condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{yes}{no}} log_message = message will be quarantined: $acl_m2. $acl_m0 set acl_m_fakereject = \ message will be quarantined: $acl_m2. $acl_m0\ |X-Quarantine-MIME: $acl_m2. $acl_m0\ |${expand:$acl_m2} set acl_m_add_x_orig_rcpt = yes set acl_m_quarantined = $acl_m_quarantined data ') dnl ifelse(SECTION, `ACL_CHECK_MIME', `') # !quarantine and reject deny condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{no}{yes}} log_message = $acl_m2. $acl_m0 message = ${expand:$acl_m2} ifelse(SECTION, `ACL_CHECK_DATA', `dnl logwrite = original recipients: $recipients ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') defer condition = ${if match{$acl_m1}{defer}{yes}{no}} log_message = $acl_m2. $acl_m0 message = ${expand:$acl_m2} ifelse(SECTION, `ACL_CHECK_DATA', `dnl logwrite = original recipients: $recipients ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') drop condition = ${if match{$acl_m1}{drop}{yes}{no}} log_message = $acl_m2. $acl_m0 message = ${expand:$acl_m2} ifelse(SECTION, `ACL_CHECK_DATA', `dnl logwrite = original recipients: $recipients ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `') discard condition = ${if eq{${extract{discard}{$acl_m1}}}{00}{yes}{no}} log_message = $acl_m2. $acl_m0 ifelse(SECTION, `ACL_CHECK_DATA', `dnl logwrite = original recipients: $recipients ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `')