1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

Написание агента

Тема в разделе "Lotus - Программирование", создана пользователем romanko, 9 сен 2011.

  1. romanko

    romanko Гость

    Репутация:
    0
    Нужна помощь в написании агента. Есть код представленный ниже, который берет приатачменный файл, который находится в кодировке OEM 866 перегоняется в кодировку вин 1251 и сохраняется в файл в кодировке utf-8. Как этот код переделать, чтобы подкинуть его в агент который должен срабатывать по событию получение нового письма?



    Sub Click(Source As Button)
    Dim doc As NotesDocument
    Dim rtitem As Variant
    Dim sourceName As String
    Dim uiDoc As NotesUiDocument
    Dim ws As New NotesUIWorkspace
    Dim result As NotesMIMEEntity
    Dim s As New NotesSession
    Dim item As notesitem
    Dim mystring As String
    Dim res As Integer
    Dim Tmp1 As String
    Dim neoEmbedAttachment As NotesEmbeddedObject
    Dim nrimAttachment As NotesRichTextItem
    Dim varFilePath As Variant
    Dim strFilePath As String
    Dim session As New NotesSession
    Dim strFieldname As String
    Dim rtdoc As Variant
    '_________________________достаем путь прикрепленного файла
    If doc.GetItemValue("From")(0) <> "CN=Vasya V Pupkin/O=Roga And Copyta" Then
    Set uiDoc = ws.CurrentDocument
    Set doc = uiDoc.Document
    Set result = doc.CreateMIMEEntity
    Set rtdoc=doc.GetFirstItem("Files")
    If ( rtdoc.type = RICHTEXT ) Then
    If Not Isempty(rtdoc.EmbeddedObjects) Then
    Set mime = result.CreateChildEntity( )
    Forall object In rtdoc.EmbeddedObjects
    If (object.Type = EMBED_ATTACHMENT ) Then
    filepath =Environ("Temp")+"\"+Cstr(Object.name)
    Call object.ExtractFile(filepath)
    '____________________________________________________________________

    outputFile = Freefile()
    fileName$ = "C:\111.xml"
    Open fileName$ For Output As outputFile Charset = "UTF-8"

    fileNum = Freefile()
    Open filepath For Input As fileNum
    Do While Not Eof(fileNum)
    Line Input #fileNum, MyTmpString
    Tmp1 = MyTmpString
    res = DosToWin(MyTmpString,Tmp1)
    Print #outputFile, Tmp1
    Loop

    Close outputFile
    Close fileNum
    Call object.Remove 'удаление прикрепленного файла
    '_______________________________________________берем этот файл и приатачеваем его
    Set nrimAttachment = doc.GetFirstItem("Files")
    Set neoEmbedAttachment = nrimAttachment.EmbedObject( EMBED_ATTACHMENT, "", fileName$)
    Set nudWebdoc = ws.CurrentDocument
    Set ndocBackWebdoc = nudWebdoc.Document
    strFieldname = uidoc.CurrentField
    Set nrimAttachment = doc.GetFirstItem("Files")
    If session.NotesBuildVersion >= 190 Then
    nrimAttachment.Update
    Else
    Call doc.ComputeWithForm(True, False)
    End If
    Set Doc = uiDoc.Document
    Call doc.Save( True, True )
    doc.SaveOptions = "0"
    Call uidoc.Close(True)
    Set uidocNew = ws.EditDocument(True, ndocBackWebdoc, , , , True)
    Delete uidoc
    uidocNew.Document.RemoveItem("SaveOptions")
    If strFieldname <> "" Then uidocNew.GotoField(strFieldname)

    Kill "C:\111.xml" ' удаляет файл с винта

    End If
    End Forall
    End If
    End If


    End Sub
     
  2. romanko

    romanko Гость

    Репутация:
    0
    Впринципе, вот так должно работать
    Код:
    Sub Initialize
    
    Dim session As New NotesSession
    
    Set db = session.CurrentDatabase	
    Set collection = db.UnprocessedDocuments 
    Set doc = collection.GetFirstDocument 
    
    Call session.UpdateProcessedDoc( doc ) 
    If doc.GetItemValue("From")(0) <> "CN=Vasya V Pupkin/O=Roga And Copyta" Then
    Set rtitem = doc.GetFirstItem( "Files" ) 
    If (Isarray(rtitem.EmbeddedObjects)) Then 
    Forall object In rtitem.EmbeddedObjects
    If (object.Type = EMBED_ATTACHMENT ) Then
    filepath = Environ("Temp")+"\"+Cstr(Object.name)
    Call object.ExtractFile(filepath)
    '________________________________________________________________				
    outputFile = Freefile() 
    fileName$ = "C:\peredelal.xml"
    Open fileName$ For Output As outputFile Charset = "UTF-8"
    
    fileNum = Freefile() 
    Open filepath For Input As fileNum
    Do While Not Eof(fileNum)
    Line Input #fileNum, MyTmpString
    Tmp1 = MyTmpString
    res = DosToWin(MyTmpString,Tmp1)
    Print #outputFile, Tmp1
    
    Loop
    
    Close outputFile
    Close fileNum
    
    Call object.Remove 'удаление прикрепленного файла
    Call doc.Save( True, True )	
    '____________________________________________________________________________
    _				
    
    Dim rtitem1 As NotesRichTextItem
    
    Set db = session.CurrentDatabase
    Set doc = collection.GetFirstDocument 
    
    Set rtitem1 = doc.GetFirstItem("Files")
    Set object = rtitem1.EmbedObject _
    ( EMBED_ATTACHMENT, "", fileName$)
    Call doc.Save( True, True )
    '______________________________________________________________________
    
    Kill	"C:\peredelal.xml" ' удаляет файл с винта
    
    
    End If
    End Forall
    End If
    
    End Sub
    
    Declarations :
    Declare Function DosToWin Lib "User32" Alias "OemToCharA" (Byval lpAnsiStr As String, Byval lpOemStr As String) As Integer
    Dim doc As NotesDocument 
    Dim db As NotesDatabase 
    Dim rtitem As Variant 
    Dim collection As NotesDocumentCollection 
    Dim neoEmbedAttachment As NotesEmbeddedObject
    Если найдете какие-то ошибки подскажите.Потому что проверить пока немогу.((
    Dim nrimAttachment As NotesRichTextItem
     
  3. romanko

    romanko Гость

    Репутация:
    0
    Не срабатывает этот код ложится прям вот тут
    Dim doc As NotesDocument
    Dim db As NotesDatabase
    Dim rtitem As Variant
    Dim collection As NotesDocumentCollection
    Dim neoEmbedAttachment As NotesEmbeddedObject
    Dim nrimAttachment As NotesRichTextItem
    Dim view As NotesView

    Set db = session.CurrentDatabase
    Set view = db.GetView("($Inbox)")
    Set collection = db.UnprocessedDocuments
    Set doc = collection.GetFirstDocument

    If doc.GetItemValue("tmpDisplaySentBy")(0) <> "CN=От кого письмо" Then ВОТ СДЕСЬ ПИШЕТ ЧТО object variable not set
    Call session.UpdateProcessedDoc( doc )
    Set rtitem = doc.GetFirstItem( "Body" )

    подскажите пожайлуста что с этим делать как правельно задавать переменную doc.
     
  4. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    romanko
    Какой Target у документа?
    Сколько возвращает collection.count?
     
  5. romanko

    romanko Гость

    Репутация:
    0
    collection.count возвращает 0
    collection [0, False, ""]

    Добавлено:
    Ну это если он один документ лежит во входящих, тоесть он пропускает первый. И как его заставить отрабатывать на событие прихода сообщения?
     
  6. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ты вообще смотрел свойства агента, в частности, Target?
     
  7. romanko

    romanko Гость

    Репутация:
    0
    Там стоит событие после получения почты. а что не так?
     
  8. Omh

    Omh Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Тогда хорошо :)
     
  9. nvyush

    nvyush Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    А точно после получения почты (After new mail has arrived), а не до (Before new mail arrives)?
     
  10. oshmianski

    oshmianski Гость

    Репутация:
    0
    romanko
    чего хочется сделать то?

    Если не ошибаюсь, то для обработки пришедшего письма нужно:
    1. использовать событие "Before new mail arrives"
    2. документ получать как notesSession.DocumentContext
     
  11. nvyush

    nvyush Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    При использовании события "Before new mail arrives" имеются ограничения и в контексте задачи (детачить вложение) лучше всё-таки использовать "After new mail has arrived" + set docs = notesDatabase.UnprocessedDocuments
     
  12. romanko

    romanko Гость

    Репутация:
    0
    Хочется чтобы агент отрабатывал после прихода письма. но он почему-то неотрабатывает.Если запустить его принудительно то он все делает как надо а вот по событию нехочет.

    Добавлено:
    Так оно все так и написано и стоит после получения почты но почему-то неатрабатывает?когда письмо приходит то ничего не происходит.
     
  13. nvyush

    nvyush Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    romanko
    Кем подписан агент, от чьего имени запускается?
     
  14. romanko

    romanko Гость

    Репутация:
    0
    Подписан менеджером бд на которой стоит. А как должно быть я просто в первый раз ставлю агент.
     
  15. romanko

    romanko Гость

    Репутация:
    0
    а на бд mail.box агенты вообще никак не работают, тоесть его ни как не запустиш?
     
  16. nvyush

    nvyush Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Так Вы это в mail.box агента запихнуть пытаетесь :) ?
     
  17. romanko

    romanko Гость

    Репутация:
    0
    Да. И что никак с этим не справиться?
     
Загрузка...
Похожие Темы - Написание агента
  1. wellsun
    Ответов:
    0
    Просмотров:
    327
  2. vladis222
    Ответов:
    1
    Просмотров:
    740
  3. smailvolf
    Ответов:
    1
    Просмотров:
    1.157
  4. faissullin
    Ответов:
    0
    Просмотров:
    1.203
  5. IseLL
    Ответов:
    1
    Просмотров:
    1.091

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