【问题标题】:Consistently retrieve "From" email addresses across Outlook versions跨 Outlook 版本一致地检索“发件人”电子邮件地址
【发布时间】:2008-09-21 21:25:23
【问题描述】:

我正在开发一个独立的 c# 桌面应用程序,该应用程序发送文档,然后在发回时从 Outlook 导入它们。应用程序从指定文件夹中提取电子邮件并对其进行处理,然后将发件人姓名和其他内容保存到数据库中。

这适用于具有 SenderEmailAddress 属性的 Outlook 2003 和 2007。但是 Outlook 2000 和 XP 没有此属性,并且不会始终返回 name@domain.com。我正在为这些版本提供支持。

我发现一个名为 Outlook Redemption 的库可以解决这个问题,但我正在使用 .net 进行开发,并且真的希望避免写入客​​户注册表。我还发现 MAPI33 是一个围绕 MAPI 的 .Net 包装器,但从论坛中不清楚它是否仍受支持。

如果有任何关于 Redemption dll 的 .Net 替代方案或能够在 Outlook 版本中一致地检索电子邮件地址的方法的任何指示。

非常感谢

AbsFabs

结语: 我最终使用了这篇文章http://support.microsoft.com/kb/324530 中的解决方案。它包括创建一个回复,然后将回复提取到创建的邮件项的地址。它适用于通过 Internet 发送的电子邮件,目前正在通过 Exchange Server 测试。

在我的旅行中也发现了这个http://anoriginalidea.wordpress.com/2008/01/11/getting-the-smtp-email-address-of-an-exchange-sender-of-a-mailitem-from-outlook-in-vbnet-vsto/ 它似乎涉及到一点点。如果我现有的实现无法通过测试,这可能包含我的 B 计划。

感谢您的反馈

AbsFabs

我最终使用了 Redemption。出色的工作工具。我的问题是在安装我的应用程序时必须注册 dll。由于我的应用程序是用 dotnet 编写的,因此不需要注册任何内容。我能够使用无注册表 COM 解决 dll 注册问题。

非常感谢您的启发。

【问题讨论】:

  • 澄清一下,您是否尝试为 Outlook 创建一个加载项来执行此任务?或者您正在创建一个独立的控制台/Windows 应用程序来完成这项工作?

标签: c# .net outlook ms-office


【解决方案1】:

我在 C# 生产代码中使用 Outlook Redemption 解决方案。它工作得很好。 有了它,您可以获取邮件消息 (IRDOMail) 的 SenderID,然后您可以使用 IRDOSession 对象的 GetAddressEntryFromID() 方法。

【讨论】:

    【解决方案2】:

    虽然在工作中遇到了类似的问题,但我们决定走 netMAPI 路线,这导致了一些问题。

    它的主要问题是 MAPI 管理自己的内存,.NET 也是如此,这意味着偶尔(我们有大约 300 人使用我们的内部软件)它会导致我们的应用程序崩溃,并生成 windows 的“报告错误”对话框而不是我们自己的错误跟踪对话框。这是由于两者相互覆盖了彼此的内存堆。

    由于我们必须使用交换服务器,所以我们做了一些研究,发现如果您在 VB6 应用程序中编写 MAPI 代码,它将有自己的内存空间,因此不会覆盖 .NET 堆。

    这是一种相当冗长的做事方式,但到目前为止我们没有遇到任何问题,我们的员工每天都会发送数百封(如果不是数千封)电子邮件。

    【讨论】:

      【解决方案3】:

      好消息是你在正确的轨道上追踪正确的接口。坏消息是 2000 和 XP 在 .NET 中的支持很差,因为它们出现在 .NET 之前,而且只有 2003 才真正努力让 COM 在 .NET 中运行。

      您对这些版本 2000 和 XP 的解决方案将包括您跟踪正确的 COM 接口并自行包装它们。对于这些版本的 Outlook,我不得不多次这样做,而且它从来都不漂亮。祝你好运。

      【讨论】:

        【解决方案4】:

        兑换无需在注册表中安装即可使用 - 您可以在 C#、VB.Net、Delphi 和 C++ 中使用RedemptionLoader

        //tell the app where the 32 and 64 bit dlls are located
        //by default, they are assumed to be in the same folder as the current assembly and be named 
        //Redemption.dll and Redemption64.dll.  
        //In that case, you do not need to set the two properties below
        RedemptionLoader.DllLocation64Bit = @"c:\SourceCode\Redemption\redemption64.dll";
        RedemptionLoader.DllLocation32Bit = @"c:\SourceCode\Redemption\redemption.dll";
        //Create a Redemption object and use it
        RDOSession session =  RedemptionLoader.new_RDOSession();
        session.Logon(Missing.Value, Missing.Value,  Missing.Value, Missing.Value, Missing.Value,  Missing.Value);
        

        【讨论】:

          【解决方案5】:

          我从未真正使用过这些,但您可以试试 Outlook Collaboration Data Objects (CDO)。它们曾经是可以与 Outlook 一起安装的附加组件,但现在它们是单独提供的。

          【讨论】:

            猜你喜欢
            • 2020-10-02
            • 2017-07-21
            • 1970-01-01
            • 2012-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多