快速搜索 Outlook 地址列表
Fast searching an Outlook Address list
我想通过电子邮件地址从 Outlook 中搜索一个巨大的地址列表以查找 AddressEntry。按名称搜索没有问题,您可以这样写:
Microsoft.Office.Interop.Outlook.AddressEntry = AddressEntries[Name];
但我想通过电子邮件找到条目。此代码有效但速度极慢:
public static string GetUserDataByEmailAddress(string EmailAddress)
{
Microsoft.Office.Interop.Outlook.Application OLApp = null;
bool OutlookWasRunning = false;
string UserName = string.Empty;
if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Count() > 0)
{
OLApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application") as Microsoft.Office.Interop.Outlook.Application;
OutlookWasRunning = true;
}
else
{
OLApp = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.NameSpace nameSpace = OLApp.GetNamespace("MAPI");
nameSpace.Logon("", "", System.Reflection.Missing.Value, System.Reflection.Missing.Value);
nameSpace = null;
OutlookWasRunning = false;
}
Microsoft.Office.Interop.Outlook.AddressLists GALs = null;
GALs = OLApp.Session.AddressLists;
if (GALs == null) { throw new System.Exception("ERROR: Unable to get address book collection from MS Outlook!"); }
Microsoft.Office.Interop.Outlook.AddressList gal = null;
gal = GALs["Globale Adressliste"];
if (gal == null) { throw new System.Exception("ERROR: Unable to get address book 'Global Address List' from MS Outlook!"); }
foreach (Microsoft.Office.Interop.Outlook.AddressEntry ent in gal.AddressEntries)
{
if(ent.Address == EmailAddress) { UserName = ent.Name; }
}
if (!OutlookWasRunning) { OLApp.Quit(); }
return UserName;
}
好的,但是这种方式很慢。现在,我尝试使用 AddressEntries 作为 IEnumeratable 来执行此操作:
var output = from a in gal.AddressEntries.AsQueryable() where (a as Microsoft.Office.Interop.Outlook.AddressEntry).Address == EmailAddress select a;
这样做,我得到错误:
Severity Code Description Project File Line Suppression State Error CS1936 Could not find an implementation of the query pattern for source type 'IQueryable'. 'Where' not found.
有人知道搜索正确地址条目的快速方法吗?
此致,
一月
不要遍历容器中的所有项目 - 有些容器可能包含数万个或更多条目。
您可以在 OOM 中使用 Namespace.CreateRecipient
/ Recipient.Resolve
- 这将针对所有容器解析名称(或地址)。这等同于在 Outlook 的编辑框中键入名称并按 Ctrl+K。
如果您想针对特定容器(例如“所有用户”GAL 容器)进行解析,则需要使用扩展 MAPI(仅限 C++ 或 Delphi)。您可以使用 Redemption (I am its author - any language) - it exposes RDOSession.AddressBook.ResolveName
/ ResolveNameEx
and RDOAddresList.ResolveName
/ ResolveNameEx
.
请记住,如果使用 SMTP 地址(GAL 限制),针对特定容器的解析(PR_ANR
MAPI 中的解析)可能不起作用。
我想通过电子邮件地址从 Outlook 中搜索一个巨大的地址列表以查找 AddressEntry。按名称搜索没有问题,您可以这样写:
Microsoft.Office.Interop.Outlook.AddressEntry = AddressEntries[Name];
但我想通过电子邮件找到条目。此代码有效但速度极慢:
public static string GetUserDataByEmailAddress(string EmailAddress)
{
Microsoft.Office.Interop.Outlook.Application OLApp = null;
bool OutlookWasRunning = false;
string UserName = string.Empty;
if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Count() > 0)
{
OLApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application") as Microsoft.Office.Interop.Outlook.Application;
OutlookWasRunning = true;
}
else
{
OLApp = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.NameSpace nameSpace = OLApp.GetNamespace("MAPI");
nameSpace.Logon("", "", System.Reflection.Missing.Value, System.Reflection.Missing.Value);
nameSpace = null;
OutlookWasRunning = false;
}
Microsoft.Office.Interop.Outlook.AddressLists GALs = null;
GALs = OLApp.Session.AddressLists;
if (GALs == null) { throw new System.Exception("ERROR: Unable to get address book collection from MS Outlook!"); }
Microsoft.Office.Interop.Outlook.AddressList gal = null;
gal = GALs["Globale Adressliste"];
if (gal == null) { throw new System.Exception("ERROR: Unable to get address book 'Global Address List' from MS Outlook!"); }
foreach (Microsoft.Office.Interop.Outlook.AddressEntry ent in gal.AddressEntries)
{
if(ent.Address == EmailAddress) { UserName = ent.Name; }
}
if (!OutlookWasRunning) { OLApp.Quit(); }
return UserName;
}
好的,但是这种方式很慢。现在,我尝试使用 AddressEntries 作为 IEnumeratable 来执行此操作:
var output = from a in gal.AddressEntries.AsQueryable() where (a as Microsoft.Office.Interop.Outlook.AddressEntry).Address == EmailAddress select a;
这样做,我得到错误:
Severity Code Description Project File Line Suppression State Error CS1936 Could not find an implementation of the query pattern for source type 'IQueryable'. 'Where' not found.
有人知道搜索正确地址条目的快速方法吗?
此致, 一月
不要遍历容器中的所有项目 - 有些容器可能包含数万个或更多条目。
您可以在 OOM 中使用 Namespace.CreateRecipient
/ Recipient.Resolve
- 这将针对所有容器解析名称(或地址)。这等同于在 Outlook 的编辑框中键入名称并按 Ctrl+K。
如果您想针对特定容器(例如“所有用户”GAL 容器)进行解析,则需要使用扩展 MAPI(仅限 C++ 或 Delphi)。您可以使用 Redemption (I am its author - any language) - it exposes RDOSession.AddressBook.ResolveName
/ ResolveNameEx
and RDOAddresList.ResolveName
/ ResolveNameEx
.
请记住,如果使用 SMTP 地址(GAL 限制),针对特定容器的解析(PR_ANR
MAPI 中的解析)可能不起作用。