Основные возможности:
Внимание, данные скрипты используются для упрощения процесса конвертации писем утилитой
mapitool и обучения
spamassassin.
-
Помогает конвертировать письма из формата msg в eml;
-
Помогает обучать spamassassin.
Описание cкриптов для обучения spamassassin.
Внимание, данные скрипты используются для упрощения процесса конвертации писем и обучения spamassassin.
Зависимости:
Для работы скриптов, должны быть установлены:
Для обучения spamassassin используется группа скриптов в каталоге salearnsh:
Структура каталогов.
- ham
- hamloaded
- hammsg
- hammsgloaded
- spam
- spamloaded
- spammsg
- spammsgloaded
Список скриптов:
- emltoeml.sh
- msgtoeml.sh
- reneml.sh
- renmsg.sh
- salearnham.sh
- salearnspam.sh
здесь ren*.sh - скрипт для переименования файлов (заменяет символы "!", "$", " ", "+", "%", "(", ")" и "," на _ );
emltoeml.sh - обрабатывает письмо формата eml (удаляет некоторые блоки);
msgtoeml.sh - конвертирует письмо из формата msg в eml;
salearn*.sh - обучает spamassassin.
Есть два варианта обучения:
- исходные письма в формате msg (из Outlook):
- спам положить в spammsg, неспам - в hammsg;
- выполнить пункты Обучение 1a, 2a (для спама c ключом spammsg, для неспама с ключом hammsg) и 3;
- исходные письма в формате eml (тело письма — обычный текст):
- спам положить в spam, неспам - в ham;
- выполнить пункты Обучение 1b, 2b (для спама c ключом spam, для неспама с ключом ham) и 3.
Обучение:
- Переименовать файлы:
- Запустить renmsg.sh с ключом spammsg или hammsg;
- Запустить reneml.sh с ключом spam или ham;
- Конвертировать/обработать файлы:
- Запустить msgtoeml.sh с ключом spammsg или hammsg (только для писем в формате msg);
- Запустить emltoeml.sh с ключом spam или ham (только для писем в формате eml);
- Запустить salearnspam.sh или salearnham.sh без ключей (запуск производится root`ом от имени vscan).
После обучения, письма перемещаются в каталоги {spam|ham|spammsg|hammsg}loaded соответственно.
Известные баги:
- После конвертации, блок "Content-Type: text/plain" перекодируется в UTF-8, а "Content-Type: text/html" остается в прежней кодировке.
- После конвертации, отсутствует упоминание о кодировке блоков, "charset" - не указан.
- Следствием этого является некорректное распознавание русского языка модулем TextCat.
Вероятно в стабильной версии ruby-msg будет реализована возможность сохранять кодировку письма, а пока оптимальным вариантом вижу использование вместо Outlook другого почтового клиента с поддержкой IMAP4 (например Thunderbird, Kmail, Evolution и т.д.) и возможностью сохранения писем прямо в формат eml. Обучать spamassassin напрямую, а скрипт msgtoeml.sh использовать только для получения общей информации о письме.
Пример комплекта скриптов salearnsh:
(Скачать файл можно будет
здесь. ЗЫ Не тыкать! Жать правой кнопкой: сохранить ссылку как...)
Текст:
Файл emltoeml.sh:
#!/bin/sh
if [ "$1" = "" ]; then
echo "# Directory not set!"
echo "# Use: $0 Directory(spam|ham)"
exit
fi
pattern="Received: {1,2}from (mail\.example\.ru .{2}10\.1\.1\.1.{2} by mail\.example\.local|localhost .{1}localhost .{1}127\.0\.0\.1.{2} by mail\.example\.ru)"
pattern1="X-(Virus-Scanned: amavisd-new at example\.ru|Spam-(Flag|Score|Level|Status):)"
patternx="\*{3}SPAM\*{3}"
if [ "$1" = "spam" ]; then
if [ ! -d ./$1 ]; then
echo "# Directory $1 not exist!"
exit
fi
files=`ls -1 ./$1/*.eml | sed -e 's/\.eml$//' -e 's/^\.\/'$1'\///'`
for i in $files
do
echo "# Converting mail ./$1/$i.eml to ./spam/$i.eml"
sed -r -e "/^$pattern/ d" -e "/^$pattern1/ d" -e "s/$patternx//" ./spam/$i.eml > ./spam/$i.eml.tmp
rm -f ./spam/$i.eml
rename ".eml.tmp" ".eml" ./spam/$i.eml.tmp
done
elif [ "$1" = "ham" ]; then
if [ ! -d ./$1 ]; then
echo "# Directory $1 not exist!"
exit
fi
files=`ls -1 ./$1/*.eml | sed -e 's/\.eml$//' -e 's/^\.\/'$1'\///'`
for i in $files
do
echo "# Converting mail ./$1/$i.eml to ./ham/$i.eml"
sed -r -e "/^$pattern/ d" -e "/^$pattern1/ d" -e "s/$patternx//" ./ham/$i.eml > ./ham/$i.eml.tmp
rm -f ./ham/$i.eml
rename ".eml.tmp" ".eml" ./ham/$i.eml.tmp
done
else
echo "# Directory incorrect! Use spam or ham"
fi
Файл msgtoeml.sh:
#!/bin/sh
if [ "$1" = "" ]; then
echo "# Directory not set!"
echo "# Use: $0 Directory(spammsg|hammsg)"
exit
fi
pattern="Received: {1,2}from (mail\.example\.ru .{2}10\.1\.1\.1.{2} by mail\.example\.local|localhost .{1}localhost .{1}127\.0\.0\.1.{2} by mail\.example\.ru)"
pattern1="X-(Virus-Scanned: amavisd-new at example\.ru|Spam-(Flag|Score|Level|Status):)"
patternx="\*{3}SPAM\*{3}"
if [ "$1" = "spammsg" ]; then
if [ ! -d ./$1 ]; then
echo "# Directory $1 not exist!"
exit
fi
files=`ls -1 ./$1/*.msg | sed -e 's/\.msg$//' -e 's/^\.\/'$1'\///'`
for i in $files
do
echo "# Converting mail ./$1/$i.msg to ./spam/$i.eml"
mapitool -siv ./$1/$i.msg > ./spam/$i.eml.tmp
sed -r -e "/^$pattern/ d" -e "/^$pattern1/ d" -e "s/$patternx//" -e "s/\x0d$//" ./spam/$i.eml.tmp > ./spam/$i.eml
rm -f ./spam/$i.eml.tmp
done
elif [ "$1" = "hammsg" ]; then
if [ ! -d ./$1 ]; then
echo "# Directory $1 not exist!"
exit
fi
files=`ls -1 ./$1/*.msg | sed -e 's/\.msg$//' -e 's/^\.\/'$1'\///'`
for i in $files
do
echo "# Converting mail ./$1/$i.msg to ./ham/$i.eml"
mapitool -siv ./$1/$i.msg > ./ham/$i.eml.tmp
sed -r -e "/^$pattern/ d" -e "/^$pattern1/ d" -e "s/$patternx//" -e "s/\x0d$//" ./ham/$i.eml.tmp > ./ham/$i.eml
rm -f ./ham/$i.eml.tmp
done
else
echo "# Directory incorrect! Use spammsg or hammsg"
fi
здесь используются дополнительные pattern`ы для удаления и замены некоторых заголовков письма, а также замена окончания строки CR/LF на LF:
sed -e "s/\x0d$//".
Файл renmsg.sh:
#!/bin/sh
if [ "$1" = "" ]; then
echo "# Directory not set!"
echo "# Use: $0 Directory(spammsg|hammsg)"
exit
fi
echo "Starting find!"
check=`find ./$1 -regex '.* .*\.msg$'`
while [ "$check" != "" ];
do
rename " " _ ./$1/*.msg
check=`find ./$1 -regex '.* .*\.msg$'`
echo "#"
done
for rnm in \! "\$" "%" "(" ")" ",";
do
check2=`find ./$1 -regex ".*$rnm.*\.msg$"`
while [ "$check2" != "" ];
do
rename $rnm _ ./$1/*.msg
check2=`find ./$1 -regex ".*$rnm.*\.msg$"`
echo "#2"
done
done
check3=`find ./$1 -regex '.*\+.*\.msg$'`
while [ "$check3" != "" ];
do
rename \+ _ ./$1/*.msg
check3=`find ./$1 -regex '.*\+.*\.msg$'`
echo "#3"
done
echo \n "End!"
в файле reneml.sh заменено msg на eml и spammsg|hammsg на spam|ham.
Файл salearnspam.sh:
#!/bin/sh
echo "Запуск от имени vscan:"
sudo -u vscan sa-learn --spam ./spam
mv ./spam/* ./spamloaded/
mv ./spammsg/* ./spammsgloaded/
в файле salearnham.sh заменено все начинающееся с spam на ham соответственно.
Здесь запуск обучения проводится от имени vscan для того чтобы spamassassin,
вызываемый фильтром amavisd-new, смог работать с базой в каталоге {vscan_home_dir}/.spamassassin/.
Владелец базы: vscan:vscan, права доступа: 600.