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

Тема в разделе "Lotus - Программирование", создана пользователем shtrih, 27 апр 2007.

  1. shtrih

    shtrih Гость

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

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: shtrih
    Создать правило на серваке, от такогото юзверя письмо ложить в такуюто базу
    в базе агент, проверяет письмо, если совпадает с заданными параметрами ( тема, адресат, есть вложения зип ) то обрабатыватьет письмо
    разархивировать очень просто:
    выкладываеться архив в темповую папку, формируетьс строка типа "rar.exe / ... /... " ( пишите ключи, не мопню какие, что бы он сам автоматом разархивировал в нужную папку )
    вот собственно общее описание
     
  3. IsAvailable

    IsAvailable Гость

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

    Creating an agent
    Triggering an agent on an event
    Shell function
     
  4. magda

    magda Гость

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

    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
     
  5. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    в последних строках слабое место, если ЭТО используется в цикле и архивы большие и не успевают распаковываться и распакованные файлы должны как еще использоваться.. то будут ошибки
     
  6. magda

    magda Гость

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

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    для этого можно использовать api шные функции, которые делают тоже что и shell, плюс ждут завершения исполнения запущенной команды.. если нужно могу в понедельник выложить..
    если не терпится, то можно поискать на айбиэмовском форуме
     
  8. magda

    magda Гость

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

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    Declaration
    Код (Text):
    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&
    функция выполнения команды
    Код (Text):
    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 + " не выполнена !"
     

Поделиться этой страницей