C# 如何获取Outlook共享邮箱的已发送邮件文件夹对象
获取Outlook共享邮箱已发送邮件文件夹实现
问题点
直接调用会话级的GetDefaultFolder接口仅能返回主账户原生的已发送邮件文件夹,无法拿到关联共享邮箱下的对应文件夹,原调用代码如下:
(Interop.Folder)m_outlook.Application.Session.GetDefaultFolder(Interop.OlDefaultFolders.olFolderSentMail);
原调用方式失效的核心原因:
Session.GetDefaultFolder默认仅绑定主邮箱的存储对象,不会主动枚举其他挂载的共享存储下的默认文件夹。
正确实现方式
根据共享邮箱的挂载方式不同,有两种稳定实现方案:
方案1:遍历账户存储获取(适配手动添加的共享邮箱账户)
如果共享邮箱是在Outlook账户设置中手动添加、存在独立账户条目的场景,直接遍历会话下所有账户的投递存储,排除主邮箱后,从对应存储取已发送文件夹即可,示例代码:
using Outlook = Microsoft.Office.Interop.Outlook; using System.Diagnostics; List<Outlook.Folder> GetAllSharedSentFolders(Outlook.Application outlookApp, string mainMailSmtp) { List<Outlook.Folder> result = new List<Outlook.Folder>(); Outlook.NameSpace session = outlookApp.Session; foreach (Outlook.Account account in session.Accounts) { // 跳过主邮箱账户 if (string.Equals(account.SmtpAddress, mainMailSmtp, StringComparison.OrdinalIgnoreCase)) continue; try { Outlook.Store store = account.DeliveryStore; if (store == null || store.ExchangeStoreType == Outlook.OlExchangeStoreType.olExchangePublicFolder) continue; Outlook.Folder sentFolder = store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder; if (sentFolder != null) result.Add(sentFolder); } catch (Exception ex) { Debug.WriteLine($"获取账户{account.SmtpAddress}已发送文件夹失败: {ex.Message}"); } } return result; }
方案2:通过SMTP地址解析共享收件人获取(适配自动映射的共享邮箱)
如果共享邮箱是通过Exchange自动映射挂载、不会出现在Accounts集合中的场景,先通过共享邮箱的SMTP地址解析出有权限访问的收件人对象,再获取对应存储下的已发送文件夹,示例代码:
using Outlook = Microsoft.Office.Interop.Outlook; using System.Diagnostics; List<Outlook.Folder> GetSharedSentFoldersBySmtp(Outlook.Application outlookApp, List<string> sharedMailSmtpList) { List<Outlook.Folder> result = new List<Outlook.Folder>(); Outlook.NameSpace session = outlookApp.Session; foreach (string smtp in sharedMailSmtpList) { Outlook.Recipient recipient = session.CreateRecipient(smtp); // 必须先解析地址,确认地址有效且当前账号有权限访问 if (!recipient.Resolve() || recipient.AddressEntry == null) continue; try { Outlook.Folder sentFolder = session.GetSharedDefaultFolder(recipient, Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder; if (sentFolder != null) result.Add(sentFolder); } catch (Exception ex) { Debug.WriteLine($"获取共享邮箱{smtp}已发送文件夹失败: {ex.Message}"); } } return result; }
注意事项
- 调用前确保当前账号对目标共享邮箱拥有文件夹读取权限,否则会抛出COM访问拒绝异常
- 不建议长期持有
GetSharedDefaultFolder返回的文件夹对象缓存,Outlook缓存过期后可能出现权限异常,每次使用前重新获取稳定性更高 - 若共享邮箱配置了Exchange端"已发送邮件留存到共享邮箱"策略,上述方法获取到的文件夹就是共享邮箱外发邮件的实际存储位置
内容的提问来源于stack exchange,提问作者Dharun
相关产品推荐
相关产品推荐

