gpt4 book ai didi

vba - 访问内联和栏附件

转载 作者:行者123 更新时间:2023-12-03 22:39:23 25 4
gpt4 key购买 nike

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 <-> AT,类似于IA <-> AT的问题#3和#4?


PS:我正在使用Outlook 2010,并且根据http://www.msoutlook.info/question/261http://support.microsoft.com/kb/222330的使用,可能会导致与Outlook 2007等不同的结果。

最佳答案

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


没有。 InlineShapes可能包含您自己不太可能会认为“附件”的项目,例如,签名中嵌入的公司徽标等将显示为InlineShape,而不是“附件”(尽管纯文本电子邮件可能包括此附件...)

内联“附件”(例如,插入对象|从文件创建)显示为Type = wdInlineShapePicture,并且没有OLEFormat属性(这使我感到惊讶...)


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


在上面的第二点评论中,内联形状“附件”显示为wdInlineShapePicture,但我认为它们以回旋方式被视为“附件”。循环访问附件集合时,您可能会发现具有通用名称(如"image002.png"的项目),我相信它们实质上是通过元数据文件(也可能显示为附件项目"oledata.mso")“链接”到另一个通用命名的附件(如"image001.wmz" 。这些附件(都不属于.Attachments集合)将不会显示为“栏附件”。



上面的屏幕截图来自此电子邮件,其中我创建了一个字典对象以按名称(键)存储附件。这封电子邮件有2个“栏附件”和2个“内嵌附件”。请注意,“栏附件”由其真实的“名称”表示,而“行内附件”则分为wmz / png文件。




引用了IA中的某个项目,是否有任何方法可以知道AT中是否存在相应的项目(根据#2,可能没有),如果可以识别,则可以找到IA-> AT?


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


扭转#3中的问题:
引用了AT中的某个项目后,是否有任何方法可以查询它是否为InlineShape,并且是否知道与IA中的哪个项目相对应,AT-> IA?


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

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



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




有什么办法建立连接BA <-> AT


根据我的研究,可能。

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



如果将所有附件存储在字典对象中(假设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 Source中识别出png / wmz,则可以使用 dictAttachments方法将其从 .Remove对象中删除。

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


然后,字典对象将仅包含“栏附件”。

麻烦的是(我现在已经尝试做这件事了……)是我无法找到一种方法来解析HTML(使用HTMLFile对象)来获取PNG,因为它是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")


现在,字典仅包含“栏附件”




是否有任何方法可以建立连接BA <-> AT,类似于IA <-> AT的问题#3和#4?


我认为您可能没有任何联系。它们是单独的项目,分别处理。即使它们是同一文件,在 InlineShape中也没有任何信息,这对于尝试执行此操作很有用。

HTML格式的电子邮件

以上所有都是针对HTML格式的电子邮件。对于HTML邮件,问题不仅仅在于 Attachments,而是该上下文中 InlineShapesInlineShape对象的限制。

RTF格式的电子邮件

对于RTF邮件正文,附件确实不是按名称出现在 Attachments集合中,而是被拆分为png / wmz文件,其他项目2实际上是JPG,这是我签名的一部分。



但是,您将能够观察到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的一部分,我认为您无法将其“连接”到 Attachments集合中的特定项目。您将更适合简单地迭代 Attachments集合。

注意:在我的示例(一个非常简单的示例)中,两个字典/集合似乎以相同的方式编制了索引,但我提醒您不要假设总是这样。因此,尽管您可以按索引位置删除,但我不确定这是一个安全/可靠的假设。

在RTF格式中,不可能有空的 Attachments集合和“内联附件”。

关于vba - 访问内联和栏附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23889897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com