使用Outlook Spy中的EntryID打开一些带有GetItemFromID的Outlook MailItem时出错

时间:2015-03-29 10:23:36

标签: c# outlook mapi mailitem

当我使用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可靠地显示所有消息的任何其他方法?

3 个答案:

答案 0 :(得分:1)

邮件存储在活动Outlook会话中触摸了邮件所在的位置? MAPI提供程序的工作方式,当MAPI加载提供程序时,它会注册它将处理的条目id guids(条目ID中的字节5-20)。如果在当前会话中未触及特定PST存储,则MAPI不会了解其入口ID。

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

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

答案 1 :(得分:0)

感谢所有受访者 - 这解释了为什么有时特定的消息会打开,有时候却不会。通过使用以下代码获取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; }
    }

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

答案 2 :(得分:0)

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