4

API getEmbeddedObjects();当从脚本发送包含附件(作为嵌入对象)的邮件时,Domino 服务器返回错误结果(零)。虽然附件是作为EmbeddedOBject,getEmbeddedObjects();返回的ZERO。邮件类型是NOT MIME

这是一个 Java 应用程序。这个问题有什么解决方法吗?

我从文件中取出尸体。如果正文是richtextitem,我调用getEmbeddedObjects(),尽管附件作为嵌入对象存在,但它返回零。

4

4 回答 4

3

查看文档中的所有项目以查找附件的可能性是徒劳的。您需要做的就是使用 @AttachmentNames 公式获取附件名称的集合(可通过 Session 对象的 evaluate() 方法,使用 Document 参数),如果集合包含多个空字符串,则使用 getAttachment () 方法获取文档对应的 EmbeddedObject 的句柄。

getAttachment() 可以获取文档的任何附件,无论它是与 RichTextItem 还是与 V2 样式的附件相关联(由 Web UI 或在转换外部邮件时创建)。并且永远不要害怕在适当的时候使用公式语言——它可以让你的生活变得更简单。

于 2011-07-16T03:11:22.270 回答
2

遗憾的是,Lotus Notes 没有提供从 NotesDocument 对象中提取附件的单一可靠方法。为了彻底,您需要检查它包含的所有富文本项目,以及文档对象本身。

我编写了以下代码来从邮箱中的选定电子邮件中提取附件,以减少文件大小(我的用户保存了所有内容)。不过,主循环与您的问题有关。它显示了遍历文档的所有项目以查找带有附件的富文本项目的过程,然后再次遍历所有项目以查找“附件”类型的项目。

(原谅代码的hackiness。它不是为了效率而写的)

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
于 2011-06-03T13:43:31.827 回答
2

附件不一定必须嵌入 RichText 字段中。引用设计师帮助:

如果您需要访问存在于文档中但不属于富文本项的 OLE/2 嵌入对象(例如,因为该对象最初是在文档的表单上创建的),请使用 Document 中的 EmbeddedObjects 属性。

您的问题的另一个来源可能是您必须检查几个“Body”RichText 项目。

高温高压

于 2011-06-03T06:39:53.787 回答
1

如果您从对象中获取嵌入的Document对象,它们将不包含附件。getEmbeddedObjects与“Body”一起使用RichTextItem也可以获得附件。

这有帮助吗?

于 2011-06-03T05:15:29.370 回答