RDM/2 The Russian Electronic Developer Magazine  
RDM/2 Русский электронный журнал разработчика  
ДомойОт редактораПишите намОбратная связьRU/2

Написание фильтров сообщений для почтового сервера Weasel

Почтовый сервер Питера Мойлана (P.J. Moylan) для OS/2 Weasel отличается простотой настройки, удобством и бесплатностью :-). О настройках этого сервера я говорить не буду -- всё сразу начинает работать. Однако хотелось бы остановится на такой возможности сервера, как фильтр сообщений.

Фильтр сообщений -- программа, которая обрабатывает сообщение и возвращает код ошибки серверу для дальнейших действий. Меня интересовали только возможность ограничить размер сообщений, проходящих через сервер, и проверка их на наличие вирусов.

Программа-фильтр указывается здесь (в поле Filter for incoming mail):

weasel
Фильтр проверяет всю почту, проходящую через 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 это первый раз, когда он мне понадобился. Все мои файлы можно взять тут.

С уважением,
Роман Попов, http://www.lebgok.ru
Нашел я скрипт-вирус I-Worm.MTX. И Panda показала себя не с лучшей стороны. Сказывается отсутствие обновлений вирусных баз. AVP напротив нашел этот вирус. Конечно, только Вы решаете какой антивирус стоит использовать (есть еще и другие), но если вы решите использовать AVP то, секцию фильтра следдует переписать (параметры коммандной строки AVP измените сами) :
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 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов
(C) Russian Underground/2