繁体   English   中英

Lotus Notes-邮件文档-获取附件名称(和导出附件)

[英]Lotus Notes - Mail Document - Get Attachment Names (and Export Attachments)

我的一个Lotus Notes邮件文档中有三个附件。

Desert.jpg,Hydrageas.jpg和Tulips.jpg

我有以下代码段。

        Vector<Item> itemList = lotusNotesDocument.getItems();

        for (Item item : itemList)
        {
            if (item.getType() == Item.ATTACHMENT)
            {
                System.out.println("*****111********* ATTACHMENT=" + item.getName() + "=" + item.getValueString());
            }
            else if (item.getType() == Item.EMBEDDEDOBJECT)
            {
                System.out.println("*****222********* EMBEDDEDOBJECT=" + item.getName() + "=" + item.getValueString());
            }
            else if (item.getType() == Item.MIME_PART)
            {
                System.out.println("*****333********* MIME_PART=" + item.getName() + "=" + item.getValueString());
            }               
        }

此代码的输出如下

*****333********* MIME_PART=Body=
*****333********* MIME_PART=Body=
*****111********* ATTACHMENT=$FILE=Hydrangeas.jpg
*****111********* ATTACHMENT=$FILE=Hydrangeas.jpg
*****111********* ATTACHMENT=$FILE=Hydrangeas.jpg
*****333********* MIME_PART=Body=
*****333********* MIME_PART=Body=

这是Domino API中的错误吗? 有人遇到过吗?

我的确切要求是将附件保存到磁盘。

PS:我正在使用Lotus Expediter 6.2.3.20110921-0940

这确实是一种错误,但是它是如此古老,以至于“这就是Notes的行为方式”。 如果您有多个同名物品,则始终会得到第一个。

但是,通常,NotesDocument中的附件都嵌入在RTF项目中,因此您可以遍历rt项目并获取附件。 如果是这种情况,此代码应执行以下操作:

    ForAll i In doc.Items
      If i.Type = RICHTEXT Then
        Print "rt item:", i.Name
        If Not IsEmpty(i.EmbeddedObjects) Then
            If ( i.Type = RICHTEXT ) Then
                ForAll o In i.EmbeddedObjects
                    If ( o.Type = EMBED_ATTACHMENT ) Then
                        If dir(sPath & o.Name)<>"" Then Kill sPath & o.Name
                        Print sPath & o.Name
                        Call o.ExtractFile(sPath & o.Name)  
                    End If
                End ForAll
            End If
        End If
      End If
    End ForAll

对于它们不是富文本项(直接附加到文档)的情况,我认为代码应该类似:

    If Not IsEmpty(doc.Embeddedobjects) Then
        ForAll o1 In doc.Embeddedobjects
            If ( o1.Type = EMBED_ATTACHMENT ) Then
                'Set o = obj2
                If Dir(sPath & o1.Name)<>"" Then Kill sPath & o1.Name
                Print "doc>", sPath & o1.Name
                Call o1.ExtractFile(sPath & o1.Name)  
            End If
        End ForAll          
    End If

但是我只是测试了这段代码,却惊讶地发现它没有拾取任何附件(甚至文档中的OLE对象),我不知道是否有人对此发表评论-我很确定它在过去的日子里能正常工作吗?

在进一步调查中,一种适用于项目和直接嵌入项目的解决方案是:

dim names, obj
names = Evaluate("@AttachmentNames", doc)
ForAll aname In names
    Set obj = doc.Getattachment(aname)
    Print "any>", sPath & obj.Name
    Call obj.ExtractFile(sPath & obj.Name) 
End ForAll

在所有情况下,都有一个限制-如果您有多个相同的命名附件,则只能使用一次“正确”名称,所有其他名称都将使用内部生成的名称。 我不知道有比通过C API获取此信息更好的解决方案。

我找到了答案。

我好像有一个

lotusNotesDocument.convertToMIME();

语句在我之前提出的代码块之前执行。

如果我删除此输出如下

**1***111********* ATTACHMENT=$FILE=Desert.jpg
**1***111********* ATTACHMENT=$FILE=Hydrangeas.jpg
**1***111********* ATTACHMENT=$FILE=Tulips.jpg

我具有lotusNotesDocument.convertToMIME()以便将便笺邮件导出到磁盘。 因此,我将这两条语句移到附件导出部分下面。

通过以下链接的另一篇文章找到了答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM