VSTO开发:从Outlook已发送邮件2中获取发送日期异常
问题:获取Outlook指定「已发送邮件」文件夹的发送日期数据
我需要从Outlook的已发送邮件中获取「发送日期(Sent Date)」,参照微软官方文档修改代码后无报错,但无法获取目标文件夹的数据。
当前代码实现:
private void ThisAddIn_Startup(object sender, System.EventArgs e) { outlookNameSpace = this.Application.GetNamespace("MAPI"); inbox = outlookNameSpace.GetDefaultFolder( Microsoft.Office.Interop.Outlook .OlDefaultFolders.olFolderSentMail); items = inbox.Items; items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(items_ItemAdd); }
更新说明:
程序无任何报错,但测试发现当前代码获取的是「已发送邮件1」的数据,而我需要获取「已发送邮件2」的数据(存在两个已发送邮件文件夹:已发送邮件1、已发送邮件2)
解决方案
GetDefaultFolder(OlDefaultFolders.olFolderSentMail)仅会返回Outlook预设的默认已发送邮件文件夹(即「已发送邮件1」)。要获取非默认的「已发送邮件2」,需要遍历邮箱的文件夹结构定位目标文件夹,具体实现如下:
修改后代码
private Outlook.NameSpace outlookNameSpace; private Outlook.Items items; private void ThisAddIn_Startup(object sender, System.EventArgs e) { outlookNameSpace = this.Application.GetNamespace("MAPI"); // 获取当前邮箱的根文件夹 Outlook.Folder rootFolder = outlookNameSpace.Session.DefaultStore.GetRootFolder() as Outlook.Folder; // 查找目标文件夹「已发送邮件2」 Outlook.Folder targetSentFolder = FindFolder(rootFolder, "已发送邮件2") as Outlook.Folder; if (targetSentFolder != null) { items = targetSentFolder.Items; items.ItemAdd += Items_ItemAdd; } } // 递归遍历文件夹,匹配目标名称 private Outlook.Folder FindFolder(Outlook.Folder parentFolder, string targetFolderName) { Outlook.Folder foundFolder = null; foreach (Outlook.Folder subFolder in parentFolder.Folders) { if (subFolder.Name.Equals(targetFolderName, StringComparison.OrdinalIgnoreCase)) { foundFolder = subFolder; break; } // 递归查找子文件夹 foundFolder = FindFolder(subFolder, targetFolderName); if (foundFolder != null) break; } return foundFolder; } private void Items_ItemAdd(object Item) { if (Item is Outlook.MailItem mailItem) { // 获取发送日期 DateTime sentDate = mailItem.SentOn; // 后续处理逻辑示例 Console.WriteLine($"邮件发送日期:{sentDate}"); } }
关键说明
- 默认文件夹限制:
GetDefaultFolder只能访问Outlook内置的默认文件夹,无法直接获取自定义或额外创建的文件夹 - 文件夹遍历逻辑:通过递归方法
FindFolder遍历整个邮箱文件夹树,使用不区分大小写的匹配避免名称大小写问题 - 发送日期获取:在
ItemAdd事件中,判断Item为MailItem后,通过SentOn属性直接获取发送日期
内容的提问来源于stack exchange,提问作者gabrielcassimiro
相关产品推荐
相关产品推荐

