Открепление и разархивирование файла

  • Автор темы shtrih
  • Дата начала
S

shtrih

Гость
#1
Здравствуйте!
Я не разу не писал на lotus. Мне нужно сделать агента который бы при получении нового сообщения в mailbox сравнивал автора с заданным и тему письма с заданным, смотрел чтобы там был прикреплён файл с расширением zip. Если всё совпало то он должен этот файл разархивировать в нужное место.

Если можно объясните как выбрать в документах чтобы агент применялся только к выбранным mailbox, и с чего начать писать скрипт. Можно ссылку на хорошую книгу
За всё заранее спасибо
 

morpheus

скриптописец
07.08.2006
3 915
1
34
Украина, Киев
#2
Для: shtrih
Создать правило на серваке, от такогото юзверя письмо ложить в такуюто базу
в базе агент, проверяет письмо, если совпадает с заданными параметрами ( тема, адресат, есть вложения зип ) то обрабатыватьет письмо
разархивировать очень просто:
выкладываеться архив в темповую папку, формируетьс строка типа "rar.exe / ... /... " ( пишите ключи, не мопню какие, что бы он сам автоматом разархивировал в нужную папку )
вот собственно общее описание
 
I

IsAvailable

Гость
#3
В дополнение к сказанному Morpheus'ом главы из хэлпа в помощь:

Creating an agent
Triggering an agent on an event
Shell function
 
M

magda

Гость
#4
Я думаю, что кроме сказанного выше Вам поможет следующий фрагмент:

Const zippath = "C:\Program files\Far\pkzip25.exe" 'путь к архиватору pkzip25
Const options = "-extract -dir=current -nozipextension" 'опции к архиватору

'анализ письма на наличие нужного attachment и сохранение его по нужному пути

Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
If Not Isempty (rtitem.EmbeddedObjects) Then
Forall o In rtitem.EmbeddedObjects

On Error Goto errnextattach
If ( o.Type = EMBED_ATTACHMENT ) Then

attachment = o.Source


Call o.ExtractFile( tempsavepath & o.Source )

'сохранение файла во временную папку для последующего разорхивирования

filename = tempsavepath & o.Source

'непосредственное разорхивирование файла
shellResult = Shell(filename, 1)
Sleep 7
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
Москва
#5
в последних строках слабое место, если ЭТО используется в цикле и архивы большие и не успевают распаковываться и распакованные файлы должны как еще использоваться.. то будут ошибки
 
M

magda

Гость
#6
да, я согласна, но другого выхода пока не нашла. А что Вы можете посоветовать для исправления "слабого места"?
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
Москва
#7
для этого можно использовать api шные функции, которые делают тоже что и shell, плюс ждут завершения исполнения запущенной команды.. если нужно могу в понедельник выложить..
если не терпится, то можно поискать на айбиэмовском форуме
 
M

magda

Гость
#8
спасибо! С удовольствием бы попробовала использовать Вашу идею на практике. Буду благодарна, если Вы выложите данную информацию или любые другие комментарии относительно такого использования api. Хотя на форуме IBM тоже попробую поискать.
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
Москва
#9
Declaration
Код:
Type StartupInfoTYPE	
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long	
End Type

Type ProcessInfoTYPE	
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long	
End Type

Declare Function W32WaitForSingleObject Lib "kernel32" Alias "WaitForSingleObject" ( _
Byval hHandle As Long, Byval dwMilliseconds As Long ) As Long

Declare Function W32CreateProcess Lib "kernel32" Alias "CreateProcessA" ( _
Byval lpApplicationName As Long, Byval lpCommandLine As String, _
Byval lpProcessAttributes As Long, Byval lpThreadAttributes As Long, _
Byval bInheritHandles As Long, Byval dwCreationFlags As Long, _
Byval lpEnvironment As Long, Byval lpCurrentDirectory As Long, _
lpStartupInfo As StartupInfoTYPE, lpProcessInformation As ProcessInfoTYPE ) As Long

Declare Function W32CloseHandle Lib "kernel32" Alias "CloseHandle" ( Byval hObject As Long ) As Long

Const NORMAL_PRIORITY_CLASS = &H20&
Const INFINITE = -1&
функция выполнения команды
Код:
Function runShellAndWait(Byval programPath As String, Byval args As String) As Boolean
Dim retVal As Long
Dim procInfo As ProcessInfoTYPE
Dim strtInfo As StartupInfoTYPE	
try:
On Error Goto catch	
strtInfo.cb = Len(strtInfo)	
' получение аргументов
args = Fulltrim(args)	
' создание процесса с параметрами и без
If args = "" Then
retVal = W32CreateProcess(0, programPath, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, strtInfo, procInfo) 
Else
retVal = W32CreateProcess(0, programPath & " " & args, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, strtInfo, procInfo) 
End If	
' приостановка текущего приложения до выполнения shell'a
retVal = W32WaitForSingleObject(procInfo.hProcess, INFINITE)		
' закрытие процесса
retVal = W32CloseHandle(procInfo.hProcess) 
If retVal = 0 Then Print "Ошибка при закрытии процесса", Getthreadinfo(1)	
' удаление хендла
retVal = W32CloseHandle(procInfo.hThread) 
If retVal = 0 Then Print "Ошибка при закрытии хендла", Getthreadinfo(1)		
runShellAndWait = True
Exit Function
catch:	
Call errh(Err, Error, Erl, Getthreadinfo(1), False)
Exit Function
End Function
пример запуска
'(если путь с пробелами то испотльзовать кавычки)
'cmdLine = {cmd /c del /q "C:\Documents and Settings\All Users\*"}

cmdLine = "cmd /c del /q c:\temp\*"
If Not runShellAndWait(cmdLine, "") Then Print "Команда " + cmdLine + " не выполнена !"