Форум продуктов IBM Lotus

Общие вопросы => Разработка приложений => Тема начата: K85 от 10 Июнь 2011, 17:06:57

Название: поле Body
Отправлено: K85 от 10 Июнь 2011, 17:06:57
Есть письмо из вне, необходимо в преставлении Все документы нажимать кнопку или в действиях выбирать агент и сохранять данное письмо в определенном месте на диске в текстовом формате. Как сохранить поле Field Name: Body   Data Type: MIME Part
пытаюсь сделать так:
  Dim dc As NotesDocumentCollection
    Set dc = db.UnprocessedDocuments
    Set nd_tmp=ndc_tmp.getfirstdocument()
    While Not(nd_tmp Is Nothing)
       Set mime = nd_tmp.GetMIMEEntity
       While Not(mime Is Nothing)
          Dim new As Variant
          Set mime = nd_tmp.GetMIMEEntity
          new= ""
          Call mime.DecodeContent
          new = mime.ContentAsText
           
          ConvertRTDoc = new
          Print #ФАЙЛ%,"Body: " & new
          Call mime.remove
          Set nd_tmp=ndc_tmp.getfirstdocument()
           
       Wend
       Set nd_tmp=ndc_tmp.getnextdocument(nd_tmp)
    Wend   

 но так добавляется в файл только информация из 1-го поля, а остальные не попадают
 Как сделать правильно?
Название: Re: поле Body
Отправлено: Alla Makshanova от 14 Июнь 2011, 12:03:42
А если напечатать строчку       

Messagebox mime.ContentAsText,, "Content as text"

что будет выведено?
Название: Re: поле Body
Отправлено: K85 от 14 Июнь 2011, 12:43:03
если в этой части вставить:
          Print #ФАЙЛ%,"Body: " & new
Messagebox mime.ContentAsText,, "Content as text"
          Call mime.remove
то This is a multi-part message in MIME format
если в эту часть:
Wend

Set nd_tmp=ndc_tmp.getnextdocument(nd_tmp)
Messagebox mime.ContentAsText,, "Content as text"
Wend
то Object variable not set
Название: Re: поле Body
Отправлено: Alla Makshanova от 14 Июнь 2011, 16:52:39
Т.е. говорится, что сообщение формата MIME состоит из множества частей.
В использовании метода ContentAsText написано, что для родительского объекта в множественном объекте (mime оказался множественным) этот метод возвращает преамбулу. Наверно поэтому берется информация только из первого поля.
Если попробовать так (печатать содержимое частей множественного объекта mime)

Sub Initialize

  Dim s As New NotesSession

  Dim db As NotesDatabase

  Dim dc As NotesDocumentCollection

  Dim doc As NotesDocument

  Dim mime As NotesMIMEEntity

  Dim child As NotesMIMEEntity

  Dim m As String

  Set db = s.CurrentDatabase

  s.ConvertMIME = False ' Do not convert MIME to rich text

  Set dc = db.UnprocessedDocuments

  Set doc = dc.GetFirstDocument

  While Not(doc Is Nothing)

    Set mime = doc.GetMIMEEntity

    If Not(mime Is Nothing) Then

      If mime.ContentType = "multipart" Then

        n = 1

        Set child = mime.GetFirstChildEntity

        While Not(child Is Nothing)
'необходимые действия, ContentAsText'
     
          n = n + 1

          Set child = child.GetNextSibling

        Wend

      Else ' if not multipart

        Messagebox "Not multipart",, _

        doc.GetItemValue("Subject")(0)

      End If

    Else ' if not MIME

      Messagebox "Not MIME",, doc.GetItemValue("Subject")(0)

    End If

    Set doc = dc.GetNextDocument(doc)

  Wend

  s.ConvertMIME = True ' Restore conversion

