访问内联和条形附件

时间:2014-05-27 12:49:11

标签: vba outlook email-attachments outlook-vba

Outlook邮件可以包含附件(参见图,借用http://blogs.mccombs.utexas.edu/the-most/2011/01/28/email-attachments-in-the-body-of-outlook-messages/):

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

  • 一组条形附件( BA ,右图。)

enter image description here

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

  1. 是否有全面的方式来访问 IA
    在许多情况下,我发现集合MailItem.Inspector.WordEditor.InlineShapes IS )是 IS = IA 。这总是如此吗?

  2. 是否有全面的方式来访问 BA
    在很多情况下,我发现集合MailItem.attachments AT )是 AT = IA + BA 。但我发现了例外:非空 IA 的电子邮件和空 AT 。使用 AT 可能会有所帮助,即使我找到了它。

  3. 引用 IA 中的项目,有没有办法知道 AT 中是否有相应的项目(可能有不是,根据#2),如果是这样, IA - > AT

  4. 扭转#3中的问题:
    引用 AT 中的项目,是否有任何方式可以查询它是否为InlineShape,如果有,则知道 IA中的哪个项目它对应于, AT - > IA

  5. 有没有办法建立连接 BA &lt; - &gt; AT ,类似于问题#3和#4的< EM> IA &LT; - &GT; AT

  6. PS:我使用的是Outlook 2010,根据http://www.msoutlook.info/question/261http://support.microsoft.com/kb/222330可能会带来Outlook 2007等不同的结果。

3 个答案:

答案 0 :(得分:4)

  

是否有全面的方式来访问IA?在很多情况下,我发现集合MailItem.Inspector.WordEditor.InlineShapes(IS)是IS = IA。这总是如此吗?

即可。 InlineShapes可能包含您不太可能会考虑的项目&#34;附件&#34;例如,本身,您签名中嵌入的公司徽标等将显示为InlineShape,而不是&#34;附件&#34; (虽然纯文本电子邮件可能包含此作为附件......)

内联&#34;附件&#34; (作为对象|从文件中创建,例如)显示为Type = wdInlineShapePicture,并且它们没有OLEFormat属性(这让我感到惊讶......)

  

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

根据我上面的第二条评论,内联形状&#34;附件&#34;显示为wdInlineShapePicture,但我相信它们被视为&#34;附件&#34;以迂回的方式。迭代附件集合您可能会注意到具有通用名称的项目,例如"image002.png"我相信这些内容基本上是&#34;链接&#34;通过元数据文件(也可能显示为附件项"oledata.mso")到另一个通用名称的附件(如"image001.wmz"这些附件中的任何一个 < / strong> .Attachments集合的一部分,将显示为&#34;条形附件&#34;。

enter image description here

上面的屏幕截图来自这封电子邮件,我在其中创建了一个字典对象,用于按名称(密钥)存储附件。这封电子邮件有2个&#34;条形附件&#34;和2&#34;内联附件&#34;。请注意&#34;栏附件&#34;用真实的&#34;名称&#34;表示,而&#34;内联附件&#34;被拆分为wmz / png文件。

enter image description here

  

参考IA中的项目,是否有任何方法可以知道AT中是否存在相应的项目(根据#2可能没有),如果是,则识别它,IA-&gt; AT?

我不相信。据我所知,"oledata.mso"文件不是您可以阅读或解析的内容,而且这似乎是连接wmz / png文件的唯一内容。

  

扭转#3中的问题:   引用AT中的项目,是否有任何方式可以查询它是否为InlineShape,如果知道它与IA中的哪个项目对应,AT-&gt; IA?

没有。据我所知,没有&#34;对应&#34;内联形状和附件之间。即使您要将相同的文件作为附件插入Object / InlineShape,这些文件也是独立且不同的项目。

这是另一个电子邮件示例:

enter image description here

以及Attachments集合中的相应项目:

enter image description here

  

有没有办法建立连接BA&lt; - &gt; AT

根据我的研究,可能

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

enter image description here

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

Dim dictAttachments as Object
Set dictAttachments = CreateOBject("Scripting.Dictionary")
Dim attch As Attachments
Dim att as Attachment 
Dim s as Integer

    s = 0
    Set attch = m.Attachments

    For Each att In attch

        Set dictAttachments(att.DisplayName) = att
        s = s + 1
    Next

然后,如果您已从HTML源中识别出png / wmz,则可以使用dictAttachments方法.Remove对象中删除

dictAttachments.Remove("image001.wmz") 'etc.

然后,字典对象将包含 &#34; Bar Attachments&#34;。

这个问题(我现在试着这样做......)是因为我无法找到解析HTML的方法(使用HTMLFile对象)来获取PNG - 它&# 39;在HTMLBody的一部分中,它基本上被注释掉/有条件地呈现,因此它不响应getElementsByTagName方法等。

虽然我总是喜欢使用HTML / XML对象(尝试用普通字符串函数解析HTML通常是个坏主意),但这可能是一个必要的例外。你可以做一些简单的事情:

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")

现在字典只包含&#34; Bar Attachment(s)&#34;

enter image description here

  

有没有办法建立连接BA&lt; - &gt; AT,类似于问题#3和#4的IA&lt; - &gt; AT?

我认为你可能没有任何联系。它们是单独的物品并单独处理。即使它们是相同的文件,InlineShape中也没有任何信息可用于尝试执行此操作。

HTML格式的电子邮件

以上所有内容均适用于HTML格式的电子邮件。对于HTML邮件,问题不在于Attachments,而在于该上下文中InlineShapesInlineShape对象的限制。

以RTF格式发送电子邮件

对于RTF邮件主体,而不是分割png / wmz文件,附件确实在Attachments集合中按名称​​出现,另一项2实际上是JPG as我签名的一部分。

enter image description here

但是,您将能够观察到RTF中的附件具有OLEFormat属性,更具体地说,他们有OLEFormat.ClassType = "Outlook.FileAttach"

所以你可以做一些简单的事情,比如:

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

现在,鉴于它是InlineShapes的一部分,我认为你无法连接&#34;它到Attachments集合中的特定项目。您将更适合简单地迭代Attachments集合。

注意:在我的示例(非常简单的一个)中,两个词典/集合似乎以相同的方式编入索引,但我会提醒我们不要假设这种情况总是如此。因此,当您可能能够按索引位置删除时,我不确定这是一个安全/可靠的假设。

在RTF格式中,不应该有一个空的Attachments集合和一个&#34;内联附件&#34;。

答案 1 :(得分:1)

似乎存在大量可能的情况,具体取决于以下Enum(以及其他一些)的组合:

  • MailItem.BodyFormat
    一个OlBodyFormatfor the body text
    可能的值: olFormatHTMLolFormatPlainolFormatRichTextolFormatUnspecified

  • InlineShape.Type
    一个WdInlineShapeTypefor each shape
    可能的值: wdInlineShapeChartwdInlineShapeDiagramwdInlineShapeEmbeddedOLEObjectwdInlineShapeHorizontalLinewdInlineShapeLinkedOLEObjectwdInlineShapeLinkedPicturewdInlineShapeLinkedPictureHorizontalLinewdInlineShapeLockedCanvaswdInlineShapeOLEControlObjectwdInlineShapeOWSAnchorwdInlineShapePicturewdInlineShapePictureBulletwdInlineShapePictureHorizontalLinewdInlineShapeScriptAnchor

  • Attachment.Type
    一个OlAttachmentTypefor each attachment
    可能的值: olByReferenceolByValueolEmbeddeditemolOLE

我已经检查了其中一些案例。所提供的信息基于这些有限的信息。

  1. 是否有全面的方式来访问IA?
    我会说{是1,MailItem.Inspector.WordEditor.InlineShapes IA )。
    根据“附件”的个人定义,此集合中可能有一些项目不被视为此类项目。访问是全面的:可能会有更多的项目,但没有遗漏。

  2. 是否有全面的方式来访问BA?
    我会说{是1,MailItem.Attachments AT )。
    我找到了非空 IA 和空 AT 的电子邮件的说明。 他们的InlineShapes类型为wdInlineShapeLinkedPicture。但根据InlineShape.Hyperlink,即使在这种情况下,也至少有两种可能性:
    1)没有Hyperlink。 这是嵌入图像的情况,每个InlineShape IA 添加一个项目,向 AT 添加至少一个项目(可能有很多{{1 s,链接到单个InlineShape)。 在这种情况下,LinkFormat的属性会显示有用的信息,包括与 IA 中的项目相关的 AT 中的项目名称。
    2)有Attachment案例部分是不同发现的罪魁祸首)。 当图像被超链接而不是嵌入时就是这种情况。图片显示在电子邮件中,每个Hyperlink IA 添加一个项目,但他们不会向 AT 添加项目。 在这种情况下,InlineShapeHyperlink的属性会显示有用的信息。
    案例1似乎是附加图像的标准方式(up to Office 2013?)。使用案例2似乎需要进行一些调整(请参阅thisthisthisthis)。

  3. 引用IA中的项目,是否有任何方法可以知道AT中是否存在相应的项目(根据#2可能没有),如果是,则识别它, IA-&GT; AT
    是的,至少在某些情况下。 当LinkFormat = InlineShape.Type时,如果没有wdInlineShapeLinkedPicture,则 AT 中有一个项目。可以通过将InlineShape.Hyperlink(最多为字符@)与某些InlineShape.LinkFormat.SourceName配对来找到它。 另一方面,Attachment.DisplayName = InlineShape.Type时(例如,内嵌附加的Excel工作簿),我无法执行此操作。

  4. 我将编辑其他调查结果。

    PS1:http://www.msoutlook.info/有非常有用的信息。 例如。, http://www.msoutlook.info/question/126http://www.msoutlook.info/question/205http://www.msoutlook.info/question/21http://www.msoutlook.info/question/261

    PS2:也许使用一些开发人员界面提供了一些超越VBA的访问权限。即,一些问题,对于VBA而言是NO。 看到 http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.inlineshape.hyperlink%28v=office.14%29.aspxhttp://msdn.microsoft.com/es-es/microsoft.office.interop.outlook.attachment_members

答案 2 :(得分:0)

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