FreeBSD 5.0 + sendmail + spamassasin + procmail
МЭНы и конфу читал, но пока не получается...Стоит SpamAssasin и метит всю почту своими тэгами. Задача в следующем - организовать через procmail следующий алгоритм:
Если X-Spam-Flag: YES, то
Если score > 20, то письмо удалить,
Если 10 < score < 20, то перенаправить письмо на spam@maycorp.ru,
Если score < 10, то с письмом ничего не делать (т.е. оправить дальше юзеру)
Конец Если.Что не получается:
1) procmail обрабатывает только почту приходящую на _локальные_ ящики сервера, но у меня несколько доменов и для многих из них стоит в virtualusertable
@mycorp2.ru %1@smtp.mycorp2.ru
@mycorp3.ru %1@smtp.mycorp3.ru
т.к. внешний SMTP сервер один для всех доменов, а maycorpXYZ.ru находяться в корпоративной локалке.
Так вот, Procmail не обрабатывает письма для таких доменов.
============ sendmail.mc =================
divert(-1)
divert(0)
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.27 2002/10/16 22:52:56 keramida Exp $
OSTYPE(freebsd5)
DOMAIN(generic)FEATURE(access_db, `hash -o -T<TMPF> /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(`local_procmail')
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')
define(`confCW_FILE', `-o /etc/mail/local-host-names')
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
define(`confMAX_MIME_HEADER_LENGTH', `256/128')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
define(`confMILTER_LOG_LEVEL',`6')
MAILER(procmail)dnl
MAILER(local)
MAILER(smtp)
============ sendmail.mc =================
2) Не могу понять как в /usr/local/etc/procmailrc писать условия... Данная конструкция ессно не работает, но хочется что-то именно такого:
======= procmailrc =======
:0
* ^X-Spam-Flag: YES # если спам
* !^X-Sender: Procmail # и не проходило проверку
{
| formail -A"X-Sender: Procmail" # отметить что проверку прошло
:0
* ^X-Spam-Status: *(score > 20) # в зависимости от балла
| sendmail > /dev/null # удаляем
:0
* ^X-Spam-Status: *(10 < score < 20)
| formail -I"To: spam@maycorp.ru | sendmail -t # отправляем на дальнейшее рассмотрение
# как сделать чтоб в письме пришедшем на spam@maycorp.ru в поле TO: стоял адрес,
# на кот. письмо шло изначально, а не "spam@maycorp.ru"?
}
# иначе отправляем как есть
======= procmailrc =======
А зачем такой изврат, когда мильтером можно режектить?
>А зачем такой изврат, когда мильтером можно режектить?Каким именно мильтером? У меня используется spamass-milter.sh. О нем идет речь?
>>А зачем такой изврат, когда мильтером можно режектить?
>
>Каким именно мильтером? У меня используется spamass-milter.sh. О нем идет речь?spamass-milter.sh - скрипт запускающий сам мильтер. курите доку на предмет нужной опции запуска (-r 20?)
>>>А зачем такой изврат, когда мильтером можно режектить?
>>
>>Каким именно мильтером? У меня используется spamass-milter.sh. О нем идет речь?
>
>spamass-milter.sh - скрипт запускающий сам мильтер. курите доку на предмет нужной опции
>запуска (-r 20?)
-r 20 действительно помогло, спасибо.
А как теперь пересылать письма, у которых score От 10 до 20?PS Убивать не могу, но юзерам валиться это тоже не должно...
>-r 20 действительно помогло, спасибо.
>А как теперь пересылать письма, у которых score От 10 до 20?я не пользую spamass-milter. он вроде простой и такого не умеет.
milter-spamc (http://www.snertsoft.com) умеет, но он сейчас коммерческий.
если надо - выложу куданьть последнюю free версию.>PS Убивать не могу, но юзерам валиться это тоже не должно...
режект - это не убивание. в случае ложного срабатывания валидный отправитель должен получить отлуп.
>>-r 20 действительно помогло, спасибо.
>>А как теперь пересылать письма, у которых score От 10 до 20?
>
>я не пользую spamass-milter. он вроде простой и такого не умеет.
>milter-spamc (http://www.snertsoft.com) умеет, но он сейчас коммерческий.
>если надо - выложу куданьть последнюю free версию.
>
>>PS Убивать не могу, но юзерам валиться это тоже не должно...
>
>режект - это не убивание. в случае ложного срабатывания валидный отправитель должен
>получить отлуп.
OK, завтра гляну. Скинь в мыло последнюю free версию пож-та.
По-поводу procmail кто-нить что-нить подсказать может или как?> procmail обрабатывает только почту приходящую на _локальные_ ящики сервера, но у
>меня несколько доменов и для многих из них стоит в virtualusertable
>
>@mycorp2.ru %1@smtp.mycorp2.ru
>@mycorp3.ru %1@smtp.mycorp3.ru
>т.к. внешний SMTP сервер один для всех доменов, а maycorpXYZ.ru находяться в
>корпоративной локалке.
>Так вот, Procmail не обрабатывает письма для таких доменов.
>============ sendmail.mc =================
>divert(-1)
>divert(0)
>VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.27 2002/10/16 22:52:56 keramida Exp $
>OSTYPE(freebsd5)
>DOMAIN(generic)
>
>FEATURE(access_db, `hash -o -T<TMPF> /etc/mail/access')
>FEATURE(blacklist_recipients)
>FEATURE(local_lmtp)
>FEATURE(`local_procmail')
>FEATURE(mailertable, `hash -o /etc/mail/mailertable')
>FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')
>define(`confCW_FILE', `-o /etc/mail/local-host-names')
>define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
>define(`confMAX_MIME_HEADER_LENGTH', `256/128')
>define(`confNO_RCPT_ACTION', `add-to-undisclosed')
>define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
>INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
>define(`confMILTER_LOG_LEVEL',`6')
>MAILER(procmail)dnl
>MAILER(local)
>MAILER(smtp)
>============ sendmail.mc =================
>[оверквотинг удален]
>* ^X-Spam-Flag: YES # если спам
>* !^X-Sender: Procmail # и не проходило проверку
>{
>| formail -A"X-Sender: Procmail" # отметить что проверку прошло
>:0
>* ^X-Spam-Status: *(score > 20) # в зависимости от балла
>| sendmail > /dev/null # удаляем
>:0
>* ^X-Spam-Status: *(10 < score < 20)
>| formail -I"To: spam@maycorp.ru | sendmail -t # отправляем на дальнейшее рассмотрениеРешал похожую задачу для Yandex Spamooborona.
Он вставляет 2 тега, которые приходится проверять:
X-Spam-Flag: YES
X-Spam-Ystatus: hits=71.80
вот соотв. кусок .procmailrc:
:0
* ^X-Spam-Flag: YES
{
:0
* ? test $(/usr/bin/formail -xX-Spam-Ystatus |/bin/sed -e 's/^.*=//' -e 's/...$//') -ge 40
/dev/null
}
вроде всё понятно, скажу только что sed применяется чтобы взять число "hits" (начинается после знака '=') и откусить дробную часть вместе с точкой (последние 3 символа). Потом сравнивается с 40 (указанный яндексом порог).