End Sub
Название: Re: поле Body
Отправлено: K85 от 15 Июнь 2011, 11:42:09
огромное спасибо! Вышло, но осталось у меня одна проблема
например, в документе есть 4 поля Body, а выводит только 3 и всего три прохода делает (смотрю в дебагере)
в строке Set mime = doc.GetMIMEEntity показывает ту, которую в итоге не выводит
в  Set child = mime.GetFirstChildEntity выводит следующее поле

как можно первое тоже вывести?
Название: Re: поле Body
Отправлено: Alla Makshanova от 15 Июнь 2011, 13:13:51
Давайте разберем, может в коде что-то забыто

'Рассматриваем документ
While Not(doc Is Nothing)

' Задаем значение mime
    Set mime = doc.GetMIMEEntity

 ' Проходим в цикл
    If Not(mime Is Nothing) Then

'Строчка состоит из множества частей? Если да, то Set child = mime.GetFirstChildEntity  выведет нужное поле. Иначе в цикл не проходим, переходим к Else

      If mime.ContentType = "multipart" Then

        n = 1

        Set child = mime.GetFirstChildEntity

        While Not(child Is Nothing)

'обработка поля
     
          n = n + 1

          Set child = child.GetNextSibling

        Wend

      Else ' if not multipart

'Должно выводиться это сообщение, здесь надо обработать первое поле       
Messagebox "Not multipart",, _

        doc.GetItemValue("Subject")(0)

      End If

    Else ' if not MIME

      Messagebox "Not MIME",, doc.GetItemValue("Subject")(0)

    End If

  Messagebox  нигде не выводится?
Название: Re: поле Body
Отправлено: K85 от 15 Июнь 2011, 13:34:42
сообщения не выводит, все так и сделано, но первое поле не в какую не хочет брать
Название: Re: поле Body
Отправлено: Alla Makshanova от 15 Июнь 2011, 14:04:50
Попробуйте отследить вывод полей Messagebox-м 


 Messagebox "MIME",, doc.GetItemValue("Subject")(0)

Set mime = doc.GetMIMEEntity

    If Not(mime Is Nothing) Then

Messagebox "MIME isn't Nothing"

      If mime.ContentType = "multipart" Then

Messagebox "MIME is multipart"

        n = 1

        Set child = mime.GetFirstChildEntity

        While Not(child Is Nothing)
             Call child.DecodeContent

Messagebox child.ContentAsText,,doc.GetItemValue("Subject")(0)

'печатаем содержимое поля    
          n = n + 1

          Set child = child.GetNextSibling

        Wend

Название: Re: поле Body
Отправлено: K85 от 15 Июнь 2011, 15:37:15
или я уже просто не могу ничего понять или....  :-\ 
Проверяю по messagbox
1. MIme и название (правильное)
2. MIME isn't Nothing
3. MIME is multipart
4. только 2 поля из четырех  :'(  . Сообщение только о 2-х полях
Название: Re: поле Body
Отправлено: Alla Makshanova от 15 Июнь 2011, 16:57:47
Проверьте, может child тоже является multipart. И какое значение имеет счетчик n после выполнения агента?

Messagebox "Child is multipart"


Название: Re: поле Body
Отправлено: K85 от 15 Июнь 2011, 17:12:33
n=3
child не multipart
Название: Re: поле Body
Отправлено: Alla Makshanova от 15 Июнь 2011, 18:59:53
Может опять проблема с использованием ContentAsText?  Проблемы с ним могут возникать из-за кодировки объекта, если кодировка не US-ASCII. Или в полях хранятся не текстовые данные, что тоже может стать проблемой для дальнейшей их обработки. Например, данные, содержащие нулевой символ, вероятно, будут усечены до нулевого символа во время работы со строками.
Проверьте тип данных в потомках методом ContentType и Messagebox
Покажите, пожалуйста, весь код агента
Название: Re: поле Body
Отправлено: K85 от 16 Июнь 2011, 18:32:56
спасибо за ответ... буду пробовать