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

Администрирование почтового сервера Weasel с помощью писем

Это пример скрипта на REXX реализующий возможность добавления, изменения и удаления пользователя в/из weasel.ini. Прочтите мою статью о фильтрах для Weasel. Этот скрипт может работать как самостоятельный фильтр, так и в составе пакетного файла.
Прежде всего о безопасности: письма идут открытым текстом... они сохраняются в папках "Отправленные" и "Удаленные". Некоторые клиенты на самом деле не удаляют письмо с диска - будьте внимательны. Используются следующие "уровни защиты":
1. Письмо должно быть отправлено на определенный адрес
2. Отправитель должен быть включен в список (файл emailedit.txt)
3. Поле Subject должно содержать определенное задание (эти задания никто не должен знать).
Итак, сначала небходимо подредактировать файл скрипта строки:
/******  CONFIG BEGIN  ******/

/* Расположение INI*/
ini='e:\weasel\weasel.ini'

/* Subject для УДАЛЕНИЯ */
sDEL="DELETE"

/* Subject для ИЗМЕНЕНИЯ */
sEDIT="EDIT"

/* Subject для СОЗДАНИЯ НОВОГО */
sNEW="NEW"

/* email "кому" разрешает администрировать */
emailedit='edit@weasel'

/* список email "от кого" разрешается администрировать */
emailFromBase='emailedit.txt'

/*******  CONFIG END *******/
и создать файл emailedit.txt вида:
; первая строка - комментарий
you@domain.com
с допущенными для администрирования e-mail по одному в каждой строке. Все эти настройки желательно никому не говорить :). Setup.exe из поставки Weasel "иногда" добавляет в конец значения MailRoot перевод строки, если в строке:
     Call SysMkDir(MailRoot||email)
возникает ошибка, то это - оно. Я вылечил перенабором MailRoot в SETUP.EXE Weasel`а. Письма должны быть plain/text, тело письма состоит из строк:
NAME: Vasya Pupkin
EMAIL: pupkin
PASS: suxx
COMM: My Boss - Must Die
для удаления, достаточно одного поля "EMAIL:". Если хотите использовать кирилицу, а потом еще и читать из setup.exe - письма надо отсылать в кодировке 866. И сообственно скрипт:
/* Администрирование Weasel с помощью писем*/
call rxfuncadd 'sysloadfuncs', 'rexxutil', 'sysloadfuncs';
call sysloadfuncs

PARSE ARG userargs
PARSE VAR userargs FileMSG userargs
PARSE VAR userargs EmailFile userargs

/******  CONFIG BEGIN  ******/

/* Расположение INI*/
ini='e:\weasel\weasel.ini'

/* Subject для УДАЛЕНИЯ */
sDEL="DELETE"

/* Subject для ИЗМЕНЕНИЯ */
sEDIT="EDIT"

/* Subject для СОЗДАНИЯ НОВОГО */
sNEW="NEW"

/* email "кому" разрешает администрировать */
emailedit='edit@weasel'

/* список email "от кого" разрешается администрировать */
emailFromBase='emailedit.txt'

/*******  CONFIG END *******/

EmailFrom=LineIn(EmailFile,1,1)
EmailTo=LineIn(EmailFile,,1)
EmailTo=STRIP(EmailTo,,'<')
EmailTo=STRIP(EmailTo,,'>')
EmailFrom=STRIP(EmailFrom,,'<')
EmailFrom=STRIP(EmailFrom,,'>')

/* проверка email-получателя */
if EmailTo = EmailEdit then
Do
   rc=seekemail() /* проверка, имеет ли право отправитель администрировать*/
   if rc \= 0 then
    do
      subj=subject() /* определяем поле Subject */ 
      call inifield  /* определяем поля EMAIL,NAME etc */
      SELECT
       when subj=sNEW
          then
            call newedit
       when subj=sDEL
          then
              call dead
       when subj=sEDIT
          then
             do
              call dead
              call newedit
             end
       otherwise
      END
     exit 2 /* письмо обработано - письмо уничтожить */
   end
End
say Subj emailto Emailfrom
EXIT 0 /* письмо не относится к Администрированию - пропустить */
/* Удаление */
DEAD:
  rc=SysIni(ini, email, 'DELETE:')
return
/* Новое */
NEWEDIT:
   rc1=SysIni( ini, email, 'RealName', Name) 
   rc2=SysIni( ini, email, 'Password', Pass)
   rc3=SysIni( ini, email, 'Comments' , Comm)
/* создаем каталог */
     MailRoot=SysIni( ini, '$SYS', 'MailRoot') 
     Call SysMkDir(MailRoot||email)
return
/* Определение email realname password comments */
INIFIELD:
  str=linein(FileMSG,1,1) 
   DO WHILE LINES(FileMSG)
      str=STRIP(LINEIN(FileMSG,,1))

      ePOS=POS('EMAIL:',str)
      nPOS=POS('NAME:',str)
      pPOS=POS('PASS:',str)
      cPOS=POS('COMM:',str)

        IF ePOS \= 0 THEN 
	  email=STRIP(SUBSTR(str,7))
        IF nPOS \= 0 THEN 
	  name=STRIP(SUBSTR(str,6))
        IF pPOS \= 0 THEN 
	  pass=STRIP(SUBSTR(str,6))
        IF cPOS \= 0 THEN 
	  comm=STRIP(SUBSTR(str,6))
   end 
return
/* поиск Subject */
SUBJECT:
  str=linein(FileMSG,1,1) 
   DO WHILE LINES(FileMSG)
      str=LINEIN(FileMSG,,1)
        IF POS('Subject:', STRIP(str)) \= 0 THEN 
        DO
	 PARSE VAR str scum str
	 PARSE VAR str subj str
         LEAVE
        END
   end 
/* возврат в UPPERCASE */
return translate(Strip(subj))
/* провека на допуск администрировать */
SEEKEMAIL:
  str=linein(emailFromBase,1,1) 
   DO WHILE LINES(emailFromBase)
   str=LINEIN(emailFromBase,,1)
   IF SUBSTR(str,1,1) \= ';' THEN 
      do
  	emailBase=str
        IF emailBase=emailFrom THEN
              return 1 /* с этого email можно администрировать */
      end
   end
return 0  /* с этого email нельзя администрировать */
/**********/


Если что - пишите. С уважением, Роман Попов.

---
Интересные ссылки:

---

---
Комментариев к странице: 0 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов
(C) Russian Underground/2