如何通过Outlook Interop判断账户是否为默认账户
如何判断Outlook同一配置文件下的默认账户
你遇到的问题确实有点坑——Outlook Interop的Account对象本身确实没有直接标记默认账户的属性,但可以通过两种可靠的方法来判断:
方法一:对比账户收件箱与默认收件箱的EntryID
Outlook的默认收件箱对应的就是默认账户的收件箱,你可以通过获取默认收件箱的EntryID,再和每个账户的收件箱EntryID对比来判断:
var app = Marshal.GetActiveObject("Outlook.Application") as Microsoft.Office.Interop.Outlook.Application; Microsoft.Office.Interop.Outlook._NameSpace _sessionNs = app.GetNamespace("MAPI"); // 获取默认收件箱的EntryID var defaultInbox = _sessionNs.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); string defaultInboxEntryId = defaultInbox.EntryID; foreach (Microsoft.Office.Interop.Outlook.Account account in _sessionNs.Accounts) { if (account != null) { var addressAccount = account.SmtpAddress; // 获取当前账户的收件箱 var accountInbox = account.DeliveryStore.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); // 对比EntryID判断是否为默认账户 bool isDefault = accountInbox.EntryID == defaultInboxEntryId; // 处理你的业务逻辑 if (isDefault) { Console.WriteLine($"默认账户:{addressAccount}"); } } }
方法二:通过DefaultStore关联账户
默认账户对应的存储(Store)就是Namespace.DefaultStore,你可以通过每个账户的DeliveryStore和DefaultStore的EntryID对比(直接对比对象可能有引用问题,用EntryID更可靠):
var app = Marshal.GetActiveObject("Outlook.Application") as Microsoft.Office.Interop.Outlook.Application; Microsoft.Office.Interop.Outlook._NameSpace _sessionNs = app.GetNamespace("MAPI"); var defaultStore = _sessionNs.DefaultStore; foreach (Microsoft.Office.Interop.Outlook.Account account in _sessionNs.Accounts) { if (account != null) { var addressAccount = account.SmtpAddress; // 对比存储的EntryID判断是否为默认账户 bool isDefault = account.DeliveryStore.EntryID == defaultStore.EntryID; if (isDefault) { Console.WriteLine($"默认账户:{addressAccount}"); } } }
为什么之前的方法无效?
你提到的CurrentProfileName和DefaultProfile仅针对配置文件层级,无法区分同一配置文件下的多个账户;而直接调用GetDefaultFolder(olFolderInbox)时,若未绑定到对应账户的存储,返回的始终是全局默认收件箱,通过Account.DeliveryStore获取的收件箱才是当前账户专属的,这才是正确的打开方式。
内容的提问来源于stack exchange,提问作者Daniel W.
相关产品推荐
相关产品推荐

