3

我正在使用 Office 互操作 API 打开从 Outlook 保存的 .msg 文件,然后显示一个回复窗口以允许用户回复它。

运行 Office 2003 时,OpenSharedItem(pathToMSGFile); 调用抛出以下异常:

Unhandled Exception: System.AccessViolationException: Attempted to read or write
  protected memory. This is often an indication that other memory is corrupt.
  at Microsoft.Office.Interop.Outlook._NameSpace.OpenSharedItem(String Path)
  at OutlookTest.Program.Main(String[] args)

运行 Office 2008 时,它工作得非常好。

我整理了一个小测试用例,代码如下:

static void Main(string[] args)
{
    try
    {
        Application app;
        string pathToMSGFile = "\\\\path\\to\\foobar.msg";

        if (args.Length > 0)
        {
            pathToMSGFile = args[0];
        }

        if (!File.Exists(pathToMSGFile))
        {
            Console.WriteLine("{0} does not exist.", pathToMSGFile);
            return;
        }

        Console.WriteLine("Opening {0}", pathToMSGFile);

        Type olType = Type.GetTypeFromProgID("Outlook.Application", false);

        app = Activator.CreateInstance(olType) as Application;

        MailItem fld = (MailItem)app.Session.OpenSharedItem(pathToMSGFile);

        _MailItem reply = fld.ReplyAll();
        reply.Save();
        reply.Display(false);

        Console.ReadKey();

        reply.Close(OlInspectorClose.olDiscard);
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.ToString());

        if (ex.InnerException != null)
        {
            Console.WriteLine(ex.InnerException.ToString());
        }
    }

    Console.ReadKey();
}

该应用程序的目标是 .Net 4,使用 Office12 互操作库。无论是为 AnyCPU 还是 x86 编译,都会发生同样的情况。

4

3 回答 3

4

我注意到互操作库的版本 11 不包含OpenSharedItem()方法。

它从版本 12 开始可用。

似乎此操作在 Office 11/2003 上不可用(至少不能通过任何版本的互操作库上的该方法调用)。


我不确定这是否适合您的方案,但我在 Outlook Redemption 库方面取得了很好的成功。

什么是 Outlook 赎回?

Outlook Redemption 解决了 Outlook 安全补丁所施加的限制,并且提供了许多对象和函数来处理未通过 Outlook 对象模型公开的属性和功能。

Redemption 库还包括 RDO(Redemption Data Objects)对象系列,可用作完整的 CDO 1.21 或 Outlook 对象模型替代品。

它似乎规避了这些奇怪/不一致的行为中的一些 b/w 不同版本的 Outlook(通过设计或作为原始目标的“副作用”)。

如果您熟悉 CDO,那么您会对 RDO 感到满意。但老实说,我不知道它如何“映射”到 Microsoft.Office.Interop.Outlook。

参考http://www.dimastr.com/redemption/rdo/rdosession.htm

的等效 RDO 函数Session.OpenSharedItem()RDOSession.GetMessageFromMsgFile()

注意我与这个产品没有任何关系,除了我偶尔使用它!:-)

于 2012-10-08T13:04:31.180 回答
0

当您尝试保存包含大量附件的邮件时,会出现此问题。当您在 Outlook 中找到消息时,菜单文件 -> saveas 也会出现相同的错误。

于 2013-03-15T10:31:16.220 回答
0

可以从 Outlook 2003 office 读取电子邮件,但不能从路径(到 .msg 文件)读取电子邮件,但我们可以将 Outlook 文件夹(默认/其他文件夹)中的电子邮件作为 Mail-Items 对象读取。

如果它在 COM 对象 12.0 Outlook 对象库中编码并用于 Office 2003(具有 Outlook 11.0 对象库),显然它不会工作!

The Error: Attempted to read or write protected memory. This is often an indication that other memory is corrupt 主要发生在缺少.dll文件的情况下,因此最好放置相关的.dll文件或安装升级后的 Office 2007、2010。这解决了它。

我们可以使用如下所示的方法从更高版本的office(如office 2007、2010等)读取电子邮件。

outlook._Application X=new Outlook.Application();
Outlook.MAPIFolder=;  //...... Default Folderof outlook
String Path="......\...\temp.msg";
Outlook._MailItem Mail=(Outlook.MailItem)(X.Session.OpenSharedItem(Path);

您可以访问邮件并对其进行编程。

于 2014-01-31T12:34:47.933 回答