我正在寻找一些代码(首选C#或VB.NET)来迭代Outlook邮箱中的所有文件夹并返回这些文件夹的名称。我不打算弹出Outlook文件夹对话框,而是从Outlook外部返回给定邮箱中的文件夹名称。
由于
答案 0 :(得分:7)
使用VSTO(Visual Studio Tools for Office)实际上非常简单。首先使用VSTO创建一个Outlook 2007添加。以下是我的一些实验性代码。
private void RecurseThroughFolders(Outlook.Folder theRootFolder, int depth)
{
if ( theRootFolder.DefaultItemType != Outlook.OlItemType.olMailItem ) {
return;
}
Console.WriteLine("{0}", theRootFolder.FolderPath);
foreach( Object item in theRootFolder.Items ) {
if (item.GetType() == typeof( Outlook.MailItem )) {
Outlook.MailItem mi = (Outlook.MailItem)item;
if (mi.Categories.Length > 0) {
WriteLinePrefix(depth);
Console.WriteLine(" $ {0}", mi.Categories);
}
}
}
foreach (Outlook.Folder folder in theRootFolder.Folders) {
RecurseThroughFolders(folder, depth + 1);
}
}
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Outlook.Application olApp = new Outlook.Application();
Console.WriteLine("Default Profile = {0}", olApp.DefaultProfileName);
Console.WriteLine("Default Store = {0}", olApp.Session.DefaultStore.DisplayName);
selectExplorers = this.Application.Explorers;
selectExplorers.NewExplorer += new Outlook.ExplorersEvents_NewExplorerEventHandler( newExplorer_Event );
Outlook.Folder theRootFolder = (Outlook.Folder) olApp.Session.DefaultStore.GetRootFolder();
RecurseThroughFolders( theRootFolder, 0 );
}
答案 1 :(得分:3)
我更喜欢LINQ友好的方法:
private IEnumerable<MAPIFolder> GetAllFolders(Folders folders)
{
foreach (MAPIFolder f in folders) {
yield return f;
foreach (var subfolder in GetAllFolders(f.Folders)) {
yield return subfolder;
}
}
}
然后你可以像任何方式仔细阅读文件夹。例如:
private IEnumerable<MailItem> GetAllEmail(NameSpace ns)
{
foreach (var f in GetAllFolders(ns.Folders)) {
if (f == DELETE_FOLDER) continue;
if (f.DefaultItemType == OlItemType.olMailItem) {
// Party!
}
}
}