【问题标题】:Microsoft Interop OutLook C#- Cannot save attachments of type OLEMicrosoft Interop OutLook C# - 无法保存 OLE 类型的附件
【发布时间】:2015-05-15 13:43:16
【问题描述】:

我有一个 C# 程序将来自 Outlook 邮箱的未读电子邮件的附件保存到一个文件夹中,并且下面的代码行(第一行)用于 OLE 类型的附件类型,并出现错误“Outlook 无法对此执行此操作附件类型”(其中“它”的类型为MailItem)。

string attachedfilename = it.Attachments[i].FileName;
it.Attachments[i].SaveAsFile("C:\\temp\\"+attachedfilename);

我已阅读有关使用 http://www.dimastr.com/redemption/RDOMail.htm(库)来解决 Ole 类型附件的此问题的文章,但除了此选项之外,我是否可以使用任何其他 .NET 库来解决此问题?
如果是,请分享 C# 中的代码 sn-p。

【问题讨论】:

    标签: c# outlook interop office-interop com-interop


    【解决方案1】:

    您需要调用IAttach::OpenProperty(PR_ATTACH_DATA_OBJ, IID_IStorage, ...),然后从 IStorage 打开一个特定的流,其中包含您需要的数据。请注意,流及其格式特定于创建 OLE 附件的应用程序。 Redemption支持写字板、画笔、Excel、Power Point、Word、Open Office、Acrobat、位图、元文件等格式。

    IAttach::OpenProperty 仅在扩展 MAPI(C++ 或 Delphi)中可用,而在 C# 中则不能。

    要查看存储在 Outlook 中的数据,请查看带有OutlookSpy 的附件:选择邮件,单击 IMessage 按钮,转到 GetAttachmentTable 选项卡,双击附件,右键单击 PR_ATTACH_DATA_OBJ 属性,选择IMAPIProp::OpenProperty,选择IStorage接口。

    【讨论】:

    • 我决定使用 Redemption,因为它是托管代码。我按照兑换教程中提到的步骤来获取附件。但是 MAPIOBJECT 似乎在最新的 Outlook API 中已被弃用,我无法让它工作。你能帮我吗?示例代码 -> 应用程序 appobj = new Application(); RDOSession RDSObj = 新的 RDOSession(); RDSObj.MAPIOBJECT = appobj.Session.MAPIOBJECT; //MAPIOBJECT 没有出现在智能感知中 var MailObj = RDSObj.GetMessageFromID(it.EntryID); foreach(RDSObj.Attachments 中的附件 att) { att.SaveAsFile("foldername"); }
    • Namespace.MAPIOBJECT 未被弃用:它返回 IMAPISession Extended MAPI 对象,但由于它在 VBA 或 ..Net 语言中无用,因此类型库将其标记为隐藏。如果您不想重复使用现有的 Outlook 会话,则可以改为调用 RDOSession.Logon。
    • 我希望重新使用现有的 Outlook 会话。我有从 Interop Outlook 创建的应用程序和命名空间对象。您能否提供我需要分配 RDSObj.MAPIOBJECT 的代码行或 C# 中的示例代码?
    • RDSObj.MAPIOBJECT = appobj.Session.MAPIOBJECT;会起作用 - 即使 Intelllisense 不显示 Namespace.MAPIOJECT,您仍然可以在代码中使用它。
    • 完美!!这在经过一些来回并在社交 MSDN 中引用您的文章后才有效。最后我得到了这个工作:) 最后一个查询->我从附件中获得的 olOle 图像的名称为“Picture Device Independent Bitmap.bmp”,并且没有正确的名称。知道为什么会这样吗?
    【解决方案2】:

    传递给 Attachment 类的 SaveAsFile 方法的实际参数是什么?

    注意,C: 需要管理员权限才能写入,我建议选择另一个驱动器或文件夹(在用户配置文件中)。

    作为一种解决方法,您可以考虑使用 Outlook 和 Redemption 所基于的低级 API - Extended MAPI。您需要使用 IAttach::OpenProperty 属性打开 PR_ATTACH_DATA_OBJ 属性并将流作为 IMessage 打开。

    【讨论】:

    • 第一行“string attachfilename = it.Attachments[i].FileName;”抛出异常对于 ole 类型。对于普通邮件附件,这两行代码可以完美运行(我对 C:\Temp 文件夹具有写入权限)。您可以分享有关使用 C# 扩展 MAPI 的代码或链接吗?我可以通过任何方式将 MailItem.EntryId 传递给此 API 以获取 OLE 附件并将它们保存到文件夹中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2014-12-22
    • 2023-04-09
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多