The Russian Electronic Developer Magazine | |
Русский электронный журнал разработчика | |
Фильтр сообщений -- программа, которая обрабатывает сообщение и возвращает код ошибки серверу для дальнейших действий. Меня интересовали только возможность ограничить размер сообщений, проходящих через сервер, и проверка их на наличие вирусов.
Программа-фильтр указывается здесь (в поле Filter for incoming mail):
Фильтр проверяет всю почту, проходящую через SMTP. Сервер передаёт фильтру два параметра: файл-сообщение и файл, содержащий электронные адреса отправителя и получателей (файл-список), например:
<pro@lebgok.ru> <user@domain.com> ...
Первой строкой идёт отправитель, в следующих -- получатели. Фильтр должен вернуть одно из четырёх значений:
0 - всё нормально, передать почтуВ качестве фильтра я использовал следующий командный файл:
1 - почту передать по новым адресам (фильтр должен обработать соответственно файл-список)
2 - почтовое сообщение уничтожить, не передавать. Клиенту вернуть код 250 - всё нормально.
3 - почтовое сообщение не принимать. Клиенту вернуть код 554 - отказ в обслуживании.
@echo off rem ***************** rem Проверка на максимальный обьем rem ***************** call e:\weasel\maxsize.cmd %1 %2 300000 if errorlevel 1 goto max rem ***************** rem Проверка на вирус rem ***************** E:\PAVOS2\PAVCL.EXE /NOB /CMP /AEX /NOR /NOS %1 if errorlevel=128 goto virus if errorlevel=1 goto adm goto end REM ****************** REM Посылка письма админу об ошибке антивируса REM ****************** :adm call e:\weasel\send.cmd -f weasel@lebgok.ru -t pro@lebgok.ru e:\weasel\msg\erravp.msg call e:\weasel\err.cmd 0 goto end :virus echo Обнаружен вирус REM ****************** REM Посылка сообщений о вирусе REM ****************** call e:\weasel\genmsgv.cmd %2 call e:\weasel\sender.cmd -f weasel@lebgok.ru -n %2 e:\weasel\msg\virus.msg e:\weasel\err.cmd 2 goto end :max REM ******************* REM Превышен допустимый размер почтового сообщения REM ******************* call e:\weasel\sender.cmd -f weasel@lebgok.ru -n %2 e:\weasel\msg\errmax.msg e:\weasel\err.cmd 2 :endИтак, по порядку. Файл MAXSIZE.CMD:
/* Программа проверки размера файла */ PARSE ARG userargs PARSE VAR userargs FileMSG userargs PARSE VAR userargs EmailFile userargs PARSE VAR userargs MaxSize userargs fltname='maxsize.flt' EmailFrom=LineIn(EmailFile,1,1) EmailTo=LineIn(EmailFile,,1) EmailTo=STRIP(EmailTo,,'<') EmailTo=STRIP(EmailTo,,'>') EmailFrom=STRIP(EmailFrom,,'<') EmailFrom=STRIP(EmailFrom,,'>') str=linein(fltname,1,1) DO WHILE LINES(fltname) str=LINEIN(fltname,,1) IF SUBSTR(str,1,1) \= ';' THEN DO PARSE VAR str emailBase str PARSE VAR str MaxSizeForUser str END IF emailBase=emailFrom THEN DO MaxSize=MaxSizeForUser LEAVE END END IF stream(FileMSG,'c','query size')>MaxSize THEN DO 'call e:\weasel\genmsgs.cmd' EmailTo MaxSize EXIT 1 END EXIT 0Эта програмка получает имя файла-сообщения для проверки размера, имя файла-списка для генерации сообщения и размер почтового сообщения, разрешённого по умолчанию. Программа может использовать дополнительный файл MAXSIZE.FLT, где можно указать другие размеры для конкретного пользователя, например:
; файл для разрешения различных размеров сообщений ; ; формат ; email size andrey@lebgok.ru 30000000 pro@lebgok.ru 30000000 av@lebgok.ru 30000000В этом файле можно указать не только локальных пользователей, но и любых других, которые шлют почту через ваш сервер. Можно не только увеличить размер по умолчанию, но и уменьшить.
Программа MAXSIZE.CMD, если размер превышен, вызывает файл GENMSGS.CMD, генерирующий файл-сообщение, которое будет послано пользователю. Для создания файла с сообщением об ошибке я сделал следующее: создал сообщение, послал его себе, скопировал из почтового ящика (каталога) и слегка обработал заголовок -- получилось нечто следующее:
/* Генератор сообщения о превышении размера */ PARSE ARG userargs PARSE VAR userargs email userargs PARSE VAR userargs sz userargs fmsg='e:\weasel\msg\errmax.msg' s='Ваше электронное письмо для ' || email || ' превышает допустимый размер ' || sz/1000 ' Кб.' engl='Your electronic letter for ' || email || ' exceeds the allowable size ' || sz/1000 ' Kb.' r=lineout(fmsg,,1) r=lineout(fmsg,'Message-ID: <3A443FCA.FCBDED3D@lebgok.ru>') r=lineout(fmsg,'X-Accept-Language: en') r=lineout(fmsg,'MIME-Version: 1.0') r=lineout(fmsg,'Subject: Warning message') r=lineout(fmsg,'Content-Type: text/html;') r=lineout(fmsg,' boundary="------------A7C103DBB53865AC9B49B4E9"') r=lineout(fmsg,'') r=lineout(fmsg,'') r=lineout(fmsg,'--------------A7C103DBB53865AC9B49B4E9') r=lineout(fmsg,'Content-Type: text/plain; charset=koi8-r') r=lineout(fmsg,'Content-Transfer-Encoding: 8bit') r=lineout(fmsg,'') r=lineout(fmsg,'Внимание!') r=lineout(fmsg,'') r=lineout(fmsg,'Ваше письмо для ' || email || ' превышает допустимый размер ' || sz/1000 || 'Кб') r=lineout(fmsg,'Письмо получателю не отправлено!') r=lineout(fmsg,'') r=lineout(fmsg,'Уменьшите размер сообщения и повторите посылку сообщения.') r=lineout(fmsg,'') r=lineout(fmsg,'Администратор сети ОАО "Лебединский ГОК"') r=lineout(fmsg,'') r=lineout(fmsg,'') r=lineout(fmsg,'Attention!') r=lineout(fmsg,'') r=lineout(fmsg,'Your letter for ' || email || ' exceeds the allowed size ' || sz/1000 'Kb') r=lineout(fmsg,'The letter to the addressee is not sent!') r=lineout(fmsg,'') r=lineout(fmsg,'Reduce the size of the message and repeat a parcel of the message.<br>') r=lineout(fmsg,'') r=lineout(fmsg,'The Administrator of a network Job Stock Company "Lebedinsky GOK"') r=lineout(fmsg,'') r=lineout(fmsg,'--------------A7C103DBB53865AC9B49B4E9--') r=lineout(fmsg,'--------------A7C103DBB53865AC9B49B4E9--') r=lineout(fmsg) exitТут я вырезал картинку, которая у меня вставлена в сообщение (логотип организации), но всё равно вы своё сообщение делать будете (если будете, конечно). Надеюсь, что главное понятно.
Для посылки сообщения я использую программу SEND.CMD, взятую со страницы Weasel. Но я её немного изменил, чтобы можно было передать емайл в виде первой строки файла, и переименовал её в SENDER.CMD.
старый формат вызова:
send.cmd -f емайлОТКОГО -t емайлКОМУ файлсообщениеновый:
sender.cmd -f емайлОТКОГО -n Файл_в_первой_строке_которого_емайлКОМУ файлсообщениеВспомогательный файл ERR.CMD возвращает то, что получает:
/* * */ PARSE ARG userargs PARSE VAR userargs Err userargs EXIT ErrТеперь об антивирусе. Сначало я хотел использовать AVP, но он не находит вируса в тестовом файле EICAR.HTML (от последнего AVP for Windows) даже если из него сделать eicar.com. Я переписывался с support@avp.ru по вопросу, будет ли находить AVP for OS/2 script-вирусы, но их фраза "Да, будут ловиться подобные вирусы" меня не убедила. Кроме того, мне принесли диск с рефератами в формате Word и я решил проверить их. Результаты довольно интересны: AVP - 6 тел 1-го вируса, Panda - 43 тела 2-х вирусов, и я воспользовался Panda Antivirus (или c Hobbes). Только пропишите к нему путь в PATH и LIBPATH в CONFIG.SYS после инсталляции.
Весь скрипт-генератор сообщения о вирусе я приводить не буду -- он такой же, как и для сообщения о превышении размера, с тем исключением, что ему передается не готовый емайл, а файл с первой строкой емайла:
/* Генератор сообщения о наличии вируса*/ PARSE ARG userargs PARSE VAR userargs emailfile userargs emailfrom=LineIn(emailfile,1,1) emailto=LineIn(emailfile,,1) fmsg='e:\weasel\msg\virus.msg' emailto=STRIP(emailto,,'<') emailto=STRIP(emailto,,'>') ........ .......Вот, в общем-то, и всё. Надеюсь, что всё достаточно понятно и просто. Всё это работает на WSeB.
Прошу простить за мой REXX. За всё время пользования OS/2 это первый раз, когда он мне понадобился. Все мои файлы можно взять тут.
С уважением,Нашел я скрипт-вирус I-Worm.MTX. И Panda показала себя не с лучшей стороны. Сказывается отсутствие обновлений вирусных баз. AVP напротив нашел этот вирус. Конечно, только Вы решаете какой антивирус стоит использовать (есть еще и другие), но если вы решите использовать AVP то, секцию фильтра следдует переписать (параметры коммандной строки AVP измените сами) :
Роман Попов, http://www.lebgok.ru
rem ******************* rem Проверка на вирус rem ******************* avplite2.exe /S /WA=\avp\report\REPORT.TXT /F=\avp\LITE.PRF %1 > nul if errorlevel=16 goto adm if errorlevel=2 goto virus if errorlevel=1 goto adm goto end
Интересные ссылки:
Портал развития и сопровождения вашего бизнеса.
Комментариев к странице: 0 | Добавить комментарий
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов