поле Body

Автор Тема: поле Body  (Прочитано 16057 раз)

K85

  • Старший специалист
  • ****
  • Сообщений: 127
  • http://nick-name.ru/sertificates/727639/
    • Просмотр профиля
поле Body
« : 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-го поля, а остальные не попадают
 Как сделать правильно?

Alla Makshanova

  • Участник
  • **
  • Сообщений: 43
    • Просмотр профиля
    • E-mail
Re: поле Body
« Ответ #1 : 14 Июнь 2011, 12:03:42 »
А если напечатать строчку       

Messagebox mime.ContentAsText,, "Content as text"

что будет выведено?

K85

  • Старший специалист
  • ****
  • Сообщений: 127
  • http://nick-name.ru/sertificates/727639/
    • Просмотр профиля
Re: поле Body
« Ответ #2 : 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

Alla Makshanova

  • Участник
  • **
  • Сообщений: 43
    • Просмотр профиля
    • E-mail
Re: поле Body
« Ответ #3 : 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
« Последнее редактирование: 14 Июнь 2011, 17:32:48 от Alla Makshanova »

K85

  • Старший специалист
  • ****
  • Сообщений: 127
  • http://nick-name.ru/sertificates/727639/
    • Просмотр профиля
Re: поле Body
« Ответ #4 : 15 Июнь 2011, 11:42:09 »
огромное спасибо! Вышло, но осталось у меня одна проблема
например, в документе есть 4 поля Body, а выводит только 3 и всего три прохода делает (смотрю в дебагере)
в строке Set mime = doc.GetMIMEEntity показывает ту, которую в итоге не выводит
в  Set child = mime.GetFirstChildEntity выводит следующее поле

как можно первое тоже вывести?

Alla Makshanova

  • Участник
  • **
  • Сообщений: 43
    • Просмотр профиля
    • E-mail
Re: поле Body
« Ответ #5 : 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  нигде не выводится?
« Последнее редактирование: 15 Июнь 2011, 13:16:34 от Alla Makshanova »

K85

  • Старший специалист
  • ****
  • Сообщений: 127
  • http://nick-name.ru/sertificates/727639/
    • Просмотр профиля
Re: поле Body
« Ответ #6 : 15 Июнь 2011, 13:34:42 »
сообщения не выводит, все так и сделано, но первое поле не в какую не хочет брать

Alla Makshanova

  • Участник
  • **
  • Сообщений: 43
    • Просмотр профиля
    • E-mail
Re: поле Body
« Ответ #7 : 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

« Последнее редактирование: 15 Июнь 2011, 14:14:00 от Alla Makshanova »

K85

  • Старший специалист
  • ****
  • Сообщений: 127
  • http://nick-name.ru/sertificates/727639/
    • Просмотр профиля
Re: поле Body
« Ответ #8 : 15 Июнь 2011, 15:37:15 »
или я уже просто не могу ничего понять или....  :-\ 
Проверяю по messagbox
1. MIme и название (правильное)
2. MIME isn't Nothing
3. MIME is multipart
4. только 2 поля из четырех  :'(  . Сообщение только о 2-х полях

Alla Makshanova

  • Участник
  • **
  • Сообщений: 43
    • Просмотр профиля
    • E-mail
Re: поле Body
« Ответ #9 : 15 Июнь 2011, 16:57:47 »
Проверьте, может child тоже является multipart. И какое значение имеет счетчик n после выполнения агента?

Messagebox "Child is multipart"


« Последнее редактирование: 15 Июнь 2011, 17:01:43 от Alla Makshanova »

K85

  • Старший специалист
  • ****
  • Сообщений: 127
  • http://nick-name.ru/sertificates/727639/
    • Просмотр профиля
Re: поле Body
« Ответ #10 : 15 Июнь 2011, 17:12:33 »
n=3
child не multipart

Alla Makshanova

  • Участник
  • **
  • Сообщений: 43
    • Просмотр профиля
    • E-mail
Re: поле Body
« Ответ #11 : 15 Июнь 2011, 18:59:53 »
Может опять проблема с использованием ContentAsText?  Проблемы с ним могут возникать из-за кодировки объекта, если кодировка не US-ASCII. Или в полях хранятся не текстовые данные, что тоже может стать проблемой для дальнейшей их обработки. Например, данные, содержащие нулевой символ, вероятно, будут усечены до нулевого символа во время работы со строками.
Проверьте тип данных в потомках методом ContentType и Messagebox
Покажите, пожалуйста, весь код агента
« Последнее редактирование: 16 Июнь 2011, 12:35:36 от Alla Makshanova »

K85

  • Старший специалист
  • ****
  • Сообщений: 127
  • http://nick-name.ru/sertificates/727639/
    • Просмотр профиля
Re: поле Body
« Ответ #12 : 16 Июнь 2011, 18:32:56 »
спасибо за ответ... буду пробовать