C#通过EWS访问Outlook 365 Exchange自定义EIMS邮件文件夹的问题
访问Exchange自定义EIMS文件夹的代码修改方案
实现思路
WellKnownFolderName枚举仅包含Exchange默认文件夹(如收件箱、已发送等),自定义文件夹无法直接通过该枚举访问,需要先按名称检索到目标自定义文件夹的唯一ID,再用该ID执行邮件查询操作。
具体修改内容
- 新增自定义文件夹检索方法
在代码中新增如下通用方法,用于按名称查找指定父目录下的自定义文件夹:
static Folder GetCustomFolder(ExchangeService service, string folderName, WellKnownFolderName parentFolder = WellKnownFolderName.MsgFolderRoot) { // 定义文件夹视图,最多返回100个文件夹,可按需调整 FolderView folderView = new FolderView(100); // 设置检索属性,只需要ID和显示名称即可 folderView.PropertySet = new PropertySet(BasePropertySet.IdOnly, FolderSchema.DisplayName); // 遍历父文件夹下的所有子文件夹 FindFoldersResults findResults = service.FindFolders(parentFolder, folderView); foreach (Folder folder in findResults) { if (folder.DisplayName.Equals(folderName, StringComparison.OrdinalIgnoreCase)) { return folder; } } // 未找到匹配文件夹返回null,也可按需抛出异常 return null; }
说明:如果你的EIMS文件夹是存放在收件箱的子目录下,调用该方法时第三个参数传入WellKnownFolderName.Inbox即可。
- 修改原有邮件查询逻辑
将原来直接用WellKnownFolderName.Inbox查询的逻辑,替换为先用上面的方法获取EIMS文件夹,再执行邮件查询,修改后的核心代码段如下:
if (service != null) { // 新增:查找名为EIMS的自定义文件夹 Folder eimsFolder = GetCustomFolder(service, "EIMS"); if (eimsFolder == null) { Console.WriteLine("未找到EIMS文件夹,请检查文件夹名称和路径是否正确"); return; } // 替换原来的WellKnownFolderName.Inbox为eimsFolder.Id FindItemsResults<Item> result = service.FindItems(eimsFolder.Id, new ItemView(100)); foreach (Item item in result) { EmailMessage message = EmailMessage.Bind(service, item.Id); string body = message.Body.Text; string from = message.From.Name.ToString(); string subject = message.Subject.ToString(); Console.WriteLine("Email Sender :" + from); Console.WriteLine("Email Body" + body); Console.WriteLine("Email Subject" + subject); } }
注意事项
- 如果邮箱内存在多个同名的EIMS文件夹,可在
GetCustomFolder方法中增加路径判断逻辑,避免匹配到错误的文件夹 - 如果查询时报权限错误,请确认所使用的账号对EIMS文件夹有可读权限
- 代码中默认EIMS文件夹在邮箱根目录下,如果实际存储层级不同,调整
GetCustomFolder的第三个入参即可
内容的提问来源于stack exchange,提问作者marcellus denta
相关产品推荐
相关产品推荐

