【发布时间】:2013-02-15 13:44:30
【问题描述】:
我的任务是构建一个使用 MAPI 检查电子邮件的应用程序。我使用了在 cpp 中编码的wrapper class,它可以从 c# 访问。我意识到将托管代码和非托管代码结合起来不一定是最佳途径,但这是我可以开始工作的。
在它运行后,我被要求将应用程序设为服务,以便在系统未登录时运行它。
客户端要求我们使用 MAPI,并且使用的是 Outlook 2007,但我希望它与 x86 和 x64 架构兼容。将允许在多个工作站上运行的单独程序使用单个电子邮件地址发送邮件。该服务将监视此帐户,并监视来自 Exchange 的新电子邮件,称无法传递消息。发生这种情况时,它会在数据库中做一个注释以供将来更正。
我对扩展 MAPI 工作原理的理解是,它使用登录人员的配置文件来访问 Exchange Server。我的问题是,当没有人登录系统时,是否可以通过 MAPI 访问 Exchange Server?如果这不可能,OOM 是否允许在没有用户登录时访问特定的电子邮件帐户(或配置文件)?当主要使用 c# 时,一种方法会比另一种更好吗?
以下是包装类如何登录的简要示例。我添加了第二种方法,但从未让它登录到当前用户以外的配置文件。
BOOL CMAPIEx::Login(LPCTSTR szProfileName, BOOL bInitAsService)
{
DWORD dwFlags=MAPI_EXTENDED | MAPI_USE_DEFAULT | MAPI_NEW_SESSION;
if(bInitAsService) dwFlags|=MAPI_EXPLICIT_PROFILE | MAPI_NT_SERVICE;
return (MAPILogonEx(NULL, (LPTSTR)szProfileName, NULL, dwFlags, &m_pSession)==S_OK);
}
BOOL CMAPIEx::Login(LPCTSTR szProfileName, LPCTSTR szProfilePassword, BOOL bInitAsService)
{
DWORD dwFlags=MAPI_EXTENDED | MAPI_EXPLICIT_PROFILE | MAPI_NEW_SESSION;
if(bInitAsService)
dwFlags|= MAPI_NT_SERVICE;
return (MAPILogonEx(NULL, (LPTSTR)szProfileName, (LPTSTR)szProfilePassword, dwFlags, &m_pSession)==S_OK);
}
感谢您的任何建议。
【问题讨论】:
-
您是否考虑过使用 Exchange Web 服务而不是依赖运行时环境中的配置文件?它有一个托管的 .net 包装器,使其非常易于使用。
标签: c# exchange-server mapi outlook-object-model