2013-02-14 144 views
1

我的任务是构建可使用MAPI检查电子邮件的应用程序。我使用了cpp编码的wrapper class,这是从c#访问的。我意识到,结合托管代码和非托管代码并不一定是最好的路径,但这是我能够工作的。使用MAPI从服务访问Exchange服务器

得到它的工作,有人问我,使应用程序的服务,所以当在没有登录系统就可以运行了。

客户要求我们使用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); 
} 

谢谢你的任何建议。

+0

您是否考虑过使用交换Web服务,而不是依赖运行时环境的配置文件?它有一个托管的.net包装器,可以很容易地处理。 – sasfrog 2013-02-14 22:22:16

回答

2

您可以使用MSEMS服务动态创建临时配置文件并对其进行配置。
请参阅http://support.microsoft.com/kb/306962?wa=wsignin1.0并滚动至“使用MAPI IProfAdmin界面”
确保服务以邮箱所有者的身份运行。

+0

这是一个很好的建议,但它并没有像我想象的那样为我工作。我在用户级别登录,因此我可以访问与该帐户关联的配置文件。我相信这个配置文件应该已经创建并关联了。 – Tim 2013-03-27 23:33:54

+0

如果您以具有本地权限的域用户身份登录,并且在运行服务的计算机上创建了配置文件,则只需使用MAPILogonEx即可登录到现有配置文件。只要确保您的服务以在配置文件中拥有主邮箱的域用户身份运行,并且该域用户已配置了本地Outlook配置文件即可。 – 2013-03-28 16:38:01

+0

标记为再次解决。德米特里实际上解决了它在这里:http://social.msdn.microsoft.com/Forums/en-US/outlookdev/thread/7a9cc40a-ffd6-4f83-9973-5410615b4df4 – Tim 2013-04-05 23:06:18