【问题标题】:Lotus Notes - Mail Document - Get Attachment Names (and Export Attachments)Lotus Notes - 邮件文档 - 获取附件名称(和导出附件)
【发布时间】:2014-10-19 07:16:34
【问题描述】:

我的一个 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

【问题讨论】:

  • 问题是在输出中我只能看到一个附件'Hydrangeas.jpg'(写了三遍)。我期待所有三个附件名称 Desert.jpg、Hydrageas.jpg 和 Tulips.jpg

标签: java email lotus-notes lotus-domino email-attachments


【解决方案1】:

这确实是一种错误,但非常古老,以至于“这就是 Notes 的行为方式”。如果您有多个同名的项目,您总是会得到第一个。

但是,NotesDocument 中的附件通常嵌入在富文本项中,因此您可以遍历 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 来获取此信息更好的解决方案。

【讨论】:

    【解决方案2】:

    我找到了答案。

    我好像有一个

    lotusNotesDocument.convertToMIME();
    

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

    如果我删除它,输出如下

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

    我有 lotusNotesDocument.convertToMIME() 以便将便笺邮件导出到磁盘。所以我将这两个语句移到附件导出部分下方。

    通过以下Link的另一篇帖子找到了答案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多