Vba 访问内联和条形附件

Vba 访问内联和条形附件,vba,outlook,email-attachments,Vba,Outlook,Email Attachments,Outlook邮件可以包含附件(参见图,借用自): 一组内联附件(IA,左图),理解为文本以外的任何对象 一套钢筋附件(BA,右图) 关于通过VBA访问它们,我有几个问题。它们是相互关联的,因此值得一起发布 是否有全面的方法访问IA? 在许多情况下,我发现集合MailItem.Inspector.WordEditor.InlineShapes(IS)IS=IA。这总是真的吗 是否有一种全面的方式访问BA? 在许多情况下,我发现集合MailItem.attachments(AT)是AT

Outlook邮件可以包含附件(参见图,借用自):

  • 一组内联附件(IA,左图),理解为文本以外的任何对象

  • 一套钢筋附件(BA,右图)

关于通过VBA访问它们,我有几个问题。它们是相互关联的,因此值得一起发布

  • 是否有全面的方法访问IA?
    在许多情况下,我发现集合
    MailItem.Inspector.WordEditor.InlineShapes
    (IS)IS=IA。这总是真的吗

  • 是否有一种全面的方式访问BA?
    在许多情况下,我发现集合
    MailItem.attachments
    (AT)是AT=IA+BA。但我也发现了例外:带有非空IA和空AT的电子邮件。使用AT可能会有所帮助,即使是对我的发现

  • 在IA中有一个项目的引用,是否有办法知道AT中是否有相应的项目(根据#2,可能没有),如果有,请识别它,IA->AT?

  • 将第3题中的问题颠倒过来:
    引用AT中的某个项目,是否有任何方法可以查询该项目是否为
    InlineShape
    ,如果是,是否知道它对应于IA中的哪个项目,AT->IA?

  • 是否有任何方法建立BAAT之间的联系,类似于IAAT的问题3和问题4?


  • 注:我正在使用Outlook 2010,根据和,这可能会带来与Outlook 2007不同的结果,等等。

    第一张图片是RTF格式的电子邮件。附件图标在邮件正文中呈现。第二个屏幕截图是普通消息或HTNML消息。在这两种情况下,都可以通过MailItem.attachments集合访问附件

    是否有全面的方法访问IA?在许多情况下,我发现集合MailItem.Inspector.WordEditor.InlineShapes(Is)是=IA。这总是真的吗

    <代码>内联窗体< /C>可能包含您不太可能考虑的“附件”,例如,嵌入在您的签名中的公司徽标等将出现为 InLeNeSpAs//Cord>这不是一个“附件”(尽管纯文本电子邮件可以包括附件)…< /P> 内联“附件”(插入为对象|例如,从文件创建)显示为
    Type=wdinlineshapectrure
    ,并且它们没有
    OLEFormat
    属性(这让我感到惊讶…)

    是否有一种全面的方式访问BA? 在许多情况下,我发现集合MailItem.attachments(AT)是AT=IA+BA。但我也发现了例外:带有非空IA和空AT的电子邮件。使用AT可能会有所帮助,即使是对我的发现

    根据我上面的第二条评论,内联形状“附件”显示为
    wdInlineShapePicture
    ,但我认为它们被迂回地视为“附件”。迭代attachments集合时,您可能会注意到具有通用名称的项,如
    “image002.png”
    ,我相信这些项基本上是通过元数据文件(也可能显示为附件项
    “oledata.mso”
    )链接到另一个通用名称的附件(如
    “image001.wmz”)
    这些附件都不是
    集合的一部分。附件将不会显示为“条形附件”

    上面的截图来自这封电子邮件,我在其中创建了一个dictionary对象,以按名称(键)存储附件。这封电子邮件有2个“条形附件”和2个“内联附件”。请注意,“条形附件”由其真实的“名称”表示,而“内联附件”被拆分到wmz/png文件中

    参考IA中的某个项目,是否有办法知道AT中是否有相应的项目(根据#2,可能没有),如果有,则标识为IA->AT

    我不这么认为。据我所知,
    “oledata.mso”
    文件不是您可以读取或解析的,而且这似乎是连接wmz/png文件的唯一东西

    将第3题中的问题颠倒过来: 在AT->IA中有对某个项目的引用,是否有任何方法可以查询该项目是否为InlineShape,如果是,是否知道它对应于IA中的哪个项目?

    没有。据我所知,内联形状和附件之间没有“对应关系”。即使您要插入与附件和对象/内联形状相同的文件,它们也是独立的、不同的项目

    下面是另一个电子邮件示例:

    以及
    附件
    集合中的相应项目:

    是否有任何方法建立BAAT的连接

    根据我的研究,可能

    您可以检查电子邮件正文的HTML源代码,并解析出内联形状。下面您可以看到上一个屏幕截图中的png/wmz

    如果将所有附件存储在字典对象中(假设
    m
    MailItem
    对象):

    然后,如果您已经从HTML源代码中识别了png/wmz,则可以使用
    .remove
    方法将其从
    对象中删除

    dictAttachments.Remove("image001.wmz") 'etc.
    
    然后,dictionary对象将只包含条附件

    这样做的问题(我现在已经尝试过了…)是我无法找到解析HTML的方法(使用HTMLFile对象)来获取PNG——它位于HTMLBody的一部分,基本上被注释掉/有条件地呈现,因此它不响应
    getElementsByTagName
    方法,等等

    虽然我总是更喜欢使用HTML/XML对象(它通常是一个糟糕的ide)
    dictAttachments.Remove("image001.wmz") 'etc.
    
    Dim itm as Variant
    For each itm in dictAttachments.Keys()
        If Instr(1, m.HtmlBody, "cid:" & itm & "@") > 0 Then
            dictAttachments.Remove(itm)
        End If
    Next
    'Ignore the oledata.mso, too:
    If dictAttachments.Exists("oledata.mso") Then dictAttachments.Remove("oledata.mso")
    
    Select case m.BodyFormat 
        Case olFormatRichText
            For each shp in doc.InlineShapes
                If Not shp.OleFormat Is Nothing Then
                    If shp.OLEFormat.ClassType = "Outlook.FileAttach" Then
                        'Do something here
                    End If
                End If
            Next
        Case olFormatHTML
            ' Do something like the example above for HTML
        Case olFormatPlainText
            ' Do something different, if needed, for plain text emails
        Case olFormatUnspecified
            ' not sure what to do here and it's not really my problem to figure out...
    End Select