divert(-1) # # Copyright (c) 2003, 2004 Victor Ustugov # This hack is under BSD License # Redistributions of source code must retain the above copyright notice # # hacks disscussion's maillist - http://www.mta.org.ua/mailman/listinfo/sendmail-conf # # # Check DSN # # проверка фиктивных DSN # dnl # исключение из проверки DSN сообщений от авторизованных отправителей dnl # define(`confCHECK_DSN_SKIP', `AUTH')dnl dnl # dnl # исключение из проверки DSN исходящих сообщений, подробней см. HACK(`is_outgoing') dnl # define(`confCHECK_DSN_SKIP', `OUTGOING')dnl dnl # dnl # исключение из проверки DSN сообщений: dnl # MAIL FROM которых указан в access_db в виде: dnl # CheckDSN:mailbox@subdomain.maildomain OK dnl # CheckDSN:subdomain.maildomain OK dnl # CheckDSN:maildomain OK dnl # $&{client_name} указан в access_db в виде: dnl # CheckDSN:hostname.subdomain.maildomain OK dnl # CheckDSN:subdomain.maildomain OK dnl # CheckDSN:maildomain OK dnl # $&{client_addr} указан в access_db в виде: dnl # CheckDSN:A.B.C.D OK dnl # CheckDSN:A.B.C OK dnl # CheckDSN:A.B OK dnl # CheckDSN:A OK dnl # define(`confCHECK_DSN_SKIP', `EXCLUDED')dnl dnl # dnl # несколько значений можно указывать через пробел: dnl # define(`confCHECK_DSN_SKIP', `AUTH OUTGOING EXCLUDED') dnl # divert(0) VERSIONID(`$Id: check_DSN.m4,v 8.12-07 2004/11/04 13:20:33 corvax Exp $')dnl divert(-1) dnl dnl LOCAL_CONFIG dnl dnl ifdef(`confCHECK_DSN_SKIP', `', `define(`confCHECK_DSN_SKIP', `AUTH OUTGOING EXCLUDED')') dnl dnl LOCAL_RULESETS dnl dnl SLocal_check_mail # Clear the macro for the next message R $* $: $(macro {Header_Content_Type} $) $1 R $* $: $(macro {Header_From} $) $1 ifdef(`confCHECK_NRCPT_FOR_NULL_SENDER', `ifelse(confCHECK_NRCPT_FOR_NULL_SENDER, `YES', `dnl SLocal_check_rcpt R $* $: $1 $| <$&f> $| <$&{nrcpts}> R $* $| <> $| <0> $: $1 R $* $| <> $| <$+> $#error $: 552 Only one receipient accepted for NULL sender R $* $| <$*> $| <$*> $: $1 ')') # правило для проверки поля Content-Type HContent-Type: $>+Check_Content_Type dnl SCheck_Content_Type dnl # сохранение значение поля Content-Type R $* $: $(macro {Header_Content_Type} $@ $1 $) $1 # правило для проверки поля From HFrom: $>+Check_From dnl SCheck_From dnl # сохранение значения поля From R $* $: $(macro {Header_From} $@ $1 $) $1 # после приема всех полей заголовка проверяем соответствие MAIL FROM, From, Content-Type Scheck_eoh # Check the macro R $* $: < $&{mail_addr} > < $&{Header_From} > < $&{Header_Content_Type} > <$1> dnl # если MAIL FROM не пустой, дальшейшую проверку не производим R <$+> <$*> <$*> <$*> $: <$4> ifelse_strstr(confCHECK_DSN_SKIP, `AUTH', `dnl # skip checks for authentificated senders R $+ $: $1 $| $&{auth_type} R $+ $| $+ $: $1 R $+ $| $: $1 ') ifelse_strstr(confCHECK_DSN_SKIP, `OUTGOING', `dnl # skip checks for outgoing messages R $+ $: $1 $| $&{IsOutgoing} R $+ $| YES $: $1 R $+ $| $* $: $1 ') ifelse_strstr(confCHECK_DSN_SKIP, `EXCLUDED', `dnl # skip checks for excluded messages R $* $: $1 $| $&{mail_addr} $| R $* $| $+ @ $+ $| $: $1 $| $2 $| $>SearchList $| <> R $* $| $+ $| $: $1 $| $2 $| $>SearchList $| <> R $* $| $+ $| $: $1 R $* $| $+ $| $: $1 R $* $| $+ $| $* $: $1 R $* $| $* $: $1 R $* $: $1 $| $&{client_name} $| R $* $| $+ $| $: $1 $| $2 $| $>SearchList $| <> R $* $| $+ $| $: $1 R $* $| $+ $| $: $1 R $* $| $+ $| $* $: $1 R $* $| $* $: $1 R $* $: $1 $| $&{client_addr} $| R $* $| $+ $| $: $1 $| $2 $| $>A <$2> <> R $* $| $+ $| <> $: $1 R $* $| $+ $| <> $: $1 R $* $| $+ $| $* $: $1 R $* $| $* $: $1 ') # если значение поля Content-Type начинается с "multipart/report; report-type=delivery-status" и # mailbox из поля From содержит Mailer-Daemon, postmaster или mailer, считаем DSN корректным R < > <$* Mailer-Daemon @ $* > < multipart / report ; report-type = delivery-status $*> <$*> $: <$4> R < > <$* postmaster @ $* > < multipart / report ; report-type = delivery-status $*> <$*> $: <$4> R < > <$* mailer @ $* > < multipart / report ; report-type = delivery-status $*> <$*> $: <$4> R < > <$* Mailer-Daemon @ $* > < > <$*> $: <$3> R < > <$* postmaster @ $* > < > <$*> $: <$3> R < > <$* mailer @ $* > < > <$*> $: <$3> # в противном случае отвергаем сообщение R < > <$*> <$*> <$*> $#error $: 552 " Message looks like a fake DSN" R <$*> <$*> <$*> <$*> $: $4 R <$*> $: $1 dnl