【问题标题】:Error when opening some Outlook MailItems with GetItemFromID using EntryID from Outlook Spy使用 Outlook Spy 中的 EntryID 打开带有 GetItemFromID 的某些 Outlook MailItems 时出错
【发布时间】:2015-06-02 09:25:21
【问题描述】:

当我使用 OutlookSpy 从特定文件夹中的 MailItems 中获取 EntryID 并将它们提供给以下代码时:

Outlook.Application myApp = new Outlook.ApplicationClass();
Outlook.NameSpace mapiNameSpace = myApp.GetNamespace("MAPI");

try
{
  object obj = mapiNameSpace.GetItemFromID(sEntryID);
  if (obj is Outlook.MailItem)
  {
    var getItem = (Outlook.MailItem)mapiNameSpace.GetItemFromID(sEntryID);
    getItem.Display();
  }
}
catch (Exception Ex)
{
  Global.Common.LogError("Error accessing MailItem", Ex, "EntryID " + sEntryID + " not found in " + sFolder, "Warning");
}

我收到一些 EntryID 值的未知消息错误,并且在 Outlook 中与其他人成功显示了这些消息。任何人都可以建议 MailItems 可能具有哪些属性,这将影响我是否可以使用 GetItemFromID 或任何其他通过 EntryID 可靠地显示所有消息的方法成功显示它们?

【问题讨论】:

  • 您在代码中究竟遇到了什么错误?错误信息?
  • 请告诉我明确指定第二个参数是否有帮助。

标签: c# outlook mapi mailitem


【解决方案1】:

我将把它放在这里以供后代使用——Outlook 2002 要求提供给 GetItemFromID 的条目 ID 使用大写十六进制字符。

【讨论】:

    【解决方案2】:

    感谢所有受访者 - 这解释了为什么有时会打开某些消息而有时不会打开。通过使用以下代码获取 StoreId:

    Outlook.Application myApp = new Outlook.ApplicationClass();
                        Outlook.NameSpace mapiNameSpace = myApp.GetNamespace("MAPI");
                        Object oStoreID = Common.GetFolder(myApp, sFolder).StoreID;
                        try
                        {
                            object obj = mapiNameSpace.GetItemFromID(sEntryID,oStoreID);
                            if (obj is Outlook.MailItem)
                            {
                                Outlook.MailItem getItem = (Outlook.MailItem)mapiNameSpace.GetItemFromID(sEntryID,oStoreID);
                                getItem.Display();
                            }
                        }
    

    在哪里

           public static Outlook.Folder GetFolder(Outlook.Application App, string folderPath)
        {
            Outlook.Folder folder;
            string backslash = @"\";
            try
            {
                if (folderPath.StartsWith(@"\\"))
                {
                    folderPath = folderPath.Remove(0, 2);
                }
                String[] folders =
                    folderPath.Split(backslash.ToCharArray());
                folder =
                    App.Session.Folders[folders[0]]
                    as Outlook.Folder;
                if (folder != null)
                {
                    for (int i = 1; i <= folders.GetUpperBound(0); i++)
                    {
                        Outlook.Folders subFolders = folder.Folders;
                        folder = subFolders[folders[i]]
                            as Outlook.Folder;
                        if (folder == null)
                        {
                            return null;
                        }
                    }
                }
                return folder;
            }
            catch { return null; }
        }
    

    所有 MailItems 现在都显示在 Outlook 中。

    【讨论】:

      【解决方案3】:

      邮件所在的邮件存储是否在活动的 Outlook 会话中被触及? MAPI 提供程序的工作方式是,当 MAPI 加载提供程序时,它会注册它将处理的一组条目 id guid(条目 id 中的字节 5-20)。如果在当前会话中未触及特定 PST 存储,则 MAPI 不知道有关其条目 ID 的任何信息。

      您可以首先访问当前会话中的所有商店(以确保 MAPI 知道它们的条目 id)或在调用 GetItemFromId 时使用商店条目 id(第二个参数,可选) - 这样 Outlook 将首先打开商店,然后要求商店打开该项目。如果给定的 PST 文件尚未在当前配置文件中,您还可以调用 Namespace.AddStore / AddStoreEx 来加载它。

      您可能还想在异常处理程序中记录异常详细信息 (Ex.Message)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        相关资源
        最近更新 更多