Doc.getitemvalue("body") не находит текст

Тема в разделе "Lotus - Программирование", создана пользователем aguch, 24 июл 2015.

  1. aguch

    aguch New Member

    Регистрация:
    23 июл 2015
    Сообщения:
    4
    Симпатии:
    0
    Друзья ! Попал в тупиковую ситуация не могу понять куда копать...
    есть vbs- скрипт, который проверяет почтовую базу, находит данные (регулярные выражения) и перекладывает их в БД...
    К содержимому обращается собственно st=doc.GetItemValue("Body")(0). Все бы ничего результат чтения некоторых писем выглядит (st) примерно так: " C.htm image001.jpg image002.png ", хотя письмо читабельно и данные содержит.
    Как вложение C.htm не извлекается (секция FILE отсутствует). Как прочитать заветную строчку не представляю. Выглядит это вкратце так:
    Код (Text):
    Set session = CreateObject("Lotus.NotesSession")
    Call session.Initialize("******")
    server = session.GETENVIRONMENTSTRING("MailServer", True)
    mailfile = session.GETENVIRONMENTSTRING("MailFile", True)
    Set Db = session.GetDatabase(server, mailfile)
    Set dc = db.AllDocuments
    Set doc = dc.GetLastDocument()
     
     
     
     
    While (Not(doc Is Nothing))
    If (doc.HasItem("Body") Or doc.HasItem("Subject")) And doc.HasItem("From") Then
    st=doc.GetItemValue("Body")(0)
    ....
    End If
    Wend
    Спасибо!
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    если только текст - читать хэлп дизигнера внимательно
    или получать DXL и его обрабатывать, здесь куча вариантов была (вплоть до получения html и pdf)
    но в этом случае (раз настаиваете на VB) - пойдете на форумы МСпердуляторов, по обработке хмл и получения из них того что нужно
    классы для RichTextNavigator можно отмести сразу (глюкав и сложен в использовании)
    [DOUBLEPOST=1437743779,1437743553][/DOUBLEPOST]
    это майм и можно пытать его, через соответ. классы ... - но вариант КМК ужасен
    в этом случае ДХЛ может оказаться более удобным, хотя можно пересохранять доки как РТ, что на мой взгляд - тоже неайс
     
    #2 lmike, 24 июл 2015
    Последнее редактирование модератором: 24 июл 2015
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
  4. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Аттачменты можно достать через EmbeddedObjects
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    есть маленькое НО - узнать имя "нужного" аттача, нужно будет перебирать и анализировать возможные варианты - htm, html, hta, txt...
     
  6. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    NotesEmbeddedObject.Source
    - If the NotesEmbeddedObject is a file attachment, this property returns the file name of the original file.

    ...или я не о том?
    [DOUBLEPOST=1437999291,1437999083][/DOUBLEPOST]Если речь идёт о теле письма, то ещё можно попробовать NotesMIMEEntity
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    ну вот я о том и писал
    [DOUBLEPOST=1438002973,1438002887][/DOUBLEPOST]
    проблема в том - что тело письма, программно, видно как аттач, с к-л именем...
    ну т.е. - майм
     
  8. aguch

    aguch New Member

    Регистрация:
    23 июл 2015
    Сообщения:
    4
    Симпатии:
    0
    Спасибо !
    NotesMIMEEntity - как раз то
    правда GetContentAsText и GetEntityAsText - это не наш метод :) (они для text/plain MIME, а у меня оказался multipart/related). GetNextEntity - вот чем я в итоге сделал. И ключевая ошибка, из-за которой я сам сразу не разобрался, был переключатель session.ConvertMIME = False/True.
    Этого привело к новой проблеме: мне приходится разбирать письма с ConvertMIME = False отмечая ID писем с ".htm". А потом заново создавать сессию с ConvertMIME = True перебирать базу заново обрабатывая уже только письма из списка....
    Как то это не рационально.
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    ну яж не зря сказал
    для рационально - парсить ДХЛ, о чем тоже упомянул
     
    #9 lmike, 28 июл 2015
    Последнее редактирование модератором: 28 июл 2015
  10. aguch

    aguch New Member

    Регистрация:
    23 июл 2015
    Сообщения:
    4
    Симпатии:
    0
    В общем сейчас это выглядит примерно вот так и даже работает. С DXL попробую разобраться....
    Код (LotusScript):
        Const ForReading = 1, ForWriting = 2, ForAppending = 8
        Set fso = CreateObject("Scripting.FileSystemObject")Set ff = fso.CreateTextFile(unufile, True)
        tmpfile="#temp"
        Set tt = fso.CreateTextFile(tmpfile, True)
     
        Set session = CreateObject("Lotus.NotesSession")
        Call session.Initialize("****")
        server = session.GETENVIRONMENTSTRING("MailServer", True)
        mailfile = session.GETENVIRONMENTSTRING("MailFile", True)'"mail\ps.nsf" '
        session.ConvertMIME = True
        Set Db = session.GetDatabase(server, mailfile)
        Set dc = db.AllDocuments
        Set doc = dc.GetLastDocument()
     
        While (Not(doc Is Nothing))
            If (doc.HasItem("Body") Or doc.HasItem("Subject")) And doc.HasItem("From") Then
                st=doc.GetItemValue("Body")(0)
                If InStr(st, ".htm" ) <>0 Or InStr(st, ".html" ) <>0 Then
                    tt.writeline id
                End If
                ....
            End If
            Set doc = dc.GetPrevDocument(doc)
        Wend
       
        Set Db = Nothing
        Set Session = Nothing
     
        'MIME
     
        Set rtt = fso.OpenTextFile("#temp", ForReading)
        stt = rtt.ReadAll
        If Len(stt) > 0 Then
     
            Set session = CreateObject("Lotus.NotesSession")
            Call session.Initialize("****")
            session.ConvertMIME = False
            Set Db = session.GetDatabase(server, mailfile)
            Set dc = db.AllDocuments
            Set doc = dc.GetLastDocument()
     
            While (Not(doc Is Nothing))
                id=doc.NoteID  
                If InStr(stt,id) Then
                    Set mime = doc.GetMIMEEntity
                    If Not mime Is Nothing Then
                        Set child = mime.GetNextEntity'(SEARCH_BREADTH)
                        While Not(child Is Nothing)
                            Set mime = child
                            ......
                            Set child = mime.GetNextEntity'(SEARCH_BREADTH)
                        Wend
                    End If
                    .....
                End If
                Set doc = dc.GetPrevDocument(doc)
            Wend
            rtt.Close
            session.ConvertMIME = True
            Set Db = Nothing
            Set Session = Nothing
        End If
    Еще раз спасибо!
     
    #10 aguch, 28 июл 2015
    Последнее редактирование модератором: 28 июл 2015
  11. aguch

    aguch New Member

    Регистрация:
    23 июл 2015
    Сообщения:
    4
    Симпатии:
    0
    А вот EmbeddedObjects с последующим ExtractFile - сохраняет только часть htm Видимо остальные это не вложения(?)
    И я не понял отличия oFile.Name от oFile.Source?
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    можно присобачить файлы с одинаковым названием, Name будет генериться нотуснёй
     
Загрузка...

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