Вызов getEmbeddedObjects ();(Domino Server API) возвращает неверные результаты - PullRequest
4 голосов
/ 03 июня 2011

Сервер Domino API getEmbeddedObjects(); возвращает неверный результат (ноль), когда письмо, содержащее вложение (в виде встроенного объекта), отправляется из сценария.Хотя вложение отправляется как EmbeddedOBject, getEmbeddedObjects(); возвращает ZERO.Тип почты: NOT MIME.

Это приложение Java.Есть ли обходной путь для этой проблемы?

Я беру тело из документа.Если тело имеет richtextitem, я вызываю getEmbeddedObjects (), который возвращает ноль, хотя вложение присутствует как встроенный объект.

Ответы [ 4 ]

3 голосов
/ 16 июля 2011

Просмотр всех элементов в документе на предмет наличия вложения - это большая работа, которая ни за что не стоит.Все, что вам нужно сделать, это получить коллекцию имен вложений, используя формулу @AttachmentNames (доступно через методvalu () объекта Session, используя аргумент Document), и если коллекция содержит больше, чем пустую строку, используйте getAttachment() метод документа, чтобы получить дескриптор соответствующего EmbeddedObject.

getAttachment () может получить любое вложение к документу, независимо от того, связано ли оно с RichTextItem или вложением в стиле V2 (как было бы создановеб-интерфейс или при конвертации внешней почты).И никогда не бойтесь использовать язык формул, когда это уместно - это может сделать вашу жизнь намного проще.

2 голосов
/ 03 июня 2011

Вложения не обязательно должны быть встроены в поле RichText. Цитата из конструктора-справки:

Если вам нужен доступ к встроенным объектам OLE / 2, которые существуют в документе, но не являются частью элемента форматированного текста (например, потому что объект был изначально создан в форме документа), используйте свойство EmbeddedObjects в Document.

Другим источником вашей проблемы может быть то, что вам нужно проверить несколько элементов "Body" RichText.

НТН

2 голосов
/ 03 июня 2011

Lotus Notes, к сожалению, не предоставляет ни одного надежного метода для извлечения вложений из объекта NotesDocument.Чтобы быть точным, вам нужно проверить все элементы richtext, которые он содержит, а также сам объект документа.

Я написал следующий код для извлечения вложений из выбранных писем в почтовом ящике, чтобысократить размер файла (мои пользователи сохранили все).Основной цикл имеет отношение к вашему вопросу, хотя.Он показывает процесс циклического перебора всех элементов документа в поисках элементов richtext с вложениями, за которым следует цикл по всем элементам, снова ища элементы типа «Вложение».

(простите за хакерство кода. Он не был написан для эффективности)

Sub Initialize

    Set s = New NotesSession
    Set db = s.CurrentDatabase
    Set dc = db.UnprocessedDocuments
    Set doc = dc.GetFirstDocument
    Dim rtItem As NotesRichTextItem
    Dim RichTextItemNames List As String
    Dim DocumentItemNames List As String
    Dim itemCount as Integer

    While Not (doc Is Nothing)

        'Scan all richtext items in document for embedded objects
        Forall i In doc.Items

            If i.Type = RICHTEXT Then
                Set rtItem = doc.GetFirstItem(i.Name)
                If Not Isempty(rtItem.EmbeddedObjects) Then
                    RichTextItemNames(itemCount) = Cstr(i.Name)
                    itemCount = itemCount + 1
                End If
            End If

        End Forall      

        'Loop through richtext items and extract the embedded attachments
        For j = 0 To itemCount - 1 
            Set rtItem = doc.GetfirstItem(RichTextItemNames(j))
            Forall Obj In rtItem.EmbeddedObjects
                If ( Obj.Type = EMBED_ATTACHMENT ) Then
                    Call ExportAttachment(Obj)
                    Call Obj.Remove
                    Call doc.Save( False, True )  'creates conflict doc if conflict exists
                End If 
            End Forall 
        Next

        'Scan all items in document for Attachment type items
        itemCount = 0
        Forall i In doc.Items           
            If i.Type = ATTACHMENT Then

                DocumentItemNames(itemCount) = i.Values(0)
                itemCount = itemCount + 1

            End If          
        End Forall

        'Loop through all attachment items in document and extract them
        For j = 0 To itemCount - 1 
            Set attachmentObject = doc.GetAttachment(DocumentItemNames(j))
            Call ExportAttachment(attachmentObject)
            Call attachmentObject.Remove            
            Call doc.Save( False, True ) 'creates conflict doc if conflict exists
        Next        

        Set doc = dc.GetNextDocument(doc)
    Wend

End Sub

Sub ExportAttachment(o As Variant)

    Dim sAttachmentName As String
    Dim sNum As String
    Dim sTemp As String

    ' Append number to end of filename if filename exists.
    sAttachmentName = sDir & "\" & o.Source
    While Not (Dir$(sAttachmentName, 0) = "")
        sNum = Right(Strleftback(sAttachmentName, "."), 2)
        If Isnumeric(sNum) Then
            sTemp = Strleftback(sAttachmentName, ".")
            sTemp = Left(sTemp, Len(sTemp) - 2)
            sAttachmentName = sTemp & Format$(Cint(sNum) + 1, "##00") & _
            "." & Strrightback(sAttachmentName, ".")
        Else
            sAttachmentName = Strleftback(sAttachmentName, ".") & _
            "01." & Strrightback(sAttachmentName, ".")
        End If
    Wend

    Print "Exporting " & sAttachmentName
    'Save the file
    Call o.ExtractFile( sAttachmentName )


End Sub
1 голос
/ 03 июня 2011

Если вы получите встроенные объекты из объекта Document, они не будут содержать вложений. Использование getEmbeddedObjects с "Body" RichTextItem также позволяет получить вложения.

Это помогает?

...