当我使用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可靠地显示所有消息的任何其他方法?
答案 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使用大写十六进制字符。