Это скрипт спам-фильтра под Eserv. Он очень прост, иногда банит нормальные письма, но в 95% работает правильно и свою главную задачу выполняет - недает спаму и вирусам расползаться "по офису".
Суть работы:
Скрипт берет файл с письмом из одной директории, проверяет его на наличие словосочетаний (по файлу $smapmerz), если находит - меняет адрес получателя и добавлет в тему спец. знак ($spammark).
Затем перекладывает письмо в другую папку, для разбора его уже непоследстванно Eserv тоссером.
Попутно он также ведет лог (файл - MMDDspam.log) всех обработанных им писем, от кого они были, какого размера и по какому условию признаны спамом.
Исходный код:
#!/usr/local/bin/perl
$smapmerz="spamerz.txt"; # файл спамеров
$spammark=".:~:."; # отметка спамерского письма
$to_check_dir="D:/Eserv2/mail/spool/to_check";# директория к проверке
$spool_dir="D:/Eserv2/mail/spool";# директория к проверке
$log_dir="D:/Eserv2/log";# директория лог файла
$fstr=150; # в скольки первых строках проверять.
$i=$ii=$j=$size=0;
$month_num='';
$subjtext='';
$returnmess='';
@mid_en=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
open (FILE, "$smapmerz") || die "Can't open file $smapmerz: \n $! \nand\n $^E";
chomp(@line=);
close (FILE);
opendir (DIR, "$to_check_dir") || die "couldn't open $to_check_dir : $!\n";
while ( defined ($file[$ii]=readdir DIR)) {
$delpos=$subjpos=0;$spam='no';$reason='';
if ($file[$ii]=~ /POP3|LOCAL/ && -f "$to_check_dir/$file[$ii]") {
open (MESS, "<$to_check_dir/$file[$ii]") || die "Can't open file {+}
{+} $to_check_dir/$file[$i] : \n $! \nand\n $^E";
@message=;
close (MESS);
$fstr=$#message;
for ($i=0;$i<$fstr;$i++) {
if ($message[$i]=~ /For: /i && $delpos==0) {
$delpos=$i;
$to_adr=$';
}
if ($message[$i]=~ /(Subject:)/i) {
$subjpos=$i;
$subjtext=$';
if ($subjtext eq '') { # тему письма надо заполнять иначе буду считать спамом
$spam='yes';
}
}
if ($message[$i]=~ /Return-Path: /i) {
$return=$';
}
if ($message[$i]=~ /Received: /i) {
($domain)=$message[$i]=~ /\.([a-zA-z1-9]*\.(?:com|ru|net|org|edu|ua))/;
}
for ($j=0;$j<$#line;$j++) {
if ($spam eq 'no') {
if ($message[$i]=~ /$line[$j]/i) {
$spam='yes';
$reason=$line[$j];
}
}
}
}
$now=scalar(localtime);
&SplitTime($now);
GetMonthEnNumber($now{"month_now"});
my $day_now;
if ($now{"day_now"}<10) { $day_now="0".$now{"day_now"}; }
else { $day_now=$now{"day_now"}; }
$tt=$now{"hour_now"}.":".$now{"minute_now"}.":".$now{"second_now"};
$flog=$month_num. $day_now."spam.log";
if ($spam eq 'yes') {
$message[$delpos]="For: spam\@shanglipharma\.com\n";
$message[$subjpos]="Subject: $spammark ".$subjtext;
$logmess=";SPAM;";
$filename="";
my ($temp);
$temp=int(rand(100));
$filename="admin\@shanglipharma.com!".$now{"day_now"}."-".$now{"day_now"}. {+}
{+} "-02-".$now{"hour_now"}."-".$now{"minute_now"}."-".$now{"second_now"}. {+}
{+} "!".$temp."!LOCAL!.eml";
} else {
$logmess="; ;";
$reason=chomp($to_adr);
$reason='';
}
open (FILE, ">>$spool_dir/$file[$ii]") || die "Can't open file {+}
{+} $to_check_dir/$file[$i] : \n $! \nand\n $^E";
for ($k=0;$k<=$fstr;$k++) {
print FILE "$message[$k]";
}
close (FILE);
$size=(-s "$to_check_dir/$file[$ii]");
unlink("$to_check_dir/$file[$ii]");
open (FILE, ">>$log_dir/$flog") || die "Can't open file $to_check_dir/$file[$i] {+}
{+} : \n $! \nand\n $^E";
print FILE "$tt$logmess$file[$ii];$reason;$size;\n";
close (FILE);
}
}
closedir (DIR);
sub SplitTime { # Делаем из даты хеш
$now=~ s/ / /g; # Убираем двойные пробелы
$now=~ s/ /:/g; # Заменяем пробелы на двоеточия
@now=split(/:/,$now);
$now{"week_now"}=$now[0];
$now{"month_now"}=$now[1];
$now{"day_now"}=$now[2];
$now{"hour_now"}=$now[3];
$now{"minute_now"}=$now[4];
$now{"second_now"}=$now[5];
$now{"year_now"}=$now[6];
}
sub GetMonthEnNumber {
foreach $i (0 .. $#mid_en){
if ($_[0] eq $mid_en[$i]){$month_num=$i+1;};
};
if ($month_num<10) {$month_num = "0$month_num";};
return $month_num;
}
Содержание файла spamerz.txt (выборка):
Проверка производится рег. выражением, поэтому в файле можно их использовать.
Делаете пересылку с адреса spam@qwerty.com на адрес вашего сис. админа (если он у вас есть).
Ставите в Outlook'е правило удалять/перемещать в спец. папку письма содержащие отметку $spammark в теме. Я предпочитаю их перемещать и еще раз быстро просматривать перед удалением. Если что всегда можно достать письмо и переслать его по нужному адресу. Иногда я еще жалуюсь на спамеров админам free-web-mail'ов и часто они удаляют ящики соответствующим пользователям.
<!-- примечание -->
Знак {+} означает что вы должны соединить эту и следующую строки в одну без пробелов.
Где взять Eserv?
Как организовать складирование приходящей почты в папку to_check? Спрашивайте на форуме разработчиков Eserv'a.
<!-- спасибо! -->
: BBCode
: HTML
<!-- внимание! -->
Код, текст и фотографии размещенные на этом сайте принадлежат их автору - Сапронову Артёму Александровичу.
Допускается использование материалов сайта в личных целях.
Приветствуется распространение с обязательным указанием активной гиперссылки на страницу, с которой взят материал.
Запрещается внесение изменений в исходный текст (в том числе синонимизация и рерайт).
Использование материалов сайта в коммерческих целях без согласования с автором запрещено.
Обращайте внимание на даты. Некоторые страницы морально устарели.
Автор не несет отвественности за любые возможные последствия связанные с использованием материалов сайта.
С предложениями, замечаниями или пожеланиями обращайтесь по email.