使用带有 C++ 的 MAPI,我如何打开另一个用户的收件箱?

Posted

技术标签:

【中文标题】使用带有 C++ 的 MAPI,我如何打开另一个用户的收件箱?【英文标题】:Using MAPI w/ C++, how can I open another user's Inbox? 【发布时间】:2008-12-08 16:48:22 【问题描述】:

我希望编写一个自动监控脚本,以编程方式从另一个用户的 Exchange 2003 收件箱中检索信息。我有工作的 C++ 代码来登录 MAPI 并连接到我自己的收件箱。我还可以使用控制面板->邮件小程序将另一个用户的邮箱配置到我的个人资料中,我的代码可以通过这种方式访问​​。但是,这是在我安装了 Outlook 的桌面上完成的,它提供了更丰富的邮件配置文件编辑器。

由于这将在服务器上运行,我宁愿根本不安装 Outlook。相反,我可以安装MAPI client。然后我创建了一个简单的 MAPI 应用程序,它使用带有 MAPI_LOGON_UI 标志的 MAPILogonEx() 弹出邮件配置文件向导。但是,基本 MAPI 客户端不具备配置其他用户邮箱的功能。作为要求,我只能将这个脚本作为监控应用程序的服务帐户运行,所以我不能让它作为我想要的邮箱的帐户运行。

是否仍然可以使用基本 MAPI 客户端连接到另一个用户的邮箱(假设已授予权限)?或者是否绝对有必要为此功能安装 Outlook?

【问题讨论】:

【参考方案1】:

我强烈建议使用 Microsoft Exchange MAPI 客户端(如您所链接的那样)。它被设计为比这些库的 Outlook 版本更强大。您应该会发现在扩展 MAPI 方面,Outlook 和 Exchange Server 之间的 API 没有什么不同。

您将需要使用扩展 MAPI(如 Cain T S Random 所述)来打开其他邮件存储,当然您的应用程序需要在 Exchange 服务器上以具有适当权限的 Windows 用户身份登录。

【讨论】:

【参考方案2】:

我明白了...我不确定如何明确地做到这一点;这通常是使用错误标志调用CreateStoreEntryID 的副作用。你想要做的可能是:

    从您的默认消息存储中获取IID_IExchangeManageStore 致电CreateStoreEntryID

    然后通过入口ID打开那个商店

    LPEXCHANGEMANAGESTORE mapiObject = NULL;
    
    store->QueryInterface( IID_IExchangeManageStore, (LPVOID *) &mapiObject);
    
    mapiObject->CreateStoreEntryID( server, mailbox, OPENSTORE_TAKE_OWNERSHIP | 
        OPENSTORE_USE_ADMIN_PRIVILEGE, &len, &buffer);
    
    //Call OpenEntry on the entry id
    

如果您需要更详细的示例,请在 MFC MAPI 项目的源代码中搜索 CreateStoreEntryID。如果您还有其他问题,最好的答案是microsoft.public.win32.programmer.messaging 新闻组。

【讨论】:

我对该主题的研究同意这个建议。但是,要找到为您提供 IExchangeManageStore 的二进制文件和标头似乎是不可能的。从 MS 下载中删除。它仍然可以在任何地方使用吗?【参考方案3】:

您是否查看过 ConfigureMsgService?我相信这适用于 Exchange MAPI,或者您是说您尝试过但没有用?

【讨论】:

IMsgServiceAdmin::ConfigureMsgService 将为配置文件设置邮箱。我真正想要的是一种添加附加邮箱的方法。当您在 Outlook 中执行此操作时,MAPI 将它们视为附加的 IMsgStore 条目。没有 Outlook 怎么办?

以上是关于使用带有 C++ 的 MAPI,我如何打开另一个用户的收件箱?的主要内容,如果未能解决你的问题,请参考以下文章

Boost,C ++如何杀死另一个线程打开的线程?

可以使用MAPI避免使用TNEF吗?

如何打开另一个带有链接的选项卡?

C#、C++、WinAPI - 从另一个进程获取窗口数

如何用VBA打开联系人列表

如何在 Linux 平台上创建用于用 C++ 编写的临时文件?