C++ MAPI 包装器尝试在默认登录后获取发件人地址

Posted

技术标签:

【中文标题】C++ MAPI 包装器尝试在默认登录后获取发件人地址【英文标题】:C++ MAPI wrapper trying to get sender address after a default logon 【发布时间】:2018-05-09 07:06:42 【问题描述】:

我想通过 MAPI 包装器获取 Outlook 中默认发件人配置文件的电子邮件地址。 多年来,我一直在使用 Noel Dillbough 的 MAPI 包装器,这里描述 https://www.codeproject.com/Articles/10881/MAPIEx-Extended-MAPI-Wrapper 直到最近我开始在 Windows 10/Outlook 中遇到一些问题,电子邮件卡在发件箱中并且无法发送时才出现问题。 在 2009 年之后找不到解决方案或找到代码更新,所以我想我会尝试 PJ Naughter 包装器 http://www.naughter.com/cmapi.html

如果您通过此处描述的 reg 设置抑制 Outlook 警告,这可以正常工作:http://www.msoutlook.info/question/883

[附带问题:想知道 Dillbough MAPI 包装器如何避免这个问题,这是他明确提到的......

(I) 被提醒了可怕的 Outlook 安全警告。所以,我决定研究扩展的 MAPI。

]

所以我一切顺利,而且效果很好,但是 Naughter 包装器与 Dillbough 包装器相比缺少一个功能。 Naughter 包装器没有任何代码来检索默认电子邮件发件人地址。 Dillbough 包装器具有 GetProfileName 和 GetProfileEmail 函数,如果您继续,它们可以让您轻松找出发件人是谁。 我使用它进行检查,并希望将此功能添加到 Naughter 包装器中。

有人已经这样做了吗? 我试图将它添加到 PJ Naughter 包装器中,但我对 MAPI 的了解有限,而且我开始深入了解包装器的内部。 任何帮助或指向其他实现的指针表示赞赏...?


以下是更多详细信息: 在旧代码中,我调用了没有参数的 CMAPIEx::Login() 来登录到默认的 Outlook 配置文件(即使用空字符串作为配置文件)。 在内部这调用... MAPILogonEx(0, 0, NULL, MAPI_LOGON_UI | MAPI_USE_DEFAULT , &lpMAPISession); (这里讨论过C++ MAPI: MAPILogonEx, how to open default mail inbox?)。

然后,我只需将 GetProfileEmail 作为 lpMAPISession 函数调用,并可以将电子邮件地址作为 CString 进行检查。 我在 PJ Naughter 包装器中找不到等价物

【问题讨论】:

【参考方案1】:

您需要调用IMAPISession::QueryIdentity 来检索当前用户。您可以在OutlookSpy 中使用它 - 单击 IMAPISession,然后单击 QueryIdentity。

【讨论】:

听起来很有希望,但不清楚如何添加到现有的包装器中?在此处查看完整的 src 代码:naughter.com/cmapi.html 初始化代码 CMapi::CSession::Initialise 像这样选择 DLL 入口点... m_hMapi = LoadLibraryFromSystem32(_T("MAPI32.DLL")); m_lpfnMAPILogon = reinterpret_cast(GetProcAddress(m_hMapi, "MAPILogon")); m_lpfnMAPILogoff = reinterpret_cast ....有 MAPIQueryIdentity 吗?如何调用获取邮件发送地址字符串? MAPILogon 是简单的 MAPI。扩展 MAPI 使用 MAPILogonEx 是否有 MAPIQueryIdentity ?我尝试在那里添加与其他类似的 GetProcAddress,但它返回 NULL? 不,Simple MAPI 是一组 13 个函数 - msdn.microsoft.com/en-us/library/windows/desktop/… 那么有没有办法从 Simple MAPI 环境中获取 QueryIdentity?这两个包装器之间的主要区别似乎是 Dillbough 使用 Extended MAPI 而 Naughter 使用 Simple MAPI。所以似乎向 Naughter 包装器添加 QueryIdentity 调用可能需要几乎重写?

以上是关于C++ MAPI 包装器尝试在默认登录后获取发件人地址的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C++ dll 静态链接到 .NET 库(将 c++ dll 构建到网络包装器 dll 以获取一个 dll)

如何为在 C 中使用 C++ 代码创建包装器?

尝试通过 Process Pipe 发送/接收到 python 包装器,C++ 代码

通过 CLI 包装器在非托管 C++ 中使用 C#.NET Winform - 需要线程?

使用 SWIG 围绕 C++ 的 Python 包装器。参数类型无法识别

C# 包装器到 C++ 函数 - 运行一次,工作正常。运行两次,程序挂起