1

当我使用 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 可靠地显示所有消息的方法成功显示它们?

4

3 回答 3

1

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

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

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

于 2015-03-29T18:17:03.497 回答
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; }
    }

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

于 2015-03-30T08:22:53.500 回答
0

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

于 2015-04-02T21:43:54.840 回答