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

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

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

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

  1. aguch

    aguch New Member

    Репутация:
    0
    Регистрация:
    23 июл 2015
    Сообщения:
    4
    Симпатии:
    0
    Друзья ! Попал в тупиковую ситуация не могу понять куда копать...
    есть vbs- скрипт, который проверяет почтовую базу, находит данные (регулярные выражения) и перекладывает их в БД...
    К содержимому обращается собственно st=doc.GetItemValue("Body")(0). Все бы ничего результат чтения некоторых писем выглядит (st) примерно так: " C.htm image001.jpg image002.png ", хотя письмо читабельно и данные содержит.
    Как вложение C.htm не извлекается (секция FILE отсутствует). Как прочитать заветную строчку не представляю. Выглядит это вкратце так:
    Код:
    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

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

    lmike нет, пердело совершенство
    Lotus team

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

    garrick Well-Known Member
    Lotus team

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

    lmike нет, пердело совершенство
    Lotus team

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

    garrick Well-Known Member
    Lotus team

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

    ...или я не о том?
    --- Добавлено 27 июл 2015. Первое сообщение размещено 27 июл 2015 ---
    Если речь идёт о теле письма, то ещё можно попробовать NotesMIMEEntity
     
  7. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    ну вот я о том и писал
    --- Добавлено 27 июл 2015. Первое сообщение размещено 27 июл 2015 ---
    проблема в том - что тело письма, программно, видно как аттач, с к-л именем...
    ну т.е. - майм
     
  8. aguch

    aguch New Member

    Репутация:
    0
    Регистрация:
    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

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

    aguch New Member

    Репутация:
    0
    Регистрация:
    23 июл 2015
    Сообщения:
    4
    Симпатии:
    0
    В общем сейчас это выглядит примерно вот так и даже работает. С DXL попробую разобраться....
    Код:
    	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

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

    lmike нет, пердело совершенство
    Lotus team

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

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