Outlook邮件可以包含附件(参见图,借用http://blogs.mccombs.utexas.edu/the-most/2011/01/28/email-attachments-in-the-body-of-outlook-messages/):
一组内联附件( 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 ?
有没有办法建立连接 BA &lt; - &gt; AT ,类似于问题#3和#4的< EM> IA &LT; - &GT; AT
PS:我使用的是Outlook 2010,根据http://www.msoutlook.info/question/261和http://support.microsoft.com/kb/222330可能会带来Outlook 2007等不同的结果。
答案 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;。
上面的屏幕截图来自这封电子邮件,我在其中创建了一个字典对象,用于按名称(密钥)存储附件。这封电子邮件有2个&#34;条形附件&#34;和2&#34;内联附件&#34;。请注意&#34;栏附件&#34;用真实的&#34;名称&#34;表示,而&#34;内联附件&#34;被拆分为wmz / png文件。
参考IA中的项目,是否有任何方法可以知道AT中是否存在相应的项目(根据#2可能没有),如果是,则识别它,IA-&gt; AT?
我不相信。据我所知,"oledata.mso"
文件不是您可以阅读或解析的内容,而且这似乎是连接wmz / png文件的唯一内容。
扭转#3中的问题: 引用AT中的项目,是否有任何方式可以查询它是否为InlineShape,如果知道它与IA中的哪个项目对应,AT-&gt; IA?
没有。据我所知,没有&#34;对应&#34;内联形状和附件之间。即使您要将相同的文件作为附件和插入Object / InlineShape,这些文件也是独立且不同的项目。
这是另一个电子邮件示例:
以及Attachments
集合中的相应项目:
有没有办法建立连接BA&lt; - &gt; AT
根据我的研究,可能。
您可以检查电子邮件正文的HTML源代码,并解析内联形状。您可以在下面看到最后一个屏幕截图中的png / wmz。
如果您将所有附件存储在字典对象中(假设m
是MailItem
个对象):
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;
有没有办法建立连接BA&lt; - &gt; AT,类似于问题#3和#4的IA&lt; - &gt; AT?
我认为你可能没有任何联系。它们是单独的物品并单独处理。即使它们是相同的文件,InlineShape
中也没有任何信息可用于尝试执行此操作。
以上所有内容均适用于HTML格式的电子邮件。对于HTML邮件,问题不在于Attachments
,而在于该上下文中InlineShapes
和InlineShape
对象的限制。
对于RTF邮件主体,而不是分割png / wmz文件,附件确实在Attachments
集合中按名称出现,另一项2实际上是JPG as我签名的一部分。
但是,您将能够观察到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
。
一个OlBodyFormat
,for the body text。
可能的值:
olFormatHTML
,
olFormatPlain
,
olFormatRichText
,
olFormatUnspecified
InlineShape.Type
。
一个WdInlineShapeType
,for each shape。
可能的值:
wdInlineShapeChart
,
wdInlineShapeDiagram
,
wdInlineShapeEmbeddedOLEObject
,
wdInlineShapeHorizontalLine
,
wdInlineShapeLinkedOLEObject
,
wdInlineShapeLinkedPicture
,
wdInlineShapeLinkedPictureHorizontalLine
,
wdInlineShapeLockedCanvas
,
wdInlineShapeOLEControlObject
,
wdInlineShapeOWSAnchor
,
wdInlineShapePicture
,
wdInlineShapePictureBullet
,
wdInlineShapePictureHorizontalLine
,
wdInlineShapeScriptAnchor
Attachment.Type
。
一个OlAttachmentType
,for each attachment。
可能的值:
olByReference
,
olByValue
,
olEmbeddeditem
,
olOLE
我已经检查了其中一些案例。所提供的信息基于这些有限的信息。
是否有全面的方式来访问IA?
我会说{是1,MailItem.Inspector.WordEditor.InlineShapes
( IA )。
根据“附件”的个人定义,此集合中可能有一些项目不被视为此类项目。访问是全面的:可能会有更多的项目,但没有遗漏。
是否有全面的方式来访问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 添加项目。
在这种情况下,InlineShape
和Hyperlink
的属性会显示有用的信息。
案例1似乎是附加图像的标准方式(up to Office 2013?)。使用案例2似乎需要进行一些调整(请参阅this,this,this和this)。
引用IA中的项目,是否有任何方法可以知道AT中是否存在相应的项目(根据#2可能没有),如果是,则识别它, IA-&GT; AT 强>
是的,至少在某些情况下。
当LinkFormat
= InlineShape.Type
时,如果没有wdInlineShapeLinkedPicture
,则 AT 中有一个项目。可以通过将InlineShape.Hyperlink
(最多为字符@)与某些InlineShape.LinkFormat.SourceName
配对来找到它。
另一方面,Attachment.DisplayName
= InlineShape.Type
时(例如,内嵌附加的Excel工作簿),我无法执行此操作。
我将编辑其他调查结果。
PS1:http://www.msoutlook.info/有非常有用的信息。 例如。, http://www.msoutlook.info/question/126, http://www.msoutlook.info/question/205, http://www.msoutlook.info/question/21, http://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.aspx 和 http://msdn.microsoft.com/es-es/microsoft.office.interop.outlook.attachment_members答案 2 :(得分:0)
第一张图片是RTF格式的电子邮件。附件图标在邮件正文中呈现。第二个屏幕截图用于普通或HTNML消息。在这两种情况下,都可以通过MailItem.Attachments集合访问附件。