Outlook Addin在离线模式下访问交换收件人?

时间:2009-09-10 21:21:12

标签: c# exchange-server outlook-addin outlook-redemption

我正在使用VS 2008和C#创建Outlook插件。为了运行此插件,使用Redemption遍历所有电子邮件并解析它。

我最近遇到了一个没有网络连接打开Outlook的问题(网络离线,拔掉电源,或像笔记本电脑一样移动,而且恰好没有连接)。这似乎是在获取收件人列表。

  
    System.Runtime.InteropServices.COMException (0x80040115): Error in IAddrBook::OpenEntry: MAPI_E_NETWORK_ERROR  
    Error: The connection to Microsoft Exchange is unavailable. Your network adapter does not have a default gateway.
    Component: Microsoft Exchange Address Book
        at Redemption.RDOAddressEntryClass.get_SMTPAddress()

这在以下代码中发生:

    /// <summary>
    /// Retrieves a list of recipient addresses from an RDOMail object
    /// </summary>
    /// <param name="rdoItem">The email to analyze</param>
    /// <returns>A list of e-mail addresses</returns>
    protected List<string> GetRecipients(RDOMail rdoItem)
    {
        RDORecipients recipients = rdoItem.Recipients;
        List<string> recipientList = new List<string>();
        if (recipients != null && recipients.Count > 0)
        {
            for (int i = 1; i <= recipients.Count; i++)
            {
                RDOAddressEntry addressEntry = recipients[i].AddressEntry;
                if (addressEntry != null)
                {
                    string recipient = addressEntry.SMTPAddress;
                    recipient = recipient.Trim();
                    if (recipient != null && recipient != String.Empty)
                    {
                        recipientList.Add(recipient);
                    }

                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(addressEntry);
                    addressEntry = null;
                }
            }
        }

        if (recipients != null)
        {
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(recipients);
            recipients = null;
        }

        return recipientList;
    }

所以问题是,如何获取电子邮件的收件人而无需对Exchange进行身份验证或解析,并且因为没有网络连接而导致死亡?

编辑:或者 - 有没有办法在Outlook中缓存smtp电子邮件地址,这样如果它以后脱机,它不必解析电子邮件地址?

2 个答案:

答案 0 :(得分:1)

我认为一些商店提供商是基础PST商店的包装。因此,在访问某些属性时,提供程序将尝试与远程服务器同步。您应该可以通过从提供程序中解开存储来阻止此操作。

注意:例如,向未拆包商店添加商品不应该保留对服务器的更改(如果是IMAP4)。

Redemption website

了解有关UnwrapStore属性的更多信息

答案 1 :(得分:1)

在大多数情况下,PR_SMTP_ADDRESS属性应该在收件人表中可用。您可以使用RDORecipient.Fields []访问该属性 - 没有理由使用RDORecipient.AddressEntry(这会导致Redemption调用IAddrbook :: OpenEntry,并且调用可能会在脱机模式下失败)。

使用OutlookSpy查看收件人表(单击IMessage,转至GetRecipientTable选项卡)以确保存在PR_SMTP_ADDRESS属性。