Конфигурация milter-regex
Допускаются действия пяти видов. Ответ представляет собой текстовую строку и задается в двойных или одинарных кавычках:
reject "Ответ"
команда
...
tempfail "Ответ"
команда
...
continue
команда
...
discard
команда
...
accept
команда
...
Команды соответствуют командам протокола SNMP:
connect шаблон шаблон
helo шаблон
envfrom шаблон
envrcpt шаблон
header шаблон шаблон
body шаблон
Шаблон - это регулярное выражение в произвольных разделителях плюс необязательный флаг:
e - расширенное выражение (REG_EXTENDED для regcomp)
i - не различать малые-большие буквы
n - наоборот, отрицание сравнения
d - выдача отладочной информации в лог-файл
Из команд можно строить логические выражения, используя круглые скобки и операторы and, or, not. Можно создавать макросы вида:
friends = header /^Received$/ /^from [^ ]*(ork.net|home.com)/e
attachments = header ,^Content-Type$, ,multipart/mixed, and \
body ,^Content-Type: application/,
executables = $attachments and body ,name=".*.(pif|exe|scr)"$,e
Полный текст milter-regex.conf
# Проверка имени хоста
#-------------------------------------------------------
continue
connect `^localhost$`i `127\.0\.0\.1`
connect `=(/etc/mail/hosts-white)$`ie ``
reject "Your host name is invalid"
connect `\.in-addr\.arpa$`i ``
connect `\.`n `127\.0\.0\.1`n
tempfail "Your host IP address not resolving - check DNS, or send via SMTP server of your provider"
connect `\[.*]` ``
reject "Direct mail from your host is not permitted - send via SMTP server of your provider"
connect `[.-][[:digit:]]+[.-][[:digit:]]`ie ``
reject "Direct mail from your host is not permitted"
connect `=(/etc/mail/hosts-black)$`ie ``
# Все, что не от своих, должно иметь Message-Id.
reject "Invalid message format"
connect `=(/etc/mail/hosts-white)$`ien `` and \
not header `^Message-Id$`i `<.*>`
# Проверка получателя
#-------------------------------------------------------
reject "Adressee invalid"
envrcpt `<.*>`n
continue
*envrcpt `<postmaster@`i
*envrcpt `<MAILER-DAEMON@`i
continue # в домене cronyx.ru
*envrcpt `<=(/etc/mail/users)@cronyx\.ru>`ie
discard envrcpt `@cronyx\.ru>`i
continue # в домене www.cronyx.ru
*envrcpt `<www-adm@www\.cronyx\.ru>`i
*envrcpt `<info-adm@www\.cronyx\.ru>`i
discard envrcpt `@www\.cronyx\.ru>`i
continue # в домене vak.ru
*envrcpt `<vak@vak\.ru>`i
discard envrcpt `@vak\.ru>`i
# Проверка отправителя
#-------------------------------------------------------
reject "Sender invalid"
envfrom `<.*>`in
envfrom `<<>@`
envfrom `<""@`
envfrom `?`
discard
envfrom `<[0-9]*@.*cronyx\.ru>`i
continue
envfrom `<MAILER-DAEMON@hanoi\.cronyx\.ru>`i
envfrom `<antivirus-notify@hanoi\.cronyx\.ru>`i
envfrom `<delivery@bill\.mts\.ru>`i
discard
envfrom `<anonymous@`i
envfrom `<bounce@`i
envfrom `<bounces@`i
envfrom `<reklama@`i
envfrom `@bounce\.`i
envfrom `\.@`i
reject "Spam rejected"
envfrom `[@.]=(/etc/mail/emails-black)>`ie
envfrom `<=(/etc/mail/emails-black)>`ie
# Проверка пути письма - заголовки Received
#-------------------------------------------------------
continue
*header `^Received$`i `localhost *( *localhost *)`i
# Пропускаем эаголовок, если это не через знакомый сервер
*header `^Received$`i `by *=(/etc/mail/myrelays)[[:space:]]`ien
*header `^Received$`i `(localhost \[127\.0\.0\.1])`i
*header `^Received$`i `\( *=(/etc/mail/hosts-white) *\[`ie
*header `^Received$`i `\( *=(/etc/mail/hosts-white) *\)`ie
reject "Spam rejected"
*header `^Received$`i `\( *[[:alnum:]-]+ *\[`ie
*header `^Received$`i `\( *[[:alnum:].-]*=(/etc/mail/hosts-black) *\[`ie
tempfail "Your host IP address not resolving, check DNS"
*header `^Received$`i `( *[^)][^)]*) *( *\[.*] *)`i
*header `^Received$`i `( *\[.*])`i
*header `^Received$`i `(.*@ *\[.*])`i
# Проверка поля To
#-------------------------------------------------------
reject "Spam rejected"
*header `^To$`i `undisclosed-recipients`i
*header `^To$`i `unlisted-recipients`i
*header `^To$`i `^$`i