C# 使用Outlook Spy中的EntryID打开GetItemFromID为的某些Outlook邮件项目时出错

C# 使用Outlook Spy中的EntryID打开GetItemFromID为的某些Outlook邮件项目时出错,c#,outlook,mapi,mailitem,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 O

当我使用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");
}
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();
                        }
                    }

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

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

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


您可能还希望在异常处理程序中记录异常详细信息(例如,Message)。

多亏了所有受访者,这就解释了为什么有时会打开特定消息,有时不会打开。通过使用以下代码获取StoreId:

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");
}
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; }
    }
publicstaticoutlook.foldergetfolder(Outlook.Application应用程序,字符串folderPath)
{
Outlook文件夹;
字符串反斜杠=@“\”;
尝试
{
if(folderPath.StartsWith(@“\\”)
{
folderPath=folderPath.Remove(0,2);
}
字符串[]文件夹=
folderPath.Split(反斜杠.ToCharArray());
文件夹=
App.Session.Folders[文件夹[0]]
作为Outlook.Folder;
如果(文件夹!=null)
{

对于(int i=1;i我将在这里为子孙后代提供这一点——Outlook 2002要求提供给GetItemFromID的条目ID使用大写十六进制字符。

代码中到底出现了什么错误?错误消息?请告诉我显式指定第二个参数是否有帮助。