diff --git a/EmailSearch/EmailSearchTools.cs b/EmailSearch/EmailSearchTools.cs index ac9eedb..3cd23be 100644 --- a/EmailSearch/EmailSearchTools.cs +++ b/EmailSearch/EmailSearchTools.cs @@ -27,7 +27,7 @@ public class EmailSearchTools [Description("Number of days back to search (default 365)")] int daysBack = 365, [Description("Maximum number of results to return (default 25)")] int maxResults = 25, [Description("Number of results to skip for pagination (default 0)")] int offset = 0, - [Description("Outlook folder to search: Inbox, SentMail, Drafts, DeletedItems, Junk, or All (default All)")] string folder = "All", + [Description("Outlook folder to search: Inbox, SentMail, Drafts, DeletedItems, Junk, All, or any custom folder name (default All)")] string folder = "All", [Description("Filter by attachment: 'true' for emails with attachments, 'false' for without, or filename to search")] string? hasAttachment = null, [Description("Filter by importance: High, Normal, or Low")] string? importance = null, [Description("Filter by category name")] string? category = null, @@ -79,7 +79,7 @@ public class EmailSearchTools public static string ReadEmail( [Description("Exact or partial subject line to match")] string subject, [Description("Date of the email (supports: yyyy-MM-dd, MM/dd/yyyy, dd/MM/yyyy)")] string date, - [Description("Outlook folder: Inbox, SentMail, Drafts, DeletedItems, Junk, or All (default All)")] string folder = "All") + [Description("Outlook folder: Inbox, SentMail, Drafts, DeletedItems, Junk, All, or any custom folder name (default All)")] string folder = "All") { try { @@ -125,6 +125,9 @@ public class EmailSearchTools { folders.Add(ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox)); folders.Add(ns.GetDefaultFolder(OlDefaultFolders.olFolderSentMail)); + // Also search subfolders of Inbox for "All" + var inbox = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox); + AddSubfolders(inbox, folders); } else if (folderMap.TryGetValue(folder, out var olFolder)) { @@ -137,10 +140,74 @@ public class EmailSearchTools // Folder may not exist (e.g., Archive on some configurations) } } + else + { + // Search for custom folder by name + var customFolder = FindFolderByName(ns, folder); + if (customFolder != null) + { + folders.Add(customFolder); + } + } return folders; } + private static MAPIFolder? FindFolderByName(_NameSpace ns, string folderName) + { + // Search through all accounts/stores + foreach (var store in ns.Stores) + { + if (store is Store s) + { + try + { + var rootFolder = s.GetRootFolder() as MAPIFolder; + if (rootFolder != null) + { + var found = SearchFolderRecursive(rootFolder, folderName); + if (found != null) + return found; + } + } + catch + { + // Skip stores that can't be accessed + } + } + } + return null; + } + + private static MAPIFolder? SearchFolderRecursive(MAPIFolder parent, string folderName) + { + foreach (var subfolder in parent.Folders) + { + if (subfolder is MAPIFolder folder) + { + if (folder.Name.Equals(folderName, StringComparison.OrdinalIgnoreCase)) + return folder; + + var found = SearchFolderRecursive(folder, folderName); + if (found != null) + return found; + } + } + return null; + } + + private static void AddSubfolders(MAPIFolder parent, List folders) + { + foreach (var subfolder in parent.Folders) + { + if (subfolder is MAPIFolder folder) + { + folders.Add(folder); + AddSubfolders(folder, folders); + } + } + } + private static MailItem? FindEmail(MAPIFolder folder, string subject, DateTime targetDate) { var items = folder.Items;