C# VSTO(COM) Outlook:如何获取当前处理邮件对应邮箱的NameSpace及多邮箱分类处理问题
Hey there! Let's break down your two Outlook add-in challenges and walk through practical solutions for each.
1. Getting Categories for the Correct Mailbox in Multi-Account Scenarios
The core issue here is that Application.Session.Categories always pulls from your default mailbox's session, not the one where the target mail item lives. To fix this, you need to target the specific Store that the mail item belongs to—since each Outlook mailbox (Store) maintains its own independent set of categories.
Here's how to adjust your code:
Step 1: Get the Store associated with the current MailItem
First, retrieve the Store that hosts the mail item you're processing:
Outlook.MailItem mailItem = item as Outlook.MailItem; if (mailItem != null) { // Get the Store where this mail item resides Outlook.Store targetStore = mailItem.Parent.Store; }
Step 2: Access the Store's category list
Each Store stores its category configuration in a hidden storage item (which ties into your second question!). Instead of using Session.Categories, you'll fetch this hidden item directly from the target Store:
// Get the default Calendar folder of the target Store (required to access storage items) Outlook.MAPIFolder calendarFolder = targetStore.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar); // Fetch the hidden category list storage item Outlook.StorageItem categoryStorage = calendarFolder.GetStorage("IPM.Configuration.CategoryList", Outlook.OlStorageIdentifierType.olIdentifyByMessageClass);
2. Working with the Hidden Category Storage Item (stIt)
You can't directly cast a StorageItem to Outlook.Categories—because the category data is stored as XML inside a specific MAPI property of the storage item. Here's how to read, modify, and save category data from this hidden item:
Reading Category Data from the Storage Item
The category list lives in the PR_ROAMING_XMLSTREAM MAPI property (tag 0x7C080102). Use the PropertyAccessor to extract this XML, then parse it to access individual categories:
Outlook.PropertyAccessor propAccessor = categoryStorage.PropertyAccessor; // Retrieve the XML string containing category data string categoryXml = propAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x7C080102") as string; // Parse the XML (using System.Xml.Linq for simplicity) XDocument categoryDoc = XDocument.Parse(categoryXml); // Example: List all existing categories foreach (var categoryNode in categoryDoc.Descendants("Category")) { string catName = categoryNode.Attribute("Name")?.Value; string catColor = categoryNode.Attribute("Color")?.Value; // Do something with the category details }
Modifying and Saving Category Data
To add or update a category, modify the XML document, then write it back to the storage item:
// Example: Add a new category to the XML XElement newCategory = new XElement("Category", new XAttribute("Name", "YourCategoryName"), new XAttribute("Color", "olCategoryColorDarkBlue"), // Use valid Outlook color values new XAttribute("ShortcutKey", "olCategoryShortcutKeyNone") ); categoryDoc.Root.Add(newCategory); // Write the modified XML back to the storage item propAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x7C080102", categoryDoc.ToString()); // Save the changes categoryStorage.Save();
Applying the Category to the Mail Item
Once you've ensured the category exists in the target Store's list, assign it to the mail item just like before:
mailItem.Categories = "YourCategoryName"; mailItem.Save();
Key Takeaways
- Always target the Store associated with the mail item instead of relying on
Application.Sessionfor multi-account scenarios. - Outlook stores per-account categories in a hidden storage item—you need to work with its XML content to manage categories across different mailboxes.
内容的提问来源于stack exchange,提问作者KUL

