【问题标题】:How to test FileName property of Outlook attachment如何测试 Outlook 附件的 FileName 属性
【发布时间】:2022-04-03 03:27:52
【问题描述】:

某些根据文件名保存电子邮件附件的 Outlook VBA 代码在尝试访问该“附件”的 FileName 属性时在嵌入的位图图像上失败。

我怎样才能检测到这一点? FileName 属性应该是一个字符串,但这些测试都没有捕捉到它:

If objAtt.FileName = "" Then ....
If objAtt.FileName = vbNullString Then ....

但每次访问此属性的尝试都会引发运行时错误:

Outlook 无法对此类附件执行此操作。

如果可能,我宁愿不使用 DisplayName 属性。

此外,我似乎可以根据其 FileType 属性的值过滤附件,但我无法找到将这些整数值与文件类型相关联的列表。

不胜感激。

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    FileName 属性只适用于常规的olByValue 类型的附件。在您的情况下,您最有可能处理 olOLE 类型的附件,它实际上是一个序列化的嵌入式 OLE 对象 - 流存储 Outlook 用来表示图像的位图(或元文件)以及原始数据的实际数据创建数据的应用程序(MSPaint?)可以用来编辑它。

    OLE 附件数据以IStorage 接口格式存储。数据的实际格式取决于用于创建数据的应用程序(MSPaint、Excel 等)。 Outlook 对象模型不允许您使用Attachment.SaveAsFile 保存此类附件。

    根据您使用的语言(最好是 C++ 或 Delphi),您需要将 PR_ATTACH_DATA_OBJ 属性打开为 IStorage,然后提取数据 (IAttach::OpenProperty(PR_ATTACH_DATA_OBJ, IID_IStorage, ...))。看一下OutlookSpy的消息(我是它的作者)——点击IMessage按钮,进入GetAttachmentTable选项卡,双击OLE附件,选择PR_ATTACH_DATA_OBJ,右击IMAPIProp::OpenProperty

    如果使用Redemption 是一个选项(我也是它的作者),它会提取十几种最流行格式(MSPaint、Excel、Word、PDF 等)的附件数据:

    set Session = CreateObject("Redemption.RDOSession")
    Session.MAPIOBJECT = Application.Session.MAPIOBJECT
    set OutlookMsg = Application.ActiveExplorer.Selection.Item(1)
    set Msg = Session.GetRDOObjectFromOUtlookObject(OutlookMsg)
    for each attach in Msg.Attachments
      attach.SaveAsFile "c:\temp\" & attach.FileName
    next
    

    【讨论】:

    • 谢谢。这是非常有用的。我目前仅限于 VBA,我需要做的就是避免这些“附件”并捕获特定类型/扩展;希望不用使用 DisplayName。
    • 只需检查 Attachment.Type 属性 - msdn.microsoft.com/en-us/library/office/…
    • 谢谢。我确实看到了该链接,但我不确定它是否详尽,因为显示的枚举只有四个值,并且文件类型属性至少包含整数 1 和 6。
    • 就是这样:olByValue 是 1,olOLE 是 6。4 是 olByReference,5 是 olEmbeddedItem。不使用其他值。 olByValue 是您所关心的 - 您需要跳过所有其他类型的附件。
    • 非常感谢。我想我一定还没有足够的声誉来支持你的 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2014-10-21
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多