如何通过 C# 在所有 Outlook 共享邮箱文件夹中同时 "Search All Mailboxes"?
How do I "Search All Mailboxes" in all Outlook Shared Mailbox Folders at once via c#?
我想通过 c# 和 windows 表单模仿最新版本的 Outlook 搜索功能。具体来说,我想 "Search All Mailboxes" 对于给定的字符串。有超过 50 个文件夹和 90,000 封电子邮件。
目前,我可以使用 LINQ 搜索任何一个文件夹并获得结果。我编写了一些代码来遍历所有文件夹并创建一个我可以查询的大量 IEnumberable。
public IEnumerable<MailItem> SharedInbox
{
get
{
outlook.ActiveExplorer().Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
Outlook.Recipient recip = Outlook.Application.Session.CreateRecipient("TOCCard@Capitalone.Com");
Microsoft.Office.Interop.Outlook.MAPIFolder folder =
outlook.GetNamespace("MAPI").GetSharedDefaultFolder(recip, OlDefaultFolders.olFolderInbox);
Folders subFolders = folder.Folders;
IEnumerable<MailItem> mItems = folder.Folders[1].Items.OfType<MailItem>();
if (recip.Resolve())
{
System.Diagnostics.Debug.WriteLine("Email Address Resolve Successful.\r\n");
try
{
foreach (MAPIFolder fold in subFolders)
{
System.Diagnostics.Debug.WriteLine("Try Folder: " + fold.Name + " \r\n");
try
{
mItems = mItems.Concat(fold.Items.OfType<MailItem>());
}
catch
{ System.Diagnostics.Debug.WriteLine("No items found:\r\n"); }
}
return mItems;
}
catch
{
return null;
}
}
else
{
System.Diagnostics.Debug.WriteLine("ELSE");
return null;
}
}
这最终会起作用,但您可能会认为这种速度非常慢,而且毫无用处。
我是 LINQ 的新手,我觉得一定有更快的方法。这段代码可以调整吗?我不是 Exchange 管理员,无法访问我自己收件箱以外的 Exchange 服务器。此外,我没有与 LINQ 结婚,并且很乐意使用其他方法。我会感谢你的帮助。
注意:我刚刚注意到上面的代码通过文件夹 [1] 两次。我可以解决这个问题,但这不会显着影响所需的时间。
不,不要将 LINQ 与 OOM 一起使用。使用 Items.Find/FindNext
或 Items.Restrict
.
您也可以使用 Aplication.AdvancedSearch
(请记住它是异步的)。
我想通过 c# 和 windows 表单模仿最新版本的 Outlook 搜索功能。具体来说,我想 "Search All Mailboxes" 对于给定的字符串。有超过 50 个文件夹和 90,000 封电子邮件。
目前,我可以使用 LINQ 搜索任何一个文件夹并获得结果。我编写了一些代码来遍历所有文件夹并创建一个我可以查询的大量 IEnumberable。
public IEnumerable<MailItem> SharedInbox
{
get
{
outlook.ActiveExplorer().Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
Outlook.Recipient recip = Outlook.Application.Session.CreateRecipient("TOCCard@Capitalone.Com");
Microsoft.Office.Interop.Outlook.MAPIFolder folder =
outlook.GetNamespace("MAPI").GetSharedDefaultFolder(recip, OlDefaultFolders.olFolderInbox);
Folders subFolders = folder.Folders;
IEnumerable<MailItem> mItems = folder.Folders[1].Items.OfType<MailItem>();
if (recip.Resolve())
{
System.Diagnostics.Debug.WriteLine("Email Address Resolve Successful.\r\n");
try
{
foreach (MAPIFolder fold in subFolders)
{
System.Diagnostics.Debug.WriteLine("Try Folder: " + fold.Name + " \r\n");
try
{
mItems = mItems.Concat(fold.Items.OfType<MailItem>());
}
catch
{ System.Diagnostics.Debug.WriteLine("No items found:\r\n"); }
}
return mItems;
}
catch
{
return null;
}
}
else
{
System.Diagnostics.Debug.WriteLine("ELSE");
return null;
}
}
这最终会起作用,但您可能会认为这种速度非常慢,而且毫无用处。 我是 LINQ 的新手,我觉得一定有更快的方法。这段代码可以调整吗?我不是 Exchange 管理员,无法访问我自己收件箱以外的 Exchange 服务器。此外,我没有与 LINQ 结婚,并且很乐意使用其他方法。我会感谢你的帮助。
注意:我刚刚注意到上面的代码通过文件夹 [1] 两次。我可以解决这个问题,但这不会显着影响所需的时间。
不,不要将 LINQ 与 OOM 一起使用。使用 Items.Find/FindNext
或 Items.Restrict
.
您也可以使用 Aplication.AdvancedSearch
(请记住它是异步的)。