关于 .net:MAPI 和托管代码体验?

关于 .net:MAPI 和托管代码体验?

MAPI and managed code experiences?

官方不支持在托管代码中使用 MAPI 函数。显然,MAPI 使用自己的内存管理,它在托管代码中崩溃和烧毁(请参阅此处和此处)

我要做的就是启动带有主题、正文和一个或多个附件的默认电子邮件客户端。

所以我一直在研究 MAPISendDocuments,它似乎有效。但是我一直没有勇气在生产代码中实际使用该功能。

有人经常使用这个功能吗?你有什么恐怖故事吗?

PS。不,我不会使用附件的命令行参数 shellExecute Outlook.exe。

PPS。附件支持是一项要求,因此 Mailto: 解决方案不适合我。


有一个单独的帮助程序 EXE,它接受命令行参数(或管道到它的 StandardInput),它执行所需的操作并从您的主应用程序调用它。这将 MAPI 内容保留在您的主应用程序的进程空间之外。好的,您仍在混合 MAPI 和 .NET,但过程非常短暂。假设是 MAPI 和 CLR 开始导致运行时间较长的进程出现问题。

我们使用 Dmitry Streblechenko 出色的 Redemption Data Objects 库,它允许我们在 JScript 中编写这样的"shim"代码并调用它,这将 CLR 和 MAPI 世界保持在单独的进程中,但以受支持的方式。

@Chris Fournier 回复。编写非托管 DLL。这不起作用,因为问题是在同一进程中混合 MAPI 和托管代码。


MAPISendDocuments 已弃用,可能会被删除。
您应该改用 MAPISendMail。
请参阅简单 MAPI


调用进程。在 Mailto: 协议上启动(如下所示)将为您提供基本功能,但不提供附件。

您可以使用附件路径执行此方法,但此选项仅适用于某些旧版本的 Outlook,例如 98。我认为这是由于潜在的安全风险。

如果有人确实使用了 Outlook.exe,它将在 Outlook 2003(和 2007 取决于设置)下发出安全警告。


我已经使用 MAPISendMail 函数和几个内部类来package一些其他 MAPI 相关结构。只要这是唯一的用途,虽然不是微不足道的安全操作,但它是可能的,因为它需要非常密切关注各种非托管数据类型和内存分配/释放和 GC。虽然它仍然不受支持,但我在生产代码中使用它(虽然它尚未发布)。

当我向 Matt Stehle 询问此事时,我收到的回答是:

I really don't know of a much better way to do this and any issues you ran into here would be probably reproducible in a supported scenario (i.e. VB6 or unmanaged C++). Just know that if you ever ran into a scenario were an issue was caused specifically by this function being called from .NET that we wouldn't have any other recommendation for you then to not use .NET.

使用它并不是一件好事,但也不是说有任何其他选项可以从托管代码中实际执行此操作。


您还可以使用托管代码支持的 Outlook Redemption;我不确定它是否有一个简单的 MAPISendDocuments 替换,但如果您有问题,Dmitry 会很有帮助。

至于"崩溃和烧伤",这里是一位 MS 支持人员的另一句话,这里

It's the sort of thing that'll mostly work. It'll work while you're writing it. Then it'll work while you're testing it. It'll work while your customer is evaluating it. Then as soon as the customer deploys it - BAM! That's when it'll decide to start having problems. And Microsoft ain't gonna help you with it, since we told you not to do it in the first place. :)


您应该能够创建一个非托管 DLL 来使用 MAPI 执行您想要的操作,然后从您的托管代码中调用该 DLL。我不会编写一个直接的 MAPI package器,而是执行您需要的所有 MAPI 功能的东西,该 MAPI 包含在非托管 DLL 中。这可能是从托管代码中使用 MAPI 的最安全方式。


以下代码不使用 MAPI,但它会打开带有任意附件的"撰写邮件"窗口。

(实际上,它完全未经测试,但我在一个我认为有效的应用程序中挖掘了它)


对于有 MAPI 经验的人来说,与输入这篇文章并阅读响应(无意冒犯)相比,他们需要更少的时间来编写代码以从非托管代码(阅读:纯 C )中完全按照您的意愿行事。

你很幸运,你需要的功能是有限的。您只需要一个简单的 C 实用程序即可在命令行上获取所需的参数并发出正确的 MAPI 调用。然后,您可以从托管代码中获取所有这些实用程序,就像您要执行任何其他进程一样。

HTH


推荐阅读