【问题标题】:Get Inboxes from Outlook从 Outlook 获取收件箱
【发布时间】:2011-10-14 12:17:35
【问题描述】:
我在 Outlook 2010 中配置了两个 Exchange 帐户,但是我不知道如何访问第二个帐户的收件箱。 Session.GetDefaultFolder() 总是返回第一个。
即使枚举 Session.Accounts,找到正确的帐户并调用 Session.Account(found one).Store.GetDefaultFolder() 也会返回错误的收件箱(来自默认交换帐户,而不是辅助帐户)。
【问题讨论】:
标签:
vba
outlook
outlook-addin
【解决方案1】:
这会显示所有可用的收件箱吗?
Sub LoopThroughInboxes
Dim ol As Outlook.Application
Dim ns As Outlook.NameSpace
Dim i As Long
Set ol = Outlook.Application
Set ns = ol.GetNamespace("MAPI")
For i = 1 To ns.Folders.Count
Debug.Print ns.Folders(i).Name
Next i
如果是这样,那么ns.Folders(i).Folders("Inbox") 将为您提供每个邮箱的收件箱。
【解决方案2】:
使用Store.GetDefaultFolder 而不是Namespace.GetDefaultFolder。
请注意,Store.GetDefaultFolder 是在 Outlook 2010 中添加的。在早期版本的 Outlook 中,使用扩展 MAPI(C++ 或 Delphi)或Redemption (RDOStore.GetDefaultFolder)。
【解决方案3】:
也许你早就放弃了这个问题,但是这里……
我之前也遇到过同样的问题,我通过添加 Outlook 帐户管理 API 解决了这个问题。不幸的是,这是一个面向 c++ 的 API。 (我的插件已经用c++开发了)
此外,VBA 和 .NET 插件使用的 OOM(Outlook 对象模型)对多个帐户的支持很差(如果有的话)。通过添加交换帐户,您实际上已将多个帐户添加到您的个人资料中。
因此,您可能需要降低一个级别,将 MAPI 与 c++ 结合使用,然后挂钩 Outlook 帐户管理 API。工作量很大,但这正是我所做的,而且效果很好。
另外,这里有一个例子:
http://www.codeproject.com/KB/IP/IOlkAccountManager.aspx
【解决方案5】:
我猜这是一个旧的,但有一天可能有人需要它。
这是迭代 Outlook 中所有“已发送邮件”文件夹的代码。 (我认为这仅适用于 Outlook 2010 及更高版本)。
MSOutlook._NameSpace ns = Globals.ThisAddIn.Application.GetNamespace("MAPI");
var accounts = ns.Accounts;
foreach (MSOutlook.Account account in accounts)
{
try
{
// You might want to test if DeliveryStore is null, in case this account is not an Exchange account
MSOutlook.MAPIFolder sentFolder = account.DeliveryStore.GetDefaultFolder(MSOutlook.OlDefaultFolders.olFolderSentMail);
if(sentFolder != null)
{
SentItems = sentFolder.Items;
SentItems.ItemAdd += LogMethods.Items_Sent_ItemAdd;
}
}
catch (Exception e)
{
BaseClass.log.Log(LoggLevel.Warning, e.Message);
}
